寫出高效的c++代碼——函數返回值的優化

函數返回值4字節是通過寄存器帶回來的,大於4字節小於8字節通過兩個寄存器帶回來,大於8字節通過臨時對象帶回來

/*
 * 寫出高效c++代碼,函數返回值的優化
 */
#if 1
#include <iostream>
using namespace std;

class Test
{
};

Test GetObject(Test t)
{
    int value = t.GetValue();
    Test temp(value);
    return temp;
}

int main()
{
    Test t1(10);
    Test t2;
    t2 = GetObject(t1);
}
#endif

/***********運行結果*************/
/*
test()
test()
test(const test &src)
test()
test(const test &src)
~Test()
~Test()
operator=(const test &src))
~Test()
~Test()
~Test()
請按任意鍵繼續. .
*/

/*****************運行結果************************/
/*構造 t1, 構造t2, 調用GetObject函數之前在main函數戰爭生成臨時變量的內存,
隱式的將臨時變量的地址傳遞給GetObject函數,用t1拷貝構造形參t,
調用構造函數生成temp對象,返回temp對象,用temp對象拷貝構造調用GetObject函數之前生成臨時變量,
析構temp,析構t,調用賦值重載函數給t2賦值,析構臨時量,析構t2,析構t1;
*/

#if 1
#include "Test.h"

Test GetObject(Test& t)
{
    int value = t.GetValue();
    return Test(value);
}

int main()
{
    Test t1(10);
    Test t2 = GetObject(t1);
}
#endif


/***********運行結果*************/
/*
test()
test()
~Test()
~Test()
請按任意鍵繼續. . .
*/

/*****************運行結果************************/
/*構造 t1
調用GetObject函數,該函數返回一個臨時對象,用構造臨時對象構造函數構造對象t2   ps:此時臨時對象不生成被編譯器優化,直接用構造臨時對象的方法構造t2對象,  析構t2,析構t1;
*/

所以,當函數返回一個對象時候應該直接返回臨時對象,當接受一個返回對象的函數的返回值時應該定義的時候直接得到返回值(初始化的過程而不是賦值的過程)

 

/*分配內存、構造成員對象、根據對象的定義方式調用相應的構造函數

*/

構造函數的初始化列表的初始化順序是由成員變量的定義順須來決定的,如果一個變量沒有初始化則就是無效值.
在參數列表中是初始化,在類體內則是賦值,成員對象的初始化效率要比賦值的效率高(用臨時對象拷貝構造新對象,編譯器會優化,不生成臨時對象,用構造臨時對象的方法直接構造新對象)

®

當成員變量是引用的時候,可以調用拷貝構造函數,但不可以拷貝賦值重載函數

當成員變量是常成員變量的時候,可以調用拷貝構造函數,但不可以拷貝賦值重載函數

以上的成員變量都是普通成員變量,static成員變量不會受影響

當返回一個指針或引用的時候和上邊就不一樣了,需要加上const,常引用

 

 

自定義類型引用寄存器帶回來的數字,自定義類型不用加const常引用,編譯器對待自定義類型和內置類型方式不同
同時用指針指向函數返回值的地址也是ok的, 編譯器會生成一個臨時對象。編譯器對自定義類型的處理和對類對象的處理方式不一樣。

堅持✊ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章