我试图找出我的64位计算机(Intel iCore7上的Win10)上的对齐方式。我想到了这个实验:

void check_alignment(char c1, char c2 )
{
   printf("delta=%d\n", (int)&c2 - (int)&c1); // prints 4 instead of 8
}

void main(){
    check_alignment('a','b');
}


我期待delta=8。由于它是64位计算机,因此char c1char c2应该存储为8的倍数。不是吗?

即使我们假设编译器已经进行了优化,以将它们存储在更少的空间中,为什么还不直接将它们存储回delta=1呢?为什么要进行4字节对齐?

我对float类型重复了上述实验,但仍然给出了delta=4

void check_alignment(float f1, float f2 )
{
   printf("delta=%d\n", (int)&c2 - (int)&c1); // prints 4
}

void main(){
    check_alignment(1.0,1.1);
}

最佳答案

要确定C实现中最大的基本对齐方式,请使用:

#include <stdio.h>
#include <stddef.h>

int main(void)
{
    printf("%zd bytes\n", _Alignof(max_align_t));
}


要确定任何特定类型的对齐要求,请用该类型替换上面的max_align_t

对齐并非纯粹是处理器或其他硬件的功能。硬件可能支持具有不同性能影响的对齐或不对齐访问,并且某些指令可能支持不对齐访问,而另一些则不支持。特定的C实现可能会选择是否需要某些对齐方式,以及选择使用还是不使用各种指令。此外,在某些硬件上,操作系统可以配置是否支持不对齐访问。

关于c - 在64位计算机上的对齐不是8个字节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51622751/

10-16 11:55