Pointers 关于指针对齐的问题
我正在开发一个内存池实现,我对指针对齐有点困惑Pointers 关于指针对齐的问题,pointers,alignment,Pointers,Alignment,我正在开发一个内存池实现,我对指针对齐有点困惑 假设我有一个分配固定大小内存块的内存池,在创建内存池的时候,我使用malloc((size)*(num of blocks))。如果所分配的是对象,并且大小来自sizeof运算符对齐,则不应引起关注,但如果大小不均匀(他/她出于任何原因需要100字节的块),那么当我拆分malloc给出的块时,我最终会得到未对齐的指针。我的问题是,我是否应该始终将块与某个边界对齐?如果是,哪一个?X86将在没有对齐的情况下工作,但数据对齐时性能会更好。类型的对齐通常
假设我有一个分配固定大小内存块的内存池,在创建内存池的时候,我使用malloc((size)*(num of blocks))。如果所分配的是对象,并且大小来自sizeof运算符对齐,则不应引起关注,但如果大小不均匀(他/她出于任何原因需要100字节的块),那么当我拆分malloc给出的块时,我最终会得到未对齐的指针。我的问题是,我是否应该始终将块与某个边界对齐?如果是,哪一个?X86将在没有对齐的情况下工作,但数据对齐时性能会更好。类型的对齐通常是sizeof(type),最多16(字节) 我写了这个愚蠢的测试程序只是为了确定(asuming malloc知道它在做什么),它在我的amd64框中返回16。在32位模式下编译时返回8:
#include <stdlib.h>
#include <stdio.h>
int main() {
int i;
unsigned long used_bits = 0, alignment;
for (i = 0; i < 1000; ++i) {
used_bits |= (unsigned long)malloc(1); /* common sizes */
used_bits |= (unsigned long)malloc(2);
used_bits |= (unsigned long)malloc(4);
used_bits |= (unsigned long)malloc(8);
used_bits |= (unsigned long)malloc(16);
used_bits |= (unsigned long)malloc(437); /* random number */
}
alignment = 1;
while (!(used_bits & alignment)) {
alignment <<= 1;
}
printf("Alignment is: %lu\n", alignment);
return 0;
}
#包括
#包括
int main(){
int i;
无符号长用_位=0,对齐;
对于(i=0;i<1000;++i){
使用的_位|=(无符号长)malloc(1);/*通用大小*/
使用的_位|=(无符号长)malloc(2);
使用的_位|=(无符号长)malloc(4);
使用的_位|=(无符号长)malloc(8);
使用的_位|=(无符号长)malloc(16);
使用的_位|=(无符号长)malloc(437);/*随机数*/
}
对齐=1;
while(!(使用位和对齐)){
对齐正确的对齐至少对大多数x86实现有帮助(性能方面)(在其他体系结构中,某种对齐实际上是强制性的)。您可以要求(像calloc那样)提供一对参数、以字节为单位的项的大小和项的数量,而不仅仅是一个(以字节为单位的大小,像malloc那样);然后您可以(通过将块大小四舍五入)在本质上对齐到项大小上方的下一个更高的2次方(但切换到16字节以上的16倍,不要永远翻倍,就像@derobert建议和解释的那样!)。这样,如果调用者只需要N个字节,而不需要任何对齐或填充,那么他们总是可以要求N个项目,每个项目1个字节(就像calloc一样,出于相同的原因;-)。哪种体系结构(CPU系列)?这是不同的。我假设你在2上谈论的是16位,所以是两字节边界。不,16字节/八位字节(128位)