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位)