对于同一对象的多个实例,成员变量是否以相同的偏移量存储



假设我有一个结构Foo:

struct Foo
{
char a;
int b;
} Foo1, Foo2;

编译器可以插入填充,以便Foo::a存储在对象内存的开头,Foo::b存储在0x04的偏移量处(例如,在32位系统上(。

如果我创建这个对象Foo1和Foo2的多个实例,它们是否总是具有相同的填充?例如,是否存在Foo1::b存储在偏移量0x04处,Foo2::b存储于偏移量0x08处的情况?

对于同一对象的多个实例,成员变量是否存储在同一偏移量?

是。

如果我创建了这个对象Foo1和Foo2的多个实例,它们是否总是有相同的填充?

是。

例如,是否存在Foo1::b存储在偏移量0x04处,Foo2::b存储于偏移量0x08处的情况?

否。


此假设仅适用于程序。在另一个系统上编译程序,偏移量可能会有所不同。

考虑offsetof:

#define offsetof(type, member) /*implementation-defined*/

offsetof扩展为类型为std::size_t的整数常量表达式,其值是从从指定类型的对象开始到其指定的子对象,包括衬垫(如果有的话(。

offsetof依赖于编译器内部,尽管某些类型的成员的偏移量是常量表达式。

最新更新