gpt4 book ai didi

c++ - 结构体的 sizeof 会受到数组元数据的影响吗?

转载 作者:行者123 更新时间:2023-11-30 20:50:35 31 4
gpt4 key购买 nike

关于 structsizeof(不)等于 sizeof 的总和,存在许多问题它的元素。通常这是由于数据对齐造成的。这个问题与数据对齐无关,因此请假设所有类型的大小都是对齐的倍数(例如 4B)。

如上所述here ,分配数组将导致存储一些有关分配数组大小的元数据。假设我们有以下代码:

const int size = 10;

struct X {
int someInt;
int array[size];
};

struct Y {
int someInt;
T array[size];
};

由于大小在编译时已知,编译器应该足够聪明,可以确定在的情况下不需要存储任何元数据>X。即使在 Y 的情况下,编译器可能足够聪明来遵循这个推理(这里 C 和 C++ 之间可能存在差异,因为在 C++ 中存在额外的要求为 T 的各个实例调用析构函数)。

我的问题是:我是否保证 sizeof(X) == (size + 1) * sizeof(int) 或者它是特定于编译器的?或者更一般地说,是 sizeof(Y) == size * sizeof(T) + sizeof(int)

<小时/>

编辑: 希望能澄清一下:问题是关于 C 和 C++ 的。另外问这个问题的最初动机也是这个。如果我运行

X *foo = new X[100];

或者它在代码中的某个地方相当于 C 语言,它会创建一个连续大小为 100 * (size + 1) * sizeof(int) 的内存块吗?

最佳答案

常见实现中的 C 数组不存储其周围的任何元数据,但是,可以将填充添加到结构中,以便 a_struct_ptr + 1a_struct 具有足够的对齐。

对于第一个结构体 ({ int someInt; int array[size]; }),不需要填充,因此

sizeof(X) == (size + 1) * sizeof(int)

应该成立(不过,我认为编译器没有义务保证它)。

对于第二个结构体,Tint 的对齐要求可能会导致向结构体添加填充,这将使您的方程无效。

关于c++ - 结构体的 sizeof 会受到数组元数据的影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43216468/

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