我怎样才能获得有关malloc()行为的信息?

ein*_*ica 1 c malloc

malloc()出于某种原因包装.我希望有一些(系统特定的,运行时)信息,而不仅仅是调用它.例如:

  • malloc()用于分配的最小对齐是什么?
  • 在分配特定范围的内存时,它实际分配了多少(理论上这可能超过请求的数量)?
  • 是否(假设没有其他并发操作)a realloc()将使用相同的原始地址成功或需要移动.

注意:我希望尽可能的方便,但特定于平台的答案仍然相关:Linux,Windows,MacOs,Un*x.

Flo*_*mer 5

glibc实现malloc_usable_size,返回可供应用程序使用的实际分配大小.一些替代malloc方案也可以实现它.请注意,realloc即使请求的新大小大于该大小,glibc也可以执行不移动malloc_usable_size,因此它不能用于此目的.

对于你要问的其他事情,没有明确的答案.从理论上讲,malloc应该提供至少与之对齐的内存_Alignof (max_align_t),但是由于各种原因,许多实现都不会这样做:

  • max_align_t来自GCC之类的编译器,因此反映了编译器的世界观,而不是malloc提供的内容(参见glibc malloc与GCC 7不兼容的例子).C标准假定统一实现,但在实践中,编译器,C运行时库,甚至malloc是单独的组件,从不同的源构建,并在不同的发布周期,因此它们可能会失去同步,并且编译- 时间常数,例如_Alignof (max_align_t)很少能准确反映malloc运行时的内容.
  • 在x86-64上提供ABI规定的16字节对齐以分配8或4字节是浪费的.
  • malloc实现可能具有导致较大的对准那么什么由体系结构规范所需的内部约束.应用程序显然不能依赖于它,但它仍然是可观察的.

关于不移动的realloc问题甚至没有正确的答案:对于多线程程序,另一个线程可能会放置一个分配,阻止在确定调整大小限制和实际realloc调用之间扩大当前分配.一个非移动版本realloc可能是一个有用的补充,但接口将是完全不同的(可能的事情请尽可能调整大小到这个最大值而不移动块,否则返回最大可能的大小或类似的东西) .