С -O2 компилятор делает NRVO и выдает неверный результат (начиная с gcc 7) - PullRequest
8 голосов
/ 02 мая 2019

Следующий код с gcc-6 -O2 компилировался и выдавал правильный результат. Однако после переключения на gcc 7.3 или gcc 8.2 с включенной опцией -O2 компилятор выполняет NRVO и не выдает правильный результат. Любой совет, почему NRVO включен в этом случае и является ли это действительным c ++?

Clang-6, clang-7 и компилятор Intel обеспечивают ожидаемый результат при включенном O3. Когда -fno-elide-constructors передается в gcc7.3, NRVO блокируется, и результат соответствует ожидаемому.

#include <array>
#include <iostream>

using Coordinates = std::array<double, 3>;

Coordinates map( const Coordinates& c, size_t level )
{
   Coordinates result{ c[1], c[2], c[0] };

   if( level != 0 )
   {
     result =  map( result, level - 1);
   }

   return result;
}

int main( )
{
   Coordinates vecOfCoordinates = { 1.0, 2.0, 3.0 };
   size_t level = 1;

   auto result = map( vecOfCoordinates, level );

   std::cout << "result = (" << result[0] << ", " << result[1] << ", " << result[2] << "), should be (3, 1, 2)" << std::endl;

   return 0;

}

g ++ - 6 -O2: результат = (3, 1, 2), должен быть (3, 1, 2)

g ++ - 7: результат = (3, 1, 2), должен быть (3, 1, 2)

g ++ - 7 -O2: результат = (3, 1, 3), должен быть (3, 1, 2)

g ++ - 7 -O2 -fno-elide-constructors: result = (3, 1, 2), должно быть (3, 1, 2)

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