関数の戻り値と戻りタイプについて
2547 ワード
戻りタイプは、戻り値を格納するためにどのタイプのメモリに分割されるかを決定するだけです.
戻り値は、外部入力または内部定義にかかわらず、参照を返さない限り、関数が}に実行されると、匿名のオブジェクトが外部関数スタックにコピーされます.
同様に、パラメータは、参照タイプでない限り、外部関数スタックから呼び出された関数スタックにコピーされるインポートパラメータに対してもコピーを実行します.
VSコンパイラはいくつかの最適化を行い、コピー回数を減らします.返される匿名オブジェクトを外部関数スタックに直接構築します.一度構造と析構を省く.
次のようになります.
結果は次のとおりです.
戻り値は、外部入力または内部定義にかかわらず、参照を返さない限り、関数が}に実行されると、匿名のオブジェクトが外部関数スタックにコピーされます.
同様に、パラメータは、参照タイプでない限り、外部関数スタックから呼び出された関数スタックにコピーされるインポートパラメータに対してもコピーを実行します.
VSコンパイラはいくつかの最適化を行い、コピー回数を減らします.返される匿名オブジェクトを外部関数スタックに直接構築します.一度構造と析構を省く.
次のようになります.
#include
class Integer
{
public:
Integer(int i): m_i(i)
{
printf("
");
}~Integer()
{
printf("
");
} Integer(const Integer &rhs)
{
printf("
");
m_i = rhs.m_i;
}
// const: ,
// const:
// const:
const Integer operator+(const Integer &rhs) const
{
return Integer(m_i + rhs.m_i);
} const Integer operator-(const Integer &rhs) const
{
Integer tmp(m_i - rhs.m_i);
return tmp;
} private:
int m_i;
};
int main(void)
{
Integer a(1);
Integer b(2);
printf("--------------
");
Integer c(b - a);
printf("--------------
");
Integer d(b + a);
return 0;
}
結果は次のとおりです.
--------------
--------------