为什么结构大小与项目大小的普通总和不匹配?
Why struct size do not match with plain sum of item's sizes?
对于 C/C++ 结构,通常,最终结构的大小是其所有元素大小的普通总和,但在某些情况下并非如此。
我正在研究为什么以下结构的大小不等于其所有成员的大小的技术答案(它必须是之一):
#include <iostream>
struct {
int a;
long b;
char c;
} typedef MyStruct;
int main() {
MyStruct sss;
std::cout << "Size of int: " << sizeof(int) << std::endl << "Size of long: " << sizeof(long) << std::endl << "Size of char: " << sizeof(char) << std::endl;
std::cout << "Size of MyStruct: " << sizeof(sss) << std::endl;
return 0;
}
Thas 具有以下输出:
Size of int: 4
Size of long: 8
Size of char: 1
Size of MyStruct: 24
所以可以看出,MyStruct
的大小不是4+8+1 (13)
而是,它实际上是24
,但为什么呢?
因为 C 允许编译器在struct
元素之间添加填充,以使生成的代码性能更高。
当多字节数据放置在可被数据大小整除的内存地址时,某些硬件允许更快地访问多字节数据。例如,当int
位于地址 0x8004
或 0x8008
时,访问 32 位int
的速度可能比同一int
位于地址0x8003
或0x8006
时快得多。该标准允许编译器调整struct
成员的偏移量以利用此类优化。
此外,在某些平台中,访问与内存空间不一致的多字节值会导致错误:例如,从 68000 架构中的奇数地址读取 16 位int
会触发总线错误。编译器知道这一点,他们会向struct
添加未使用的空间,以便访问多字节字段不会触发错误。
相关文章:
- Qt SQLite没有查询或参数计数不匹配
- 模板参数推导失败,函数参数/参数不匹配
- 在使用累加时,C++中的运算符+不匹配
- C++ 与操作员不匹配<<
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 与'operator='不匹配(操作数类型'String'且"void")
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- C4018:类内有符号、无符号不匹配
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 为什么我收到错误:"运算符<<不匹配?
- RE2 不匹配非 ASCII 字符
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- COM 互操作结构定义与内存布局不匹配
- 我得到"将值分配给结构数组 iin 时与'operator='不匹配C++
- 错误:"运算符="不匹配 |结构返回类型
- 警告MSB3270:项目的处理器体系结构之间的不匹配
- 为什么结构和工会之间的规模不匹配
- 为什么结构大小与项目大小的普通总和不匹配?
- 与结构sockaddr_in调用不匹配