c++ - 是否存在 "int"会导致结构填充的环境?

标签 c++ memory int alignment

具体来说,这是在讨论中提出的:

Memory consuption wise, is there a possibility that using a struct of two ints take more memory than just two ints?

或者,在语言方面:

#include <iostream>

struct S { int a, b; };

int main() {
    std::cout << (sizeof(S) > sizeof(int) * 2 ? "bigger" : "the same") << std::endl;
}

是否有任何合理的1(不一定是常见的或当前的)环境可以让这个小程序打印更大的

1澄清一下,我在这里的意思是系统(和编译器)以某种有意义的数量开发和生产,而不是仅仅为了证明这一点而构建的理论示例,或一次性原型(prototype)或业余爱好者的创作。

最佳答案

Is there any reasonable (not necessarily common or current) environment where this small program would print bigger?

我不知道。我知道那是 not completely reassuring ,但我有理由相信由于 C++ 标准的要求,没有这样的环境。

在符合标准的†编译器中,以下保持:

  • (1) 数组元素之间不能有任何填充,因为它们可以通过指针访问 ref ;
  • (2) 标准布局结构在每个成员之后可能有也可能没有填充,但没有在开头,因为它们与“更短”但相等的标准布局结构在布局上兼容<支持> ref ;
  • (3) 数组元素和结构成员正确对齐 ref ;

从 (1) 和 (3) 可以看出,类型的对齐小于或等于其大小。如果它更大,则数组将需要添加填充以使其所有元素对齐。出于同样的原因,类型的大小始终是其对齐方式的整数倍。

这意味着在一个给定的结构中,第二个成员将始终正确对齐 - 无论 int 的大小和对齐方式如何 - 如果放置在第一个成员之后,即不需要间隙填充。在这种布局下,结构体的大小也已经是其对齐方式的倍数,因此也不需要尾部填充。

没有我们可以选择的符合标准的(大小、对齐)值集使该结构需要任何形式的填充。

任何这样的填充都需要不同的目的。然而,这样的目的似乎难以实现。假设有一个环境出于某种原因需要这个填充。无论填充的原因是什么,它可能‡也适用于数组的情况,但从(1)我们知道它不能。

但是假设这样的环境确实存在,并且我们需要一个 C++ 编译器来支持它。它可以通过简单地使 int 变得更大,即通过将填充 inside int 来支持数组中这种额外需要的填充。反过来,这将再次允许结构与两个 int 大小相同,并且让我们没有理由添加填充。


† 一个编译器——即使是一个不符合标准的编译器——如果出现任何这些错误,都可以说是有问题的,所以我会忽略这些。

‡ 我猜想在数组和结构是基元的环境中,可能存在一些潜在的区别,允许我们拥有未填充的数组和填充的结构,但同样,我 don't know of any such thing正在使用中。

关于c++ - 是否存在 "int"会导致结构填充的环境?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46037465/

相关文章:

c++ - 如何向内置类/类型添加更多函数,如 int、double、std::string 等

c++ - 在标题栏中添加一个按钮

objective-c - 将单词列表字典加载到数组中的最快方法?

C++删除动态分配内存的问题

C:通过指针访问第二个 argv

c++ - cpp中优先级队列的自定义运算符

c++ - 运算符重载 "operator T * ()"产生比较运算符?

Golang 从内存中的二进制数据执行子进程

java - 从整数中截取数字

java - "error: int cannot be dereferenced"尝试从 array.length 中减 1