【发布时间】:2018-10-27 02:20:03
【问题描述】:
计算机系统:程序员的视角说
x86-64 硬件无论对齐方式如何都可以正常工作 数据。但是,英特尔建议对齐数据以提高内存 系统性能。他们的对齐规则是基于原则 任何 K 字节的原始对象必须有一个地址 K 的倍数。 我们可以看到这条规则导致以下结果 对齐方式:
K Types 1 char 2 short 4 int, float 8 long, double, char *
为什么“任何 K 字节的原始对象的地址必须是 K 的倍数”?
“对齐”是如何定义的或者是什么意思?
在 x86-64 机器上,
如果一个对象有 K 个字节(例如 K=2(例如 short)或 K=4(例如 int 或 float)),“任何 K 字节的原始对象的地址必须是倍数of K”表示这样的对象必须有一个是K的倍数的地址。但是对象不是对齐的,只要它的存储空间完全落在两个连续的8的倍数的地址之间,这是一个小于比对象的地址必须是 K 的倍数更严格的要求吗?
如果对象的 K 小于 8 但不等于 1、2 或 4,“任何 K 字节的原始对象的地址必须是 K 的倍数”是否仍然适用?例如,如果 K=3、5、6 或 7?
在具有 32 位地址的 X86 机器上,
- 什么是对齐规则,“任何 K 字节的原始对象的地址必须是 K 的倍数”是否仍然适用?
谢谢。
【问题讨论】:
-
如果
int存储为(为简单起见)地址 0x3,您认为它是对齐的,因为它将包含 0x3 到 0x6(包括 0x3 到 0x6),而不跨越 0x0 或 0x8?那是怎么对齐的?如果您有一组所说的ints,您认为在这种情况下会发生什么。现在第二个是未对齐的(根据您的定义),因为它跨越 0x7 和 0x8。对齐的定义允许数组的一半索引对齐,而另一半未对齐,并且在生成它时不涉及奇怪的 hijink,这是一个奇怪的定义。 -
@ShadowRanger 谢谢。 (1)如果一个物体的K小于8但不等于2或4怎么办?例如,如果 K=6, 5? (2)在X86机器上,对齐规则是什么,“任何K字节的原始对象必须有一个K的倍数的地址”是否仍然适用?
-
@Ben 你知道大小为 3、5、6、7 的 primites 类型有哪些?
-
@Ben:对于#2,x86 非常乐意访问未对齐的内存,只是速度会变慢。据我所知,x86 上唯一需要的时间对齐是为了硬件原子支持等,否则如果您不喜欢不必要的慢代码,这只是一个好主意。但是,是的,除了不对齐的访问只是不可取的,而不是致命的,x86 在什么构成“对齐”数据方面遵循相同的规则。
-
@ShadowRanger 在 x86 上,当且仅当其地址是 4 字节(地址大小)或 8 字节(根据相同的对于 x86-64,规则“任何 K 字节的原始对象的地址必须是 K 的倍数”)?
标签: c memory-alignment