2017-06-30 6 views
0

このコードを見てみましょう。 私はC++関数がeaxのint値だけを返すと考えていました。 ベクトル結果はどこに格納されますか?ヒープ?スタック?ここで、C++関数は戻り値を置きます

おかげ

#include <iostream> 
#include <vector> 

using namespace std; 


vector<int> fonction(int a) 
{ 
     vector<int> vec; 
     for (int i=0;i<a;i++) 
     { 
       vec.push_back(1); 
     } 
     return vec; 
} 

int main(int argc, char *argv[]) 
{ 
     cout << "test" << endl; 
     auto res = fonction(10); 
     cout << res.size() << endl; 
     return 0; 
} 
+0

C++ 11 +では、 'function'の戻りベクトルは' res'にmove-constructされます。 – MrTux

+1

戻り値の格納に使用されるレジスタは、C++の属性ではなく、実行しているアーキテクチャです。 – Attie

+0

はコンパイラによって異なります。現代のコンパイラはコピーを保存するために "コピーエリジョン"を実行します。彼らは 'res'変数に直接値を割り当てます。 –

答えて

2

限りのレジスタが行くように、標準のアーキテクチャに依存しないので、値を含まなければならない登録する指定されていないC++標準。言語の構文とセマンティクスを定義するだけです

関数でベクトルを作成すると、ベクトルの内容はヒープ(通常どおり)に格納され、ベクトル自体(つまりポインタと他の簿記)が関数のスタックフレームに格納されます。

そして、値によって関数からベクトルを返すと、戻り値はrvalueとして扱われ、そのrvalueは割り当てられたベクトル(つまりポインタやその他の簿記)に移動されることが保証されます主に

コンパイラが適用できる場合、NRVOと呼ばれるものがあることに注意してください。移動はありません。値は単純に関数のスタックから取り出され、必要な場所に置かれます。


大丈夫、それは関数からベクトル型を返すことが正しいのですか?

絶対に、それはx86_64割り当ては、呼び出し元のスタック上のベクトル構造体を返すため

+0

大丈夫で、なぜint配列を返すことができないのですか? – Bob5421

+1

'std :: array'を返すことはできますが、通常の配列は返すことはできません。詳しくはhttps://stackoverflow.com/questions/3473438/return-array-in-a-function – Curious

+0

を参照してくださいありがとうございます。 – Bob5421

0

はgccのように見える完全に罰金だとRAXで、それへのポインタを返します。

movq -48(%rbp), %rax 
... 
ret 
関連する問題