我试图理解为什么结构填充是memcmp无法比较结构的原因。
关于结构填充,我不了解的一件小事是......
为什么要#34; a short be 2 byte aligned"
或"a long be 4 byte aligned"
。我理解它的大小,但为什么它们不会出现在任何字节边界?
或换句话说"why is 0x10004566 not a valid location for a long variable but 0x10004568 is?"
答案 0 :(得分:4)
因为某些平台(即CPU)在物理上不支持“错误对齐”的内存访问。其他平台支持它们,但速度要慢得多。
结构中的填充取决于编译器的选择,但它会做出这些选择,以满足代码所针对的CPU的特定要求。
答案 1 :(得分:3)
在优化程序以提高速度时,内存对齐是一个非常重要的问题。 C,作为一种语言 - 通常 - 强调速度,喜欢执行一些可能使程序更快的规则。
对齐和未对齐的内存访问的限制直接来自用于从内存中获取数据的硬件,这些硬件通常以大小等于机器字的块来获取它。假设您想要访问存储在位置101的双字(4字节)。这意味着存储器控制器首先必须(可能)在位置100处发出双字读取,然后在位置104处再读取双字,并且然后将来自位置101,102,103和104的各个字节拼接在一起。整个操作需要(假设)两个时钟周期。
如果您想访问位置100的双字,那么就没有这样的问题,我应该通过我提供的示例清楚地说明这一点。
事实上,未对齐的数据访问是SSE指令("对齐的"版本,还有"错位"版本不能做到这一点)的一个大问题如果您尝试使用这些数据访问未对齐的数据,将导致一般性保护错误。
根据经验,在4字节边界上对齐4字节数据,在8字节边界上对齐8字节数据等等,这绝不会让人痛苦。
答案 2 :(得分:1)
关于对齐,我能想到的另一个例子是数据传输,数据传输(取决于体系结构)以32字节为单位,例如,如果您的数据跨越边界,则可能需要2次传输接收数据,而不是1。