【问题标题】:gcc memory alignment using malloc使用 malloc 进行 gcc 内存对齐
【发布时间】:2015-05-19 15:47:08
【问题描述】:

我有以下结构:

#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 的幂对齐,是否可以获得应用程序内部分配内存的真实大小?

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

【问题讨论】:

  • 您为什么架构 (IA) 编译?
  • 有什么用?对齐很好。
  • @CodeClown x86_64 架构
  • @user4419802 不使用填充字节以节省内存
  • 15 个字节并不是什么大收获。但是如果你有太多的结构体,也就是一个结构体数组,你可能只是将数据拆分为几个数组,因为数组永远不会被填充。

标签: c gcc malloc memory-alignment


【解决方案1】:

malloc(3)定义

malloc()calloc() 函数返回一个指向已分配的指针 内存,适合任何内置类型。出错时, 这些函数返回NULLNULL 也可以由 成功调用 malloc()size 为零,或成功调用 调用calloc()nmembsize 等于 0。

所以一个符合要求的实现必须返回一个与最大可能机器对齐对齐的指针(GCC,它是macro __BIGGEST_ALIGNMENT__

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

顺便说一句,malloc 实际上在C standard library实现(但-至少在Linux 上-编译器知道这一点,这要感谢__attribute__-s 在GNU glibc 标头中;所以GCC 内部的一些内部优化知道并处理对malloc 的调用)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-22
      • 2014-05-15
      • 2019-02-08
      • 2013-06-27
      • 1970-01-01
      • 2017-06-27
      • 2018-09-01
      • 1970-01-01
      相关资源
      最近更新 更多