gpt4 book ai didi

c++ - 单个继承的派生类的大小

转载 作者:行者123 更新时间:2023-11-28 02:04:01 25 4
gpt4 key购买 nike

以下代码 ( online version ) 基于斯坦利·李普曼 (Stanley Lippman) 的书“Inside the C++ Object Model”中的第 3.4 节(参见硬拷贝的第 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 没有使用 offsetof 宏。那是我做的。

最佳答案

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

除此之外,C++ 标准没有对非静态数据成员的布局做出任何特别的 promise ,因此如果一个布局与您对另一种布局的期望不符,这并不是真正的“错误”。

关于c++ - 单个继承的派生类的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38304106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com