【发布时间】:2012-04-01 07:45:08
【问题描述】:
我有一个关于 C 语言结构的结构填充和内存对齐优化的问题。我正在通过网络发送一个结构,我知道,出于运行时优化的目的,结构内的内存不是连续的。我已经在本地计算机上运行了一些测试,实际上 sizeof(my_structure) 与我所有结构成员的总和不同。我进行了一些研究以找出两件事:
首先,sizeof() 运算符检索结构的填充大小(即将存储在内存中的实际大小)。
在声明中指定 __attribute__((__packed__)) 时编译器禁用了此优化的结构,因此 sizeof(my_structure) 将与我的结构的字段总和完全相同。
话虽如此,我想知道sizeof 运算符是否在每个编译器实现和每个架构上都获得了填充大小,换句话说,使用memcpy 复制结构是否总是安全的,例如使用sizeof 运算符如:
memcpy(struct_dest, struct_src, sizeof(struct_src));
我也想知道 __attribute__((__packed__) 的真正目的是什么),它是用于在提交结构时在网络上发送不太重要的数据量,还是实际上用于避免一些未指定和平台相关的sizeof 操作员行为?
提前致谢。
【问题讨论】:
-
如果
sizeof坏了,我们就完蛋了。幸运的是,它不是 - 最糟糕的是,一个本科生在五周内编写的一些半途而废的编译器无法正确实现它。
标签: c memory-management sizeof