【问题标题】:Can I limit the size of MFC CString buffer我可以限制 MFC CString 缓冲区的大小吗
【发布时间】:2014-10-28 18:01:55
【问题描述】:

我有一个旧应用程序,它在整个代码中使用 CString。 写入 CString 的字符串的最大大小是 8,9 个字符,但我注意到它分配了更多。 (每个 CString 至少 128 个字节)

有没有办法限制 CString 缓冲区的大小。 Fox 示例到 64 字节?

提前致谢,

【问题讨论】:

  • 这真的有问题吗?
  • 是的,如果你有 1000 万个对象,每个对象有 4 个 CString 对象。

标签: string mfc size buffer limit


【解决方案1】:

没有。

详细说明: CString 实现是内部的。您可以在 CSimpleStringT::PrepareWrite2 和字符串管理器的 Reallocate 函数中找到代码。

PrepareWrite2 分配缓冲区。如果之前没有缓冲区,它会请求确切的大小。如果缓冲区发生变化。缓冲区为 newLength*1.5。

最后将请求传递给字符串管理器的 Reallocate 函数。最后将此大小传递给 CRT 函数 realloc。

请记住,内存管理器本身会再次决定什么块大小是“有效的”,并且可能会再次更改大小。

因此,正如我所见(在 VS-2013/VS-2010 中),您没有机会更改块大小。这项工作最终由 realloc 完成。甚至这个函数也将它的请求传递给 HeapAlloc...

【讨论】:

  • 感谢您的回答。我将不得不重新编写代码并替换 CStrings。我做了一项额外的测试,发现当我在 CString 中放置 3 个字符时,分配的缓冲区是 64 字节。
  • 调试还是发布?就算换了。最后,段由内部堆分配。该模块控制 64 字节。我认为这是最小的可分配块。更少会导致更多碎片!我的提示:不要考虑和担心这个。这有充分的理由和多年的经验。
猜你喜欢
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多