C ++ / g ++: как компилятор обрабатывает выделение памяти в этой ситуации? - PullRequest
0 голосов
/ 04 марта 2019

Есть ли разница в том, как 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 происходит чаще.

1 Ответ

0 голосов
/ 04 марта 2019

Это имеет значение, если первый блок изменяется 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 , компилятор в любом случае может изменить порядок вещей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...