【问题标题】:usage of mallinfo in embedded systemsmallinfo 在嵌入式系统中的使用
【发布时间】:2016-07-05 02:13:26
【问题描述】:

我正在尝试使用 mallinfo 结构打印通过 malloc 信息完成的堆使用情况..但我无法找到下面每个分配的完全匹配是我尝试的方式。

printMemoryInfo()
{
   struct mallinfo mi;
   memset(&mi,0,sizeof(struct mallinfo));
   mi = mallinfo();
   printf(" Heap Blocks = %d\n"mi.uordblks)
}


main()
{
  printf("Initial \n");
  printMemoryInfo();
  char * data = malloc(2); /* 2 bytes*/
  printf("After  Malloc 1");
  printMemoryInfo();
  free(data );
  data = malloc(3); /* 3 bytes*/
  printf("After  Malloc 2");
  printMemoryInfo();
  free(data );
  data = malloc(6); /* 6 bytes*/
  printf("After  Malloc 3");
  printMemoryInfo();
  free(data );
  data = malloc(10); /* 10 bytes*/
  printf("After  Malloc 4");
  printMemoryInfo();
  free(data );

}

Initial
Heap Blocks = 99128
After  Malloc 1
Heap Blocks = 99144
After  Malloc 2
Heap Blocks = 99144
After  Malloc 3
Heap Blocks = 99160
After  Malloc 4
Heap Blocks = 99160

从上面的打印日志中,我无法匹配分配了多少 第一次为 1 个字节,它增加 16 并且即使我分配 2 或 3 也会相同,如果我分配 6 个字节,它将增加 32 并且即使分配 10 个字节也会相同。

我需要帮助了解 mallinfo ,我正在研究 32 位嵌入式处理器。

【问题讨论】:

    标签: c arm malloc free 32-bit


    【解决方案1】:

    这里发生了两件事:

    1. malloc 需要一些空间来存储有关已分配内存块长度的元信息。通常它会在块返回之前存储并占用 4 个字节。

    2. malloc 始终返回与平台任何类型变量的最大对齐要求对齐的地址。通常,这是 16 字节或 8 字节对齐。来自malloc(3) man-page

    malloc() 和 calloc() 函数返回一个指向已分配内存的指针,该指针适合任何内置类型。

    【讨论】:

    • 不仅是块的长度,还有指向下一个/上一个分配块的指针
    • 分配块不需要开销。 size 理论上可以在其他地方分配/注明。但是,通常会存储块的大小,并且在对齐时可以使用位字段。即,低位可能意味着别的东西。分箱分配器不需要下一个/上一个;这是一个实现细节。答案的关键部分是对齐。一些分配器可能会为覆盖保护分配守卫,这将进一步增加大小。如果您不喜欢这种行为,还有许多其他插件分配器。
    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2017-01-07
    相关资源
    最近更新 更多