为啥不同编译器使用 c++ string+string 临时对象有区别? [复制]
Posted
技术标签:
【中文标题】为啥不同编译器使用 c++ string+string 临时对象有区别? [复制]【英文标题】:Why is there a difference between using c++ string+string temporary object by different compilers? [duplicate]为什么不同编译器使用 c++ string+string 临时对象有区别? [复制] 【发布时间】:2014-04-25 08:24:04 【问题描述】:请看这段代码。
#include <iostream>
#include <string>
using namespace std;
int main()
string hello = "Hello"
, world = "World";
const char *p = (hello+world).c_str();
cout << "STRING: " << p <<endl;
return 0;
我没有名气,不能发图片,所以我会手写结果。
= Visual Studio 2013 版本 12.0.30110.00
STRING:
= Dev-C++ ver.4.9.9.2
STRING: HelloWorld
下面是Visual Studio编译的执行结果。
第二个是Dev-C++编译的。
我想知道是什么造成了这种差异。
我将期待您的回复。谢谢:)
【问题讨论】:
这是未定义的行为。这就是您可以观察到差异的原因。 谢谢@juanchopanza,我认为避免使用未定义的行为很重要...... 【参考方案1】:(hello+world).c_str()
仅在尾随 ;
之前有效。之后访问内存是未定义的行为。
Visual Studio 可能实际上会清除内存,Dev-C++ 不会打扰。尝试使用 Visual Studio 构建发布版本(启用优化),您可能会看到相同的行为。
【讨论】:
这也可能取决于<<
运算符如何使用内存。如果std::string
使用SSO,也将取决于临时字符串是否足够小以适应;如果是这样,p
将指向一个堆栈位置,当调用operator<<
时该位置将被覆盖。等等:你真的不能做出任何笼统的陈述。
感谢 @Luchian Grigore 我认为 Visual Studio 会为优化烦恼 :)以上是关于为啥不同编译器使用 c++ string+string 临时对象有区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 g++ 和 MS Visual Studio C++ 执行以下代码的方式不同?