使用malloc进行gcc内存对齐

时间:2015-03-17 09:19:02

标签: c gcc malloc memory-alignment

我有以下结构:

#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 个答案:

答案 0 :(得分:1)

malloc使用内部堆结构。它是依赖于实现的,但可以预期存储器由整数(内部)块分配。因此,通常只能通过单个malloc调用分配49个字节。您可以在malloc之上构建自己的子系统来执行此操作,但我认为没有理由您可能需要它。

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

答案 1 :(得分:0)

malloc(3) 已定义

  

malloc()calloc()函数返回指向已分配的指针          内存,适合任何内置类型。出错,          这些函数返回NULLNULL也可能由a返回          成功调用malloc(),其中 size 为零,或成功调用          使用 nmemb size 等于零来调用calloc()

因此,符合标准的实现必须返回与最大可能的机器对齐对齐的指针(使用GCC,它是macro __BIGGEST_ALIGNMENT__

如果您想要更少,请实施您自己的分配例程。例如,您可以分配一大堆char并在其中进行分配。这将是痛苦的,也许更慢(处理器不喜欢未对齐的数据,例如由于CPU cache约束),并且可能不值得(当前的计算机有几千兆字节的RAM,因此数百万字节大小的数据块不是很重要的。)

BTW,malloc实际上是实现 C standard library(至少在Linux上 - 编译器知道它,感谢__attribute__ - s在GNU glibc标头中;因此GCC内的一些内部优化知道并处理对malloc的调用。