我听说对齐 int 的读取和写入是原子且安全的,我想知道系统何时使非 malloc 全局变量不对齐,而不是打包结构和强制转换/指针算术字节缓冲区?
[X86-64 linux] 在我所有的正常情况下,系统总是选择不会被撕裂的整数位置,例如,一个字上的两个字节,另一个字上的另外两个字节。任何人都可以发布强制全局变量未对齐地址的程序/片段(C 或程序集),以便整数被撕裂,系统必须使用两次读取来加载一个整数值吗?
当我打印下面的程序时,地址彼此接近,因此多个变量在 64 位内,但从来没有看到过字撕裂(系统或编译器中的智能?)
#include <stdio.h> int a; char b; char c; int d; int e = 0; int isaligned(void *p, int N) { if (((int)p % N) == 0) return 1; else return 0; } int main() { printf("processor is %d byte mode \n", sizeof(int *)); printf ( "a=%p/b=%p/c=%p/d=%p/f=%p\n", &a, &b, &c, &d, &e ); printf ( " check for 64bit alignment of test result of 0x80 = %d \n", isaligned( 0x80, 64 )); printf ( " check for 64bit alignment of a result = %d \n", isaligned( &a, 64 )); printf ( " check for 64bit alignment of d result = %d \n", isaligned( &e, 64 )); return 0;}
输出:
processor is 8 byte mode a=0x601038/b=0x60103c/c=0x60103d/d=0x601034/f=0x601030 check for 64bit alignment of test result of 0x80 = 1 check for 64bit alignment of a result = 0 check for 64bit alignment of d result = 0
在上述情况下如何读取 char ?它是否从 8 字节对齐边界(在我的情况下为 0x601030 )读取,然后转到 0x60103c ?
内存访问粒度总是字长不是吗?
谢谢。