由于代码的不同,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,那么无论如何编译器都可以自由地重新排序。