gpt4 book ai didi

C++/g++ : How does the compiler handle memory-allocation in this situation?

转载 作者:行者123 更新时间:2023-11-30 04:50:25 27 4
gpt4 key购买 nike

由于代码的不同,g++ 处理这种情况的方式是否有所不同?对于初学者来说,这似乎是完全相同的代码。

我应该提一下,这两棵树的规模都很大,每棵树都包含大约十个张量,每个张量的估计元素数为 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 更频繁地发生。

最佳答案

如果第一个 block 碰巧改变了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 ,编译器无论如何都可以自由地重新排序。

关于C++/g++ : How does the compiler handle memory-allocation in this situation?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54984318/

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