vc 2005中的返回值優化測試

2021-04-13 02:37:49 字數 1488 閱讀 3319

考慮下面的乙個向量類

class vector2d

;vector2d(const vector2d& v);

vector2d(const float x, const float y);

const vector2d operator+(const vector2d& v) const;

const vector2d& operator=(const vector2d& v);

const vector2d& operator+=(const vector2d& v);

float _x, _y;

};vector2d::vector2d(const vector2d& v)

vector2d::vector2d(const float x, const float y)

const vector2d& vector2d::operator=(const vector2d& v)

const vector2d vector2d::operator+(const vector2d& v) const

const vector2d& vector2d::operator+=(const vector2d& v)

針對operator+(const vector2d& v)函式測試下面這段**來測試2005的編譯器的返回值優化

vector2d a(1, 2);

vector2d b(3, 4);

vector2d c;

c = a + b;

1。不優化

函式實現為

const vector2d vector2d::operator+(const vector2d& v) const

則c = a + b;呼叫的過程中呼叫了一次兩個引數的建構函式,一次拷貝建構函式(返回時生成臨時物件)和一次賦值拷貝函式。

編譯器無法對這樣的**進行優化,與預期的結果相同。

2。返回值優化

將實現改為

const vector2d vector2d::operator+(const vector2d& v) const

則c = a + b;呼叫的過程中只呼叫了一次兩個引數的建構函式,和一次賦值拷貝函式。即少生成了乙個臨時物件。

3。另一種實現

more effective c++中item22建議將operator+用operator+=來實現,即將函式改為下面的形勢

const vector2d vector2d::operator+(const vector2d& v) const

則在c = a + b;呼叫的過程中的呼叫順序為:拷貝建構函式-〉operator+= -〉拷貝建構函式-〉operator=

也就是說雖然這裡同樣使用了匿名物件,編譯器並沒有對這種情況進行優化。

因此用這種實現雖然可以統一+和+=的語義,便於**的維護,但同時會帶來一定效能上的損失,至少在vs2005中是如此。

精力有限,沒有在其他編譯器上試驗,不知道gcc中又沒有對第三種情況進行優化。 

VC2005中測試Taucs庫通過

所使用的 taucs 為openmesh 中的版本。將之拷貝到乙個目錄,如 d devtools taucs win32.然後修改建立的 project 的屬性,在 code generation 選擇multithread release 或multithread debug,然後加上附加的路徑 ...

整合網路中的VC2005中manifest問題

由於vs.net 2005 採用了一種新的dll方案,搞成乙個exe還要配有乙個manifest檔案 一般在嵌入檔案裡了,所以看不到,不過也可以不嵌入,這樣會生產乙個 程式名 exe.manifest的檔案,沒它exe自己就轉不了了 這是個新功能,微軟弄了個新工具 mt.exe 結果不好用,好像是f...

整合網路中的VC2005中manifest問題

由於vs.net 2005 採用了一種新的dll方案,搞成乙個exe還要配有乙個manifest檔案 一般在嵌入檔案裡了,所以看不到,不過也可以不嵌入,這樣會生產乙個 程式名 exe.manifest的檔案,沒它exe自己就轉不了了 這是個新功能,微軟弄了個新工具 mt.exe 結果不好用,好像是f...