2010-05-01 112 views
6

我想知道當存在非靜態成員函數時是否有任何優勢使用靜態成員函數。它會導致更快的執行(因爲不必關心所有的成員變量),或者更少的內存使用(因爲沒有被包含在所有實例中)?使用靜態成員函數而不是等效的非靜態成員函數的優點?

基本上,我正在看的函數是一個效用函數,用於將表示像素顏色的整數數組圍繞任意中心點旋轉任意數量。它被放置在我的抽象Bullet基類中,因爲只有子彈纔會使用它,而且我不想在某些實用程序類中調用它的開銷。它有點太長,並且在每個派生的子彈類中都會使用,所以內聯可能不是個好主意。你會如何建議我定義這個功能?作爲Bullet的靜態成員函數,Bullet的非靜態成員函數,或者不是Bullet的成員,而是在Bullet.h中類的外部定義的成員?每個的優點和缺點是什麼?

回答

9

靜態成員函數和自由函數之間絕對沒有性能差異。

從設計的角度來看,這聽起來像是有問題的函數與Bullets很少有關係,所以我傾向於將它放在實用程序庫的某個地方,這樣做沒有運行時間開銷,只有額外的開發人員努力你還沒有這樣的圖書館。

關於原始問題,如果函數不明顯屬於某個特定的類,那麼它應該是一個自由函數。最多隻能屬於一個命名空間,以控制其範圍。即使它屬於一個類,大多數時候,我仍然更喜歡自由函數,除非函數需要訪問私有成員。

+0

是的,我不太確定C++是如何工作的。我來自Flash背景,ActionScript在最奇怪的地方有可怕的開銷 - 實用程序類中的靜態函數在運行時解析,所以每次使用Math.sin時,都必須通過哈希表找到Math類,然後找到sin函數。很高興聽到C++至少有更多的常識.. – jonathanasdf 2010-05-01 05:24:17

+3

@Zan:靜態成員函數沒有'this'指針。 – 2010-05-01 05:37:33

+0

確實,你是對的。我讀到我回應的這句話:「成員函數和免費函數之間絕對沒有性能差異」。這實際上並不是它所說的。我的錯。 – 2010-05-02 01:53:24

1

如果該方法需要在類名稱空間中,但不在該類的實例上運行(即,它不使用this也不使用任何非靜態方法),則應將其聲明爲static

當我有一個跟蹤其實例的類時,我多次使用靜態方法。它使用雙鏈表,插入構造函數,並且析構函數從列表中刪除對象。對象本身具有前一個和下一個指針作爲成員,第一個和最後一個指針是靜態成員,而所有這些指針都是私有的。所有在列表上工作的方法,例如搜索或計數,是靜態方法。

3

如果可能的話,通常使用static,以消除對象的需要並消除無關的參數this參數。

但是一個例外是仿函數:定義operator()的類,因此可以將「對象」稱爲函數。在class {}區塊內部在inline的地方聲明瞭這樣的operator()

然後,如果函數很小,它會被內聯到調用函數中,並且指針會被優化。

如果功能很大,可能不會內聯。但是,有一個額外的論點的微不足道的可能無論如何可能是矮小的。