gpt4 book ai didi

C++ 专家 : is the offset of a member variable to its class constant under these conditions?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:56 25 4
gpt4 key购买 nike

给定 FooClass* 类型的变量 foo 和该类中名为 bar 的成员变量,是 foo 之间的距离&(foo->bar) 在有一些约束的任何情况下都是一样的:

  1. FooClass 是非 POD 类型。

  2. 我们知道 foo 将始终指向 FooClass 的实例,而不是它的某个子类型。

  3. 我们只关心单一编译器和单一编译下的行为;也就是说,在 gcc 下这可能导致的值永远不会在用 MSVC 编译的代码中使用,并且永远不会保存以在编译之间重新使用。它在二进制中计算并在二进制中使用,仅此而已。

  4. 我们不使用自定义 new,尽管该类的一些实例可能是堆栈分配的,一些是堆分配的。

  5. 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com