小编nin*_*ina的帖子

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

以下带有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] << ", " …
Run Code Online (Sandbox Code Playgroud)

c++ gcc

8
推荐指数
0
解决办法
103
查看次数

标签 统计

c++ ×1

gcc ×1