以下代码(online version)基于本书的第3.4节"在C ++对象模型内部"作者:Stanley Lippman(参见硬拷贝的第85-86页或PDF version的第64页)。
#include <iostream>
#include <cstddef> // defines offset
struct Base
{
int w;
char x;
};
struct Derived1 : Base
{
char y;
};
struct Derived2 : Derived1
{
char z;
};
int main()
{
std::cout << "sizeof(Base) = " << sizeof( Base ) << "\n";
std::cout << "sizeof(Derived1) = " << sizeof( Derived1 ) << "\n";
std::cout << "sizeof(Derived2) = " << sizeof( Derived2 ) << "\n";
std::cout << "Offset of x in Derived2 = " << offsetof( Derived2 , x) << "\n";
std::cout << "Offset of y in Derived2 = " << offsetof( Derived2 , y) << "\n";
std::cout << "Offset of z in Derived2 = " << offsetof( Derived2 , z) << "\n";
}
根据文本Derived2假定(?)大小为16字节(假设32位机器)但是在gcc上我得到12个字节。在Visual Studio上,它的大小正确(?)报告为16个字节。这是一个gcc回归错误还是这个标准没有定义的东西?
修改
Stanley Lippman NOT 使用offsetof
宏。那是我的行为。
答案 0 :(得分:2)
宏offsetof
只能用于标准布局类型。由于Derived1
和Derived2
都没有标准布局,因此您的行为未定义。
除此之外,C ++标准对非静态数据成员的布局没有任何特别的承诺,因此如果一个布局与您对另一个布局的期望不符合,那么它实际上并不是“错误”。 / p>