为什么 g++ 会对此进行优化?至少,我认为这就是正在发生的事情。

Why is this being optimized away by g++? At least, I think that's what's going on

本文关键字:g++ 优化 至少 为什么      更新时间:2023-10-16

当我运行以下代码

#include <iostream>
int main(int argc, char *argv []) {
  
  std::string simpleString("this is just a simple string");
  
  std::cout << "simpleString = " << simpleString << std::endl << std::endl;
 
  std::string one = (simpleString + ", one");
  const char * oneCharStar = one.c_str();
  std::cout << "simpleString + one: '" << oneCharStar << "'" << std::endl;
  const char * twoCharStar = (simpleString + ", two").c_str();
  std::cout << "simpleString + two: '" << twoCharStar << "'" << std::endl;
  return 0;
}

在我的Fedora Core 23机器上

; linux Glorp 4.5.7-202.fc23.x86_64#1 SMPJun Jun 28 18:22:51 UTC 2016 x86_64 x86_64 x86_64 gnu/linux&quot&quot&quot&quot&quot&quot&quot&p>

和g - version说

; g (GCC(5.3.1 20160406(红色帽子5.3.1-6(&quot'

第一个输出读取"这只是一个简单的字符串,一个",第二个输出显示空字符串。

我想这里有某种优化,但是,在我以前的Ubuntu机器上(16. mumble,安息(,此代码正如我所期望的那样。我刚刚发现,当我在新计算机上重新编译我的应用程序(使用相同的制作文件等(时,此代码如上所述。

此外,它在以下平台上也可以正常工作:

$ uname -A Linux T4240RDB

3.12.37-RT51 G43CECDA#2 SMP星期五3月4日18:18:03 EST 2016 PPC64 GNU/Linux

$ g - version

g (gcc(4.9.2

版权所有(C(2014 Free Software Foundation,Inc。

这里发生了什么?谢谢!

const char * twoCharStar = (simpleString + ", two").c_str();

此行之后,临时字符串(simpleString + ", two")被销毁。

std::string分配内存,c_str()返回指向该内存的指针。在std::string的驱动器中,记忆被划分。因此,在此行之后,twoCharStar指向删除内存。

释放后使用内存是不确定的行为。