在另一篇文章中,我问了一个编码问题,在源代码中,我用以下方式声明了一些变量:

char datablock[200];
char *pointer1=datablock;
char *pointer2=datablock+100;

但是有人提到,代码可能与64位系统不兼容,因为100不能被8整除?我不记得是什么了。
但我想做的是保留一大块内存用于我的程序,并使其尽可能快地执行,我记得因为系统缓存内存的工作方式,使用来自同一内存块的数据比使用来自不同块的数据快。使用malloc也需要更慢的内存。
所以在代码中,这是我想做的一个例子。我想分配40000字节,并给4个指针访问10000字节:
char data[40000];
char *string0=data;
char *string1=data+10000;
char *string2=data+20000;
char *string3=data+30000;

不过,这不是我想做的,因为我相信可以访问内存的不同部分:
char string0[10000];
char string1[10000];
char string2[10000];
char string3[10000];

我相信我的想法是正确的,但我唯一需要关心的是,对于64位系统,偏移值是8的倍数,而对于32位系统,偏移值是4的倍数?
我不想选择错误的号码和接收分割错误。

最佳答案

可能出现的对齐问题与在其对齐规则之外存储具有指定对齐的内容有关。
这不是你的情况。您不是在未对齐的地址中存储指针,而是在对齐的指针中存储地址。
只是想说清楚:

char *pointer2=datablock+100;

这声明了一个指针,该指针可以位于堆栈或寄存器上,具体取决于编译的方式,但指针本身的空间分配给了编译器,编译器将为底层体系结构正确地分配空间。
当您执行以下操作时,可能会出现问题:
int* asInteger = (int*) (datablock+1);
*datablock = 10;

在这种情况下,您试图将具有对齐要求(int)的值存储在一个可能与int的要求不对齐的地址中。
无论如何,如果我没记错的话,x86架构允许它工作,但速度较慢。

09-30 14:48
查看更多