我试图找出我的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 c1
和char 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/