使用-O2编译器会使NRVO产生错误结果(从gcc 7开始)

时间:2019-05-02 14:40:55

标签: c++ gcc

以下带有gcc-6 -O2的代码正在编译并提供正确的结果。但是,在启用-O2的情况下切换到gcc 7.3或gcc 8.2后,编译器将执行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:result =(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)

0 个答案:

没有答案