繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM