C 属性中的x应该是什么?(对齐(x)))

C 属性中的x应该是什么?(对齐(x))),c,gcc,attributes,C,Gcc,Attributes,我明白了,为了提高效率,变量对齐是必要的。我不知道的是如何确定对齐的正确大小。根据我的理解,对齐值应始终设置为处理器的字大小(即32位机器上为4字节,64位机器上为8字节),而不考虑数据类型,以便处理器读取与变量的地址对齐 例如,为什么有人会做这样的事情。我明白这只是一些编程书中的一个问题。使用不同的对齐值(如链接中的对齐值)有意义吗?基本规则:数据类型应为本机对齐。对齐方式应与存储类型所需的字节相同(四舍五入到2的幂),例如: 一些体系结构,例如SPARC,如果数据未按4字节对齐,则禁止数据访

我明白了,为了提高效率,变量对齐是必要的。我不知道的是如何确定对齐的正确大小。根据我的理解,对齐值应始终设置为处理器的字大小(即32位机器上为4字节,64位机器上为8字节),而不考虑数据类型,以便处理器读取与变量的地址对齐


例如,为什么有人会做这样的事情。我明白这只是一些编程书中的一个问题。使用不同的对齐值(如链接中的对齐值)有意义吗?

基本规则:数据类型应为本机对齐。对齐方式应与存储类型所需的字节相同(四舍五入到2的幂),例如:

一些体系结构,例如SPARC,如果数据未按4字节对齐,则禁止数据访问,因此单个字符将具有4字节对齐,即使在允许这种行为的体系结构上,也可以更快地访问以这种对齐方式存储的数据;因此,如果混合使用大小不同的类型,则堆栈和结构字段上的局部变量通常会有填充来实现这一点,尽管如果需要,可以改变这种行为

缓存速度更快,对齐的不仅仅是字大小(不是32位和64位,而是缓存线大小,例如16字节或32字节或64字节)

一些更宽的指令,如SSE2(128位宽)或双浮点(64位宽)对于对齐本机宽度更快(或有时不起作用)(如果需要加载128位数据,应将其对齐到128位)

DMA和内存分页需要更多的对齐,但这通常是通过指针操作实现的

由于非常宽的DDR总线和GPU核心内存访问限制,OpenCL(GPGPU)有时需要大量对齐:


您还可以使用
\uuuu属性(aligned(4096))
来对齐页面边界上的内容…Chris Dodd,不。不是所有编译器都能处理如此大的对齐,所以最好使用
memalign
我不明白为什么数据类型应该与原生对齐。原生对齐是一些编译器的默认模式,CPU体系结构可以额外限制这一点(需要对某些数据进行一些对齐)。这是来自MSVC的页面,两种对齐方式的威力非常罕见,而且不受广泛支持。
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
/* a has alignment of 128 */
 __attribute__((aligned(128))) struct A {int i;} a;