2010-12-02 129 views
2

<functional>中的大部分函數都使用函子。如果我寫這樣一個結構:編譯器優化問題

struct Test 
{ 
    bool operator() 
    { 
     //Something 
    } 
    //No member variables 
}; 

是否有perf打擊?是否會創建Test的對象?或者編譯器能否優化對象?

+0

爲什麼不是一個簡單的函數而不是一個函數因爲函數中沒有成員變量? – Chubsdad 2010-12-02 06:06:35

+0

@Chubsdad:因爲這個問題的答案中提到的'訣竅'。 http://stackoverflow.com/questions/442026/function-overloading-by-return-type – nakiya 2010-12-02 06:08:49

回答

3

海灣合作委員會至少可以優化對象創建和內聯你的函數,所以你可以期待與手工製作循環一樣的性能。你必須使用-O2進行編譯。

3

是的,如果需要的話,編譯器可以優化「對象創建」(在這種情況下是微不足道的)。但是如果你真的關心你應該編譯你的程序並檢查彙編代碼。

0

該結構沒有「使用」,因此目前的代碼,它仍然只是一個定義(並且不佔用空間)。

如果您創建類型爲Test的對象,它將佔用非零空間。如果編譯器可以推斷沒有任何地址(或任何類似地址),則可以優化空間使用率。

3

即使編譯器有一個糟糕的一天,並以某種方式無法弄清楚如何優化(這是非常簡單的優化去) - 沒有數據成員和沒有構造函數的「性能命中」,以「創建一個對象「最多隻有一條指令(如果編譯器還不知道如何內聯使用函子的函數調用)來增加堆棧指針(因爲每個對象都必須加上以複製對象有一個唯一的地址)。 「創建對象」是便宜。需要花費時間的是,通過new分配內存(因爲操作系統必須被請求訪問內存,並且必須搜索未被別的東西使用的連續塊)。把東西放在堆棧上是微不足道的。