C++ 编译器对齐 - 仅字符无填充

标签 c++ visual-c++ compiler-construction padding memory-alignment

在 VC++ 上,为什么编译器只在使用非字符数据类型时填充结构?

struct TEST
{
   char a[7];
};

struct TEST2
{
   __int32 a;
   char b[7];
};

sizeof(TEST); // Returns 7
sizeof(TEST2); // Returns 12

最佳答案

归根结底是 sizeof(char) == 1 —— 始终如此。

数组必须是连续的,因此在一个 char 数组中(如果它足够大),您最终会在所有可能的对齐方式中得到元素。由于编译器/硬件必须使其工作,因此不能需要插入填充来处理 char 之类的东西struct 任一个。

现在,这并不是说编译器不能插入填充。例如,即使使用 char 数组,它也可以通过这样做来提高性能。例如,给定您的 struct 定义,编译器完全可以接受将 7 个字符的数组再填充一个,使结构的大小为 8 —— 一个漂亮、简洁的 2 的幂。

在某些硬件上,您可能会看到它。碰巧的是,VC++ 支持的 Intel 硬件并没有真正从类似的东西中受益,所以你不太可能在那里看到它。

关于C++ 编译器对齐 - 仅字符无填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11043486/

相关文章:

c++ - Qt - 记住最后检查的单选按钮

c++ - 向此正则表达式添加最少字符

c++ - 将文件重定向到标准输入时 getline 导致无限循环

c++ - 非双字对齐像素到双字对齐位图

c++ - 使用单例创建对话框

python - 寻找 Psyco 的良好替代品(Python->C 编译器)

c++ - 删除锁定的互斥量

c++ - Visual C++ 2017错误?编译器优化表达式

iphone - Objective C iPhone 应用程序的编译器是否删除了注释?

java - 快速 Java 优化问题