我有以下结构:
#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倍。