以下のサンプル プログラムでは、retlocal1 は機能しますが、retlocal2 は機能しません。ローカル変数への参照またはポインターを返さないという規則は知っていますが、それがどのように機能するのか疑問に思っていました。
retlocal1 が戻ると、その値を EAX にコピーしますか? しかし、EAXは整数を保持するのに十分なスペースを持つレジスタですか? では、EAX は std::string のコピー全体をどのように保持しますか (これはもちろん長い長い文字列である可能性があります)。
私が理解できないボンネットの下で何かが起こっているにちがいありませんか?
この例は C++ ですが、C もまったく同じように動作すると思いますか?
#include <string>
std::string retlocal1() {
std::string s;
s.append(3, 'A');
return s;
}
std::string& retlocal2() {
std::string s;
s.append(3, 'A');
return s;
}
int main(int argc, char* argv[]){
std::string d = retlocal1();
std::string e = retlocal2();
return 0;
}