5

也就是说,编译器用来生成类的标准是什么?例如,假设我有一个C包含成员xy和的类z,并且我想知道z该类中的偏移量。我可以像结构一样将其他成员的数据类型大小相加吗?

4

7 回答 7

8

你不能。
编译器可以根据自己的选择自由对齐成员。这是编译器的实现细节。

如果您正在使用POD,那么您可以使用offsetof宏。

但是如果使用Non-POD,那么我想不会有任何便携式方法可以这样做。

于 2011-07-13T16:43:22.013 回答
4

您可以在类的方法中以编程方式执行此操作。不通用但有效。

offset = (unsigned char*)&(this->z) - (unsigned char*)this;

完整的工作示例

#include <iostream>

class C
{
public:
    int x;
    char y;
    int z;
    size_t offset() const
    {
        return (unsigned char*)&(this->z) - (unsigned char*)this;
    }
};

int main()
{
    C c;
    std::cerr << "Offset(cast): " << c.offset() << "\n";
}
于 2011-07-13T16:55:30.583 回答
2

您可以通过使用示例对象计算偏移量来做到这一点。(见@bert-jan 或@sodved 的回答)。

然而,这很危险! 您不能将 c++ 类和结构视为您想象的常规结构。

问题是,对于任何给定的指向对象的指针,偏移量可能不同!

为什么?由于子类化和多重继承,附加数据可能会放在类中常规结构成员之前。数据量可能因类的每个不同子类而异。


看到这个问题:为什么不能在 C++ 中的非 POD 结构上使用 offsetof?更多细节。

于 2011-07-13T16:57:02.473 回答
1

你可以&(class_name::member_name)用来获得抵消。

于 2012-11-17T09:50:10.297 回答
0

你试过offsetof()吗?

http://www.cplusplus.com/reference/clibrary/cstddef/offsetof/

于 2011-07-13T16:43:39.140 回答
0

绝对不符合标准。不过,有一些编译器特定的解决方案可以帮助您推断它。

微软有这个:

#pragma pack(push,1)
struct Foo {
  uint8 a;
  uint32 b;
};
#pragma pack(pop)

我可以转达(仅通过传闻)GCC 也通过扩展支持此功能。

于 2011-07-13T17:12:48.183 回答
-1
    #define _OFFSET(p_type, p_member) (size_t)(&((p_type *)NULL)->p_member)

    struct a
   {
       int a, b;
   };

   cout << _OFFSET(struct a, b); // output is your offset
于 2011-07-13T16:48:12.493 回答