无法禁用std :: string的返回值优化?

Joh*_*nes 3 c++ copy-constructor return-value-optimization

鉴于这个最小的例子.

#include <iostream>
#include <string>

void print_ptr(const std::string& s)
{
    const char* data = s.data();
    std::cout << "ptr: " << (void*)data << std::endl;
}

std::string str_return(const char* suffix)
{
    std::string s("prefix");
    s += " ";
    s += suffix;
    print_ptr(s);
    return s;
}

int main()
{
    std::string s = str_return("suffix"), t;
    print_ptr(s);
    t = str_return("suffix2");
    print_ptr(t);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我这样编译:

g++ -std=c++98 -fno-elide-constructors -g -Wall  str_return.cpp -o str_return
Run Code Online (Sandbox Code Playgroud)

我的g ++:

gcc version 4.7.1
Run Code Online (Sandbox Code Playgroud)

输出:

ptr: 0x804b04c
ptr: 0x804b04c
ptr: 0x804b07c
ptr: 0x804b07c
Run Code Online (Sandbox Code Playgroud)

为什么指针仍然相等?

  • 它不应该是返回值优化 - 我将其关闭
  • 它不应该是移动构造函数,因为我采用了一个非常古老的c ++标准

如何禁用此行为?

Ker*_* SB 6

返回值优化会影响本地对象(s在您的str_return函数中).你永远不会那样.

字符串对象本身管理动态内存,并选择在返回时将该托管内存交给下一个字符串.什么你插装是管理的内存.明智地说,这不会改变.

如果你真的想看到RVO的效果,请检测本地对象:

#include <iostream>
#include <string>

void print_ptr(const std::string& s)
{
    std::cout << "ptr: " << static_cast<const void *>(&s) << std::endl;
}

std::string str_return(const char* suffix)
{
    std::string s("prefix");
    s += " ";
    s += suffix;
    print_ptr(s);
    return s;
}

int main()
{
    std::string s = str_return("suffix");
    print_ptr(s);
    std::string t = str_return("suffix2");
    print_ptr(t);
}
Run Code Online (Sandbox Code Playgroud)