为啥不同编译器使用 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 构建发布版本(启用优化),您可能会看到相同的行为。

【讨论】:

这也可能取决于&lt;&lt; 运算符如何使用内存。如果std::string 使用SSO,也将取决于临时字符串是否足够小以适应;如果是这样,p 将指向一个堆栈位置,当调用operator&lt;&lt; 时该位置将被覆盖。等等:你真的不能做出任何笼统的陈述。 感谢 @Luchian Grigore 我认为 Visual Studio 会为优化烦恼 :)

以上是关于为啥不同编译器使用 c++ string+string 临时对象有区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的编译器在 c++ 中使用动态分配的内存时给我错误

为啥在返回右值引用时给出 C++ 编译器警告?

为啥 g++ 和 MS Visual Studio C++ 执行以下代码的方式不同?

C++内存分配方法new与placement new使用方法详解

C++:为啥没有打印整个字符串?

为啥 C++ 标准库与编译器而不是操作系统捆绑在一起?