gpt4 book ai didi

c++ - 非常奇怪的构造函数行为

转载 作者:行者123 更新时间:2023-11-30 00:58:13 25 4
gpt4 key购买 nike

我有以下情况

Class A
{

public:
A(/* x number of arguments */);

};


A::A(/*.....*/)
{
std::set<__int64> tmpSet;
tmpSet.insert( /*<num>*/ ); // repeat statement for some 30 K or more
tmpSet.insert( /*<num>*/ );

//-----repeat statement for some 30K or more times

}

main()
{
A obj(/*arguments */); // Run time Error : Stack over flow


}

据我观察,当我减少构造函数中的插入次数时,错误消失了。我想知道编译器如何在运行时知道在创建对象之前计算容器的大小。

最佳答案

std::set.insert()返回 std::pair<iterator, bool> .编译器必须分配堆栈内存来存储返回值,因为它太大而无法放入寄存器。

一个好的优化是为下一次调用重用这个堆栈内存。看起来您的编译器没有这样做。

因此,您的构造函数需要大量堆栈空间。在运行时,它尝试分配它,但失败了。

解决方案:

  • 使用更大的堆栈。寻找链接器选项来设置它。
  • 开启编译器优化,以便为下一次插入重用堆栈空间。
  • 切换到执行此优化的不同编译器
  • 将数字放在一个不占用堆栈空间的静态数组中,并将它们复制到集合中。

请注意,它非常依赖于您使用的编译器。但是,目前我还不知道您使用的是哪个编译器。

编辑:请注意,这纯粹是推测,因为我们不知道使用的是哪个编译器。

关于c++ - 非常奇怪的构造函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6844782/

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