为什么 g++ 会对此进行优化?至少,我认为这就是正在发生的事情。
Why is this being optimized away by g++? At least, I think that's what's going on
当我运行以下代码
时#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
指向删除内存。
释放后使用内存是不确定的行为。
- 空基优化子对象的地址
- 关闭||运算符优化
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 返回值优化:显式移动还是隐式
- 人脸跟踪arduino代码的优化
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 纯函数,为什么没有优化
- 为什么大多数 pair 实现默认不使用压缩(空基优化)?
- 如何以优化的方式同时迭代两个间距不相等的数组
- 小字符串优化(调试与发布模式)
- 浮点定向舍入和优化
- Visual Studio 调试优化如何工作?
- 为什么开关的优化方式与 c/c++ 中的链接不同?
- 线性优化目标函数中的绝对值
- GCC 会优化内联访问器吗?
- gcc 如何优化此循环?
- 如何防止 CUDA-GDB 中的<优化输出>值
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- 使用 std::p air 进行返回值优化