获取malloc宏的无关值-M_MMAP_THRESHOLD和M_ARENA_MAX

获取malloc宏的无关值-M_MMAP_THRESHOLD和M_ARENA_MAX,c,malloc,C,Malloc,尝试在示例c程序中打印M_MMAP_THRESHOLD和M_ARENA_MAX的值: 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_FA

尝试在示例c程序中打印M_MMAP_THRESHOLD和M_ARENA_MAX的值:

  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);
输出:


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

宏是选择器:该值告诉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;
}
上面的内部函数可能实际上是写出来的,但在这里没有区别。重要的是,宏只是一个小整数,指示要修改哪个选项

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

简言之,如果您想查询malloc选项的当前值是什么,那么您需要记住最后一个设置为的值。除了阅读文档之外,没有办法获得默认值。

说可以使用mallopt设置这些内核可调参数,那么如果设置了这些值,那么为什么不能使用direct print或gdb info宏获取新设置的值呢。尽管默认值是根据
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;
}