我有以下结构:
#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以下的较小功率对齐,是否可以在应用程序中获得分配内存的真实大小?
我想减少填充字节数以节省内存。我的应用程序分配了数百万个结构,我不想浪费内存。
答案 0 :(得分:1)
malloc
使用内部堆结构。它是依赖于实现的,但可以预期存储器由整数(内部)块分配。因此,通常只能通过单个malloc
调用分配49个字节。您可以在malloc
之上构建自己的子系统来执行此操作,但我认为没有理由您可能需要它。
P.S。为了减少内存浪费,你可以预先分配一个由100个结构组成的数组,当你只需要一个,然后返回& a [i]直到所有的自由索引都被浪费掉。由于数组从不填充,因此内存浪费将减少约100倍。
答案 1 :(得分:0)
malloc(3) 已定义至
malloc()
和calloc()
函数返回指向已分配的指针 内存,适合任何内置类型。出错, 这些函数返回NULL
。NULL
也可能由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
的调用。