[英]C++/g++: How does the compiler handle memory-allocation in this situation?
由于代码不同,g++ 处理这种情况的方式是否有所不同? 对于初学者来说,这似乎是完全相同的代码 tbh。
我应该提一下,这两棵树都很大,每棵树都包含大约十个左右的张量,每个估计的元素数为 10^5 左右的整数。
编辑:所有数字都分配给堆,只有一个来自树根的指针实际上位于堆栈上。
{
std::cout << "\nTrial #" << i << std::endl;
v = createV(10, 5, 10);
ExTree<int> treeOpt = build_opt(v);
{
//...
treeOpt.evaluate();
}
ExTree<int> treeNai = build_naive(v);
{
//...
treeNai.evaluate();
}
}
和
{
std::cout << "\nTrial #" << i << std::endl;
v = createV(10, 5, 10);
ExTree<int> treeNai = build_naive(v);
ExTree<int> treeOpt = build_opt(v);
{
//...
treeOpt.evaluate();
}
{
//...
treeNai.evaluate();
}
}
我问这个,因为它似乎确实有所作为,我想知道,为什么? 或者,更准确地说,编译器是否意识到,在评估并释放到内存后不会再次使用 treeOpt ? 第二个代码段实际上导致std::bad_alloc
更频繁地发生。
如果第一个块碰巧改变了v
它确实会有所作为:
第一个版本: ExTree<int>
从修改后的v
构建:
{ //... treeOpt.evaluate(); } ExTree<int> treeNai = build_naive(v);
第二个版本: ExTree<int>
从原始v
构建:
ExTree<int> treeOpt = build_opt(v); { //... treeOpt.evaluate(); }
如果v
未受影响并且您的程序是const-correct ,则编译器无论如何都可以自由地重新排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.