__attribute__中应该是什么x((aligned(x)))

时间:2011-08-04 17:14:50

标签: c gcc attributes

我知道效率需要变量对齐。我没有得到的是如何确定对齐的正确大小。根据我的理解,对齐值应始终设置为处理器的字大小(即32位机器上的4个字节和64位机器上的8个字节。)无论数据类型如何,因此处理器读取与地址对齐变量。

例如,为什么会有人做this之类的事情。我知道这只是某些编程书中的一个问题。使用不同的对齐值(例如链接中的对齐值)是否有意义?

1 个答案:

答案 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;
相关问题