2012-01-17 146 views
2

我试图理解为什么结构填充的原因是结构不能memcmp进行比较。我不明白约结构填充 一个小事情是这样的...... 为什么要“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?"

+1

如果你一路走向零,从0x10004566开始,你可以放4个字节的第一个位置是0x00000002,从而“浪费”2个字节的存储器(字节0x00000000和0x00000001)。 – pmg 2012-01-17 23:56:09

+0

有道理。但是与附加填充(发生很多次)相比,不足2个字节的空间足够小。 – 2012-01-18 00:01:42

+5

想象一下,你想购买电池。他们进来8包,但你只需要7 ...所以你打开数据包,并删除1.下一次你想要另一个7 ...所以你拿剩下的1,打开另一个包,并删除2.和等等...现在想象你得到8并且扔掉1。下一次你得到另一个8并扔掉另一个,...... ---字节比电池便宜:) – pmg 2012-01-18 00:16:21

回答

3

内存对齐是一个很重要的问题,优化速度的程序时。 C,是一种语言 - 一般 - 着重强调速度,喜欢执行一些规则可能使程序速度更快。

的对齐和未对齐的内存的限制访问来自用于从存储器,其通常取它在组块,其等于在尺寸机器字获取数据的硬件直接来自。假设你要访问存储在位置101一个双字(4个字节),这意味着内存控制器将首先必须在位置100,然后又在位置104一个双字的读(可能)发出一个双字的读,和然后将来自位置101,102,103和104的各个字节拼接在一起。整个操作需要(假设)两个时钟周期。

如果你想在位置100访问一个双字,有没有这样的问题,应该由我提供的例子来说明不够清楚。

实际上,未对齐的数据访问是一个如此大的问题,以至于如果您尝试访问SSE指令(“对齐”版本,也有“未对齐”版本,则不会这样做)会导致一般性保护错误与这些数据错位。作为一个经验法则,从4字节边界上的4字节数据,8字节边界上的8字节数据等等对齐,从不会感到痛苦。

4

因为某些平台上(即CPU)的物理不支持“未对齐”的内存访问,其他平台都支持他们,但在慢得多的方式。

你在结构中获得的填充取决于你的编译器做出的选择,但它会做出这些选择以满足代码针对的CPU的具体要求。

1

关于对齐方式,我能想到的唯一附加示例是数据传输,数据传输(取决于体系结构)例如以32字节为单位,例如,如果数据跨越边界,则可能需要2转移到接收数据,而不是1