c - 获取 malloc 宏的不相关值 - M_MMAP_THRESHOLD 和 M_ARENA_MAX
问题描述
试图在示例程序中打印M_MMAP_THRESHOLD
和的值:M_ARENA_MAX
c
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
如果您可以建议 - 如何获取这些宏的值。
解决方案
宏是选择器:值告诉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 选项的当前值是多少,则由您决定记住您设置它的最后一个值。(除了阅读文档之外,没有其他方法可以获取默认值。)
推荐阅读
- java - 如何最有效地从多个线程访问共享文件?
- bash - 美国国家航空航天局图片下载
- c# - 以 JSON 格式发送设置并使用反射 - SDK C#
- asp.net - 从数据库中快速检索 varbinary/image 数据,
- copy - 如何在 AzureDataFactoryV2 的文件名中使用通配符来仅复制容器中的特定文件?
- ios - RxSwift:从 awakeFromNib 到 UIViewController 的按钮单击操作
- google-bigquery - BigQuery 完全连接两个表,没有要连接的列
- github-api - 是否有任何快速的方法来获取所有打开的拉取请求的评论计数
- sapui5 - 如何从检查元素中为网格跨度添加单独的类
- uitableview - SwipCellKit swift 5 - 无法滑动以启动删除菜单