gpt4 book ai didi

C++ large deque - 程序需要很长时间才能退出?

转载 作者:行者123 更新时间:2023-12-03 06:51:05 26 4
gpt4 key购买 nike

考虑以下 C++ 程序:

#include <deque>
#include <iostream>

using namespace std;

int main()
{
deque<double> d(30000000);
cout << "Done\n";
}
第一行的内存分配只需要一秒钟,但在它打印之后 Done ,退出返回终端需要 33 秒 (!)。将元素数量减少到 20000000 将该时间减少到 22 秒,因此显然它与元素数量呈线性关系。
我在 Windows 10 上编译,同样的事情发生在 GCC 10.2.0 和 Visual Studio 2019 上。
这里发生了什么?我在用 deque以某种方式不应该使用它?
编辑:
#include <deque>
#include <iostream>

using namespace std;

void test_deque()
{
deque<double> d(30000000);
cout << "Function done\n";
}

int main()
{
test_deque();
cout << "Main done\n";
}
现在它打印 Function done然后是 33 秒的延迟。所以我认为这与函数退出时执行的析构函数有关。但是为什么销毁 240 MB 的内存需要这么长时间?
编辑 2:在 Ubuntu 上使用 GCC 尝试过它(第二个版本),运行只需几分之一秒!与一些在线 C++ 编译器相同。这是 Windows 特有的问题吗?
编辑 3:使用 vector它也需要几分之一秒的时间来运行。但是,与 list (和 forward_list )我得到了类似的极长延迟。
编辑 4:在发布(而不是调试)配置中使用 MSVC 进行编译也需要几分之一秒。我不确定 GCC 相当于什么,但使用 -O3 (最大优化)执行时间保持 33 秒。

最佳答案

从根本上说,答案并不是很有趣。您的程序是空操作,因此编译器可能会优化双端队列构造。但它没有必要。
但首先,合法合理的实现可能会执行以下任何操作:

  • 为 30000000 个浮点元素进行分配,仅此而已。分配器可能会:
  • 以最懒惰的方式进行分配,基本上只做一些簿记。
  • 急切地在内存中分配和分页,导致 30000000/页大小的操作。
  • 零初始化或模式初始化(​​例如 0xdeadbeef )以帮助检测内存的未初始化使用,导致 30000000 次写入。

  • 分配(包括上面)和零初始化或模式初始化内存。
  • 对所有元素运行某种析构函数(例如,将内存清零)。
  • 不要在任何元素上运行析构函数,因为它是内置类型。

  • 现在以上所有都是可能的选择。而且由于您的程序是空操作,合法的编译器可能会优化这些步骤中的任何一个或一个都不优化。您的系统分配器的功能可能会有所不同,支持延迟分配、过度使用、自动归零等。 因此,最终结果是您可以获得任何类型的行为,具体取决于您的操作系统、编译器版本、编译器标志、标准库等。

    关于C++ large deque - 程序需要很长时间才能退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64745133/

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