首页 > 解决方案 > 获取 malloc 宏的不相关值 - M_MMAP_THRESHOLD 和 M_ARENA_MAX

问题描述

试图在示例程序中打印M_MMAP_THRESHOLD和的值:M_ARENA_MAXc

  if (mallopt(M_ARENA_MAX, 0) == 0) {
      printf("mallopt() 2 failed"); 
      exit(EXIT_FAILURE);
  }   

  if (mallopt(M_MMAP_THRESHOLD, 64) == 0) {
      printf("mallopt() 2 failed");
      exit(EXIT_FAILURE);
  }

  p = malloc(1000);
  if (p == NULL) {
      fprintf(stderr, "malloc() failed");
      exit(EXIT_FAILURE);
  }   
  printf("Value for M_MMAP_MAX : %d \n",M_MMAP_MAX);
  printf("Value for M_MMAP_THRESHOLD : %d \n",M_MMAP_THRESHOLD);

输出:

Value for M_MMAP_MAX : -4 
Value for M_MMAP_THRESHOLD : -3 

如果您可以建议 - 如何获取这些宏的值。

标签: cmalloc

解决方案


宏是选择器:值告诉mallopt设置哪个选项。mallopt(仅略微简化)的定义是:

int mallopt(int which, int value) {
    int result = 0;
    internal_lock_malloc_state();
    switch (which) {
        case M_MMAP_MAX:
            result = internal_set_maximum_mmap(value);
            break;
        case M_MMAP_THRESHOLD:
            result = internal_set_threshold(value);
            break;
        // ...
    } 
    internal_unlock_malloc_state();
    return result;
}

上面的内部函数可能实际上已经写出来了,但这并没有什么区别。重要的是宏只是一个小整数,它指示要修改哪个选项。

不幸的是,从您的角度来看,没有办法检查这些选项的当前价值。事实上,甚至不能保证存在当前值。例如,考虑一个malloc从不使用的实现mmap,可能是因为主机系统没有实现内存映射。这样的实现可以相当合理地忽略任何设置这些选项的尝试,方法是将internal_set...上面的函数替换为result = 1;.

简而言之,如果您想查询 malloc 选项的当前值是多少,则由您决定记住您设置它的最后一个值。(除了阅读文档之外,没有其他方法可以获取默认值。)


推荐阅读