2013-04-05 62 views
3

我想提供靜態幫助函數來處理類的數據類型。我考慮將它們包括在課程中。他們會被實例化爲每個新的類實例還是一次?靜態成員函數是否增加了類的開銷?

+3

「實例化」靜態方法和實例方法都不是。你所想的沒有任何開銷。 – 2013-04-05 15:43:48

+0

@MikeWeller。謝謝。 – danijar 2013-04-05 15:44:26

+1

開銷來自初始化靜態成員,在程序運行之前需要爲所有靜態對象發生。 – dtech 2013-04-05 15:47:18

回答

6

函數沒有「實例化」(除非它們是函數模板)。

被實例化,並且類的實例是對象。每個對象都佔用內存中的空間,但函數只是過程,編譯器一次性或全部生成的代碼片段,並且每次實例化新對象時都不會分配它們在內存中的空間。

函數可以隱式地在類的實例上工作(如果函數是成員函數),但這只是通過將隱式指針傳遞給它們工作的對象來完成的。因此,即使在成員函數的情況下,它們是static或非static,也沒有代碼片段的增加。

如果你的意思是問是否只有一條代碼爲static功能,而不是代碼的幾個獨立的部分生產,那麼答案是「」;但是對於成員函數來說,答案也是一樣的。

實際上,virtual成員函數確實需要存儲額外的指針,其具有至少一個成員virtual函數的類的每個實例(該指針將指向所謂虛函數表)。但是,static函數不能是virtual,所以這不適用於您在問題中考慮的情況。

1

成員函數(靜態或其他)只能實例化一次。在任何情況下,他們都不會給課堂增加任何開銷。

+0

'虛擬'做。也許只有第一個。 – zch 2013-04-05 15:42:40

+0

@zch他們沒有。有一個vtable添加一個指針,但單個成員函數以及vtable只存在一次,它們的數量和大小與實例的大小沒有關係。是的,本來可以提到的,但我沒有看到它遠程證明downvote(+1反擊)。 – delnan 2013-04-05 15:43:59

+0

即使是虛擬函數也只是「實例化」一次。 – john 2013-04-05 15:44:01

4

不,不存在與static成員函數相關的每個實例的開銷。

此外,沒有每個實例的開銷與任何成員函數關聯,但有一個例外。例外是向一個沒有任何類的類添加一個虛函數;通常,這會爲該類的每個實例添加一個額外的指針。添加更多的虛擬功能不會產生更多的每個實例的開銷。

+1

通過將虛擬函數添加到以前沒有任何類的虛擬函數中,通常會將指針添加到該類型對象的數據中。 – 2013-04-05 15:59:16

+0

@PeteBecker:很好,謝謝! – NPE 2013-04-05 16:09:58