- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
给定 FooClass*
类型的变量 foo
和该类中名为 bar
的成员变量,是 foo 之间的距离
和 &(foo->bar)
在有一些约束的任何情况下都是一样的:
FooClass
是非 POD 类型。
我们知道 foo
将始终指向 FooClass
的实例,而不是它的某个子类型。
我们只关心单一编译器和单一编译下的行为;也就是说,在 gcc 下这可能导致的值永远不会在用 MSVC 编译的代码中使用,并且永远不会保存以在编译之间重新使用。它在二进制中计算并在二进制中使用,仅此而已。
我们不使用自定义 new
,尽管该类的一些实例可能是堆栈分配的,一些是堆分配的。
FooClass
没有明确的ctor
;它依赖于编译器生成的(FooClass
中的每个字段都是 POD 或默认可构造的)。
我无法在标准中找到这方面的任何保证(我也没有想到),但我对 gcc 的初步测试让我相信它永远都是这样。我也知道此保证是针对 POD 类型的,但让我们假设此类型不能是 POD。
更新/澄清:这只是针对单个二进制文件的单个编译;计算出的偏移量永远不会离开那一次执行。基本上,我希望能够在静态映射中唯一标识一个类的字段,然后能够在该映射中查找一些宏/模板/EVIL 技巧。这仅供我自己娱乐,任何生命支持机器都不会依赖此代码。
最佳答案
编译程序后,是*。
偏移量将保持不变。
然而,有一个非常重要的限制:foo 必须专门指向一个 FooClass 对象。不是从 FooClass 派生的类,也不是与此相关的任何其他类。
C++ 对成员偏移量进行 POD 区分的原因是因为多重继承和 vtable 指针的位置(或缺少)都可能导致对象的地址与该对象的基址地址不同的情况.
关于C++ 专家 : is the offset of a member variable to its class constant under these conditions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/382480/
我是一名优秀的程序员,十分优秀!