假设我有一个结构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
依赖于编译器内部,尽管某些类型的成员的偏移量是常量表达式。