使用malloc的c-gcc内存对齐



我有以下结构:

#define M 3
#pragma pack(push)
#pragma pack(1)
struct my_btree_node {
    struct my_btree_node *pointers[M];
    unsigned char *keys[M - 1];
    int data[M - 1];
    unsigned char number_of_keys;
};
#pragma pack(pop)

sizeof(struct my_btree_node)函数为此结构返回一个49字节的值。使用malloc为该结构分配内存是否会返回64字节块,因为在64位系统上,指针是16字节对齐的,还是确实是49字节?

有没有一种方法可以用比16更小的2次方来对齐内存?有没有可能获得应用程序内分配内存的真实大小?

为了节省内存,我想减少填充字节的数量。我的应用程序分配了数百万个这样的结构,我不想浪费内存。

malloc(3)被定义

malloc()calloc()函数返回一个指向已分配内存,对于任何内置类型都是适当对齐的。一旦出错,这些函数返回CCD_ 5。CCD_ 6也可以由成功调用大小为零的malloc(),或成功调用调用calloc(),使nmemb大小等于零。

因此,一致性实现必须返回一个与最大可能机器对齐的指针(对于GCC,它是宏__BIGGEST_ALIGNMENT__

如果你想要更少,那就执行你自己的分配程序。例如,你可以分配一个char的大数组,然后在里面进行分配。这会很痛苦,可能会更慢(处理器不喜欢未对齐的数据,例如因为CPU缓存限制),也可能不值得(当前计算机有几GB的RAM,所以几百万个几百字节大小的数据块不是什么大不了的事)。

顺便说一句,malloc实际上是在C标准库中实现的(但至少在Linux上,编译器知道这一点,这要归功于GNU glibc头中的__attribute__-s;因此GCC内部的一些内部优化知道并处理对malloc的调用)。

malloc使用内部堆结构。它取决于实现,但可以预期内存是由大量(内部)块分配的。因此,通常不可能通过单个malloc调用来精确分配49个字节。你可以在malloc之上构建一些自己的子系统来实现这一点,但我看不出你为什么想要它

附言:为了减少内存浪费,当你只需要一个结构时,你可以预先分配一个由100个结构组成的数组,然后返回&a[i],直到所有空闲索引都被浪费掉。由于阵列从不填充,内存浪费将减少约100倍。

最新更新