この最小限の例を考えると。
#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;
}
私はこのようにコンパイルしました:
g++ -std=c++98 -fno-elide-constructors -g -Wall str_return.cpp -o str_return
私のg ++:
gcc version 4.7.1
出力:
ptr: 0x804b04c
ptr: 0x804b04c
ptr: 0x804b07c
ptr: 0x804b07c
ポインターがまだ等しいのはなぜですか?
- 戻り値の最適化であってはなりません - 私はそれをオフにしました
- 本当に古い標準の C++ を使用したため、ムーブ コンストラクターであってはなりません。
この動作を無効にするにはどうすればよいですか?