为什么用-O3标志函数编译c ++代码后产生错误的输出?

时间:2015-11-01 14:09:48

标签: c++ g++ compiler-optimization

在主要功能中我写

  Function fun;
  fun.AddName("string1");
  std::cout << fun.GetNumberOfIndeks();

我在屏幕上看到两个不同的数字:

  • 1(错误)当g ++具有-O3标志
  • 0当g ++具有-O0标志

以下类和方法的定义:

class IFunction
{
   public:
     virtual void AddName(std::string nazwa_funkcji) = 0;
     virtual std::size_t GetNumberOfIndeks() = 0;
};

class Function: public IFunction 
{
    public:
       Function();
      void AddName(std::string nazwa_funkcji);
       std::size_t   GetNumberOfIndeks();

    private:
       std::vector<std::unique_ptr<std::string>> vp_nazwy_indeksow_;
       std::unique_ptr<::std::string> p_nazwa_;
}

Function::Function():p_nazwa_(new std::string(""))
{

}

std::size_t Function::GetNumberOfIndeks()
{
    vp_nazwy_indeksow_.size();
}

void Function::AddName(std::string nazwa_funkcji)
{
    std::unique_ptr<::std::string> pl_nazwa_funkcji (new std::string(nazwa_funkcji));
    p_nazwa_ = std::move(pl_nazwa_funkcji);
}

当我评论第二行时

Function fun;
//fun.AddName("string1");
std::cout << egzFunkcji3.GetNumberOfIndeks();

我在屏幕上看到预期的与g ++标志-O3。 问题出在哪里?

1 个答案:

答案 0 :(得分:4)

这是你的功能:

std::size_t Function::GetNumberOfIndeks() {
    vp_nazwy_indeksow_.size();
}

我计算零返回语句,这将导致未定义的行为。

如果您的编译器没有对此发出警告或错误,那么您的编译器就是垃圾,应该用更好的编译器替换。