首页 文章

为什么C中没有“memsize”,它返回使用malloc在堆中分配的内存块的大小?

提问于
浏览
5

好 . 它可以在Visual Studio中的_msize中调用 .

但是,考虑到使用malloc分配的内存块,为什么不返回内存大小?因为我们无法判断malloc之后的返回指针指向了多少内存,所以我们可以使用这个“memsize”调用来返回我们需要的信息 . “memsize”将是特定于实现的,因为malloc / free

只是问我必须写一个wrapper回来存储一些额外的字节大小 .

4 回答

  • 4

    因为C库(包括 malloc )是为最小开销而设计的 . 像你想要的那样的函数需要实现来记录分配的确切大小,而实现现在可以根据需要选择大小"round",以防止在 realloc 中实际重新分配 .

    存储大小需要额外分配 size_t ,这对于嵌入式系统来说可能很重要 . (对于在编写C89时仍然很丰富的PDP-11和286) .

  • 7

    为了解决这个问题,为什么会这样?标准中已有很多东西,特别是C标准 . 你的用例是什么?

    你要求一个足够大小的内存块,你得到它(或空指针或异常) . 可能会或可能不会分配额外的字节,其中一些可能会被保留 . 这在概念上很简单:你问你想要什么,你得到了一些你可以使用的东西 .

    为什么复杂化呢?

  • 2

    我认为没有确切的答案 . 标准的开发人员可能会考虑它,并权衡利弊 . 任何进入标准的东西都必须通过每个实现来实现,因此向其添加内容会给开发人员带来沉重的负担 . 我猜他们只是没有找到足够有用的功能来保证这一点 .

  • 1

    在C中,您谈到的包装器由标准提供 . 如果使用 std::vector 分配内存块,则可以使用成员函数 vector::size() 来确定数组的大小,并使用 vector::capacity() 来确定分配的大小(可能不同) .

    另一方面,C是一种低级语言,这种问题由开发人员管理,因为动态跟踪它(如你所建议的)并不是绝对必要的,并且在许多情况下是多余的 .

相关问题