单个继承派生类的大小

时间:2016-07-11 10:01:05

标签: c++ visual-studio inheritance gcc

以下代码(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宏。那是我的行为。

1 个答案:

答案 0 :(得分:2)

offsetof只能用于标准布局类型。由于Derived1Derived2都没有标准布局,因此您的行为未定义。

除此之外,C ++标准对非静态数据成员的布局没有任何特别的承诺,因此如果一个布局与您对另一个布局的期望不符合,那么它实际上并不是“错误”。 / p>