gpt4 book ai didi

c++ - STL 内存管理 "reliable"是否用于长时间运行的程序?

转载 作者:太空狗 更新时间:2023-10-29 23:26:18 25 4
gpt4 key购买 nike

我阅读了很多关于 C++11 STL 中内存管理的 SO 帖子,但我找不到真正令人满意的答案。

我的情况:我开发了一个长时间运行的服务器[大约运行 4-6 周]。目前我使用了很多 C 代码char [x][y]char [z]位于堆栈上的变量。

怀疑 STL 内存管理是否仍然可靠 在运行数周并在 t̲h̲i̲s̲ 期间服务超过 1000 万个线程的程序中广泛使用它每个线程都会有很多STL操作。

更具体地说:我想将位于堆栈上的所有固定大小的变量重写为 std::vector<std::string>std::string类型。

我的问题:

  1. 我能否完全安全地用新的现代 STL 符号重写我的程序并摆脱旧的 C 代码?
  2. 百万线程运行那么长时间,有没有内存碎片
  3. 表现如何?使用将变量放在堆栈上的旧 C 代码不会对性能产生任何影响。

编译器是 gcc 4.9.3

最佳答案

Can I completely safe rewrite my program to the new modern STL notation and get rid of the old C code?

首先,STL 并不新鲜;它可以追溯到 C++ 本身被标准化之前。其次,我们称之为 C++ 标准库。

第三,只要您的线程遵循 C++ 的要求(即:不要以 C++ 不允许的方式终止),并且您不泄漏内存,那么是的,您会没事的。

Is there any memory fragmentation when running for that long time in million of threads?

您将从位于堆栈上的对象转变为动态分配内存。 当然存在内存碎片的可能。

这与 C++ 标准库容器完全无关。这是使用动态分配的结果。

同样重要的是,您可以只使用 std::array<char, ...>如果你想使用更好的、固定大小的堆栈数组。然后,std::string小字符串优化的实现在很多情况下提供了一个很好的折衷方案,如果字符串小于某个最大大小则放弃分配内存。

What about the performance? Using the old C code having the variables on stack does not have any performance impact.

它使您的堆栈更长,考虑到 1000 万个线程,这可能会导致您提交更多的内存页面。话又说回来,也许不是。

无论如何,当涉及到超线程应用程序时,内存分配始终是一个问题。内存分配,就其本质而言,必须是可重入的。这意味着互斥锁定等等。

您可以设计分配和取消分配内存的原子方法,但这往往需要分配固定大小的内存。而这样的事情往往有其自身的缺点。您可以拥有从中分配的线程本地内存池。所有这些都需要使用您自己的内存分配器。

但最重要的是...这些问题又与使用 C++ 标准库类型具体无关。这就是当您从静态内存转到动态分配时发生的事情。您是否使用 malloc/free或标准库容器,问题在于动态分配。

关于c++ - STL 内存管理 "reliable"是否用于长时间运行的程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37844940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com