我知道效率需要变量对齐。我没有得到的是如何确定对齐的正确大小。根据我的理解,对齐值应始终设置为处理器的字大小(即32位机器上的4个字节和64位机器上的8个字节。)无论数据类型如何,因此处理器读取与地址对齐变量。
例如,为什么会有人做this之类的事情。我知道这只是某些编程书中的一个问题。使用不同的对齐值(例如链接中的对齐值)是否有意义?
答案 0 :(得分:3)
基本规则:数据类型应该是原生对齐的。对齐应与存储类型所需的字节数相同(向上舍入为2的幂),例如:
type size align (bytes)
char 1 1
short 2 2
int 4 4
float 4 4
int64_t 8 8
double 8 8
long double (x87, 80 bit) 10 16
_float128 16 16
int128_t 16 16
某些架构,例如SPARC禁止数据访问,如果它没有对齐4个字节,那么单个字符串将具有4字节对齐,即使在允许这种行为的体系结构上,访问以这种对齐方式存储的数据也会更快;因此,如果你有不同大小类型的混合,堆栈和结构域上的局部变量通常都有填充来实现这一点,尽管如果需要可以改变这种行为。
缓存更快,对齐不仅仅是字大小(不是32位和64位,而是在高速缓存行大小,例如16字节或32字节或64字节)。
一些更广泛的指令,如SSE2(128位宽)或双浮点(64位宽)更快(或有时不起作用)对齐原始宽度(如果需要加载128位数据,则应将其与128位对齐) )。
DMA和内存分页需要更多的对齐,但这通常是通过指针操作获得的。
由于非常宽的DDR总线和GPU核心内存访问限制,OpenCL(GPGPU)有时需要大量对齐:http://www.khronos.org/registry/cl/sdk/1.1/docs/man/xhtml/attributes-variables.html/* a has alignment of 128 */
__attribute__((aligned(128))) struct A {int i;} a;