我想提供靜態幫助函數來處理類的數據類型。我考慮將它們包括在課程中。他們會被實例化爲每個新的類實例還是一次?靜態成員函數是否增加了類的開銷?
回答
函數沒有「實例化」(除非它們是函數模板)。
類被實例化,並且類的實例是對象。每個對象都佔用內存中的空間,但函數只是過程,編譯器一次性或全部生成的代碼片段,並且每次實例化新對象時都不會分配它們在內存中的空間。
函數可以隱式地在類的實例上工作(如果函數是成員函數),但這只是通過將隱式指針傳遞給它們工作的對象來完成的。因此,即使在成員函數的情況下,它們是static
或非static
,也沒有代碼片段的增加。
如果你的意思是問是否只有一條代碼爲static
功能,而不是代碼的幾個獨立的部分生產,那麼答案是「是」;但是對於成員函數來說,答案也是一樣的。
實際上,virtual
成員函數確實需要存儲額外的指針,其具有至少一個成員virtual
函數的類的每個實例(該指針將指向所謂虛函數表)。但是,static
函數不能是virtual
,所以這不適用於您在問題中考慮的情況。
不,不存在與static
成員函數相關的每個實例的開銷。
此外,沒有每個實例的開銷與任何成員函數關聯,但有一個例外。例外是向一個沒有任何類的類添加一個虛函數;通常,這會爲該類的每個實例添加一個額外的指針。添加更多的虛擬功能不會產生更多的每個實例的開銷。
通過將虛擬函數添加到以前沒有任何類的虛擬函數中,通常會將指針添加到該類型對象的數據中。 – 2013-04-05 15:59:16
@PeteBecker:很好,謝謝! – NPE 2013-04-05 16:09:58
- 1. '靜態'的C++類成員函數?
- 2. _beginthreadex靜態成員函數
- 3. Const靜態成員函數
- 4. 什麼是非靜態成員函數?
- 5. 靜態線程函數訪問非靜態類成員在C++
- 6. 「靜態」類成員
- 7. 如何從靜態成員函數中調用非靜態成員函數?
- 8. 靜態成員函數是否可重入?
- 9. 使用靜態成員函數而不是等效的非靜態成員函數的優點?
- 10. C++ - 派生類是否繼承基類的靜態成員?
- 11. C++類的靜態成員
- 12. 類的靜態成員
- 13. 導出靜態庫的成員函數
- 14. 如何從類成員函數內部訪問靜態函數?
- 15. 靜態成員是否被繼承?
- 16. 靜態成員是否可以超載?
- 17. 訪問靜態成員靜態成員
- 18. 在-類的靜態數據成員
- 19. 如何從成員函數中設置類靜態數據成員的值?
- 20. 公共靜態類中的非靜態成員是否線程安全?
- 21. 優勢與靜態成員函數
- 22. 如何定義靜態成員函數?
- 23. 何時使用靜態成員函數?
- 24. C++改變從靜態成員函數
- 25. 是默認靜態內部類的成員靜態在java中
- 26. 靜態類成員python
- 27. 指向靜態類成員
- 28. 靜態函數和多線程中的C++靜態成員
- 29. C#靜態類 - 靜態類不能有非靜態成員
- 30. 從空對象的成員函數初始化靜態成員
「實例化」靜態方法和實例方法都不是。你所想的沒有任何開銷。 – 2013-04-05 15:43:48
@MikeWeller。謝謝。 – danijar 2013-04-05 15:44:26
開銷來自初始化靜態成員,在程序運行之前需要爲所有靜態對象發生。 – dtech 2013-04-05 15:47:18