C ++ / g ++:在这种情况下,编译器如何处理内存分配?

问题描述 投票:1回答:1

由于代码的不同,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更频繁地发生。

c++ memory g++ heap-memory
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.