【问题标题】:is a pointer to data member its offset?指向数据成员的指针是它的偏移量吗?
【发布时间】:2012-02-22 10:44:09
【问题描述】:

我是否可以安全地假设数据成员 (offsetof(mystruct, myfield)) 的偏移量在数值上等于使用 &mystruct::myfield 检索到的成员指针的原始值,还是依赖于实现?

【问题讨论】:

  • 不应该这样假设。您忘记了编译器可能会插入用于管理为对象分配的内存的开销(内存)。
  • 一个更好的问题是:既然您知道这两种形式,为什么要使用指向成员的指针? :)
  • 我实际上正在考虑使用指向成员的指针,因为我的程序使用 offsetof 做了一些低级技巧,我想将它们“提升”为更标准的形式。
  • 从这里的第 7 页:agner.org/optimize/calling_conventions.pdf "Borland 编译器将偏移量 1 添加到数据成员指针,以便区分指向第一个数据成员的指针和 NULL 指针,由 0 表示。另一个编译器没有偏移,但用值 -1 表示 NULL 数据成员指针。”所以有一个非常具体的例子说明你什么时候不能依赖它,以防你想知道这是否只是学术性的。

标签: c++ member-pointers offsetof


【解决方案1】:

没有;没有指定成员指针的实现,也没有定义转换来获取“原始”值。

【讨论】:

    【解决方案2】:

    形式上,它当然是依赖于实现的。是的,在现实生活中,指向数据成员指针的最流行的实现是(或基于)计划和简单的偏移量,即 offsetof 评估的相同。

    一些实现使用精确的偏移量,使用0xFFF... 模式来表示空指针值。一些实现为空指针值保留0x000... 模式,同时将所有“非空”偏移量增加1

    【讨论】:

      猜你喜欢
      • 2011-08-02
      • 2013-03-09
      • 1970-01-01
      • 2019-06-23
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      相关资源
      最近更新 更多