我正在閱讀C++的參考文獻,並且發現爲了確保定義爲const的對象的ROM性能:
1.類或結構必須沒有用戶定義的構造函數
2.不能有基類或具有用戶定義的構造函數或析構函數的成員對象。
我正在參考按位const而不是可變常量。
在我看來,第一個持有是因爲構造函數或析構函數修改了常量數據成員。所以,我們不要使用用戶定義的構造函數或析構函數。
但我不能得到第二點的好解釋。爲什麼類或結構必須沒有用戶定義的構造函數或析構函數來確保C++中的const的ROMability?
回答
構造函數/析構函數會修改該對象,這會違背它存儲在ROM中。
如果類包含對象或繼承構造函數,那仍然是必須運行以構造對象的代碼(成員與父對象一起存儲)。在編譯時這是不可能的(當ROM對象被組裝時)。
關於構造函數的一點是不正確的:有編譯時可以運行的構造函數。在C++ 03中,它由編譯器做臨時編譯(編譯器不會阻止這樣做,並且一些編譯器會這樣做):在C++ 11中,有明確的方法來堅持它發生(實際上)。有一個構造函數並不總是以任何基本的方式阻止存儲在相當於'ROM'的東西中。 – Yakk 2013-03-11 13:27:25
正如你所說,第一點是必要的,因爲具有用戶定義的構造函數的對象在運行時被初始化(在運行之前的動態初始化階段期間,如果它們具有靜態生命週期),所以不能放置在只讀存儲器中,因爲初始化必須修改對象的內存。
第二點來自第一點 - 如果(非靜態)成員或基礎子對象具有用戶定義的構造函數,則該構造函數還必須用於在運行時初始化成員或子對象。因此,至少部分對象不能存儲在只讀存儲器中;所以對象本身不能。
這看起來像C++ 03中的POD
的定義。 POD
表示普通的舊數據。一個const
的全局實例可能被某個編譯器和平臺放置在ROM
中。
C++ 11增加了可映射到ROM
able的新語言功能。它們之間的構造函數和標準佈局類型對於某些編譯器可以放入ROM
的內容可能是一組合理的限制。但這將取決於編譯器對數據的支持。
- 1. 子類構造函數 - 爲什麼必須爲子類構造函數存在默認構造函數?
- 2. 沒有參數的構造函數或參數構造函數
- 3. 爲什麼複製構造函數不像默認構造函數或析構函數那樣「鏈接」?
- 4. 構造函數和析構函數 - C++
- 5. 對構造函數和析構函數的未定義引用
- 6. 爲什麼構造函數未定義?
- 7. 複製構造函數由用戶定義時的構造函數的行爲
- 8. 沒有構造函數的C#類
- 9. 「構造函數調用必須是構造函數中的第一條語句」
- 10. 函數定義中'*'標記之前的預期構造函數,析構函數或類型轉換
- 11. 定義私有類的構造函數
- 12. 爲什麼用戶定義的析構函數的插入需要一個用戶定義的複製構造
- 13. 模板類中的模板構造函數必須在類定義中定義?
- 14. C中的析構函數和構造函數C
- 15. C++中的構造函數和析構函數與C#比較
- 16. 爲什麼值或構造函數'處理程序'未定義?
- 17. 未定義值或構造函數'DotCoverNUnit'
- 18. 爲什麼默認構造函數在父類中是必需的,如果它具有參數構造函數?
- 19. 爲什麼CAsyncSocket沒有拷貝構造函數或=操作符?
- 20. 什麼是定義類構造函數的正確方法?
- 21. 空的構造函數和沒有構造函數有什麼區別
- 22. 爲什麼默認構造函數和自定義構造函數是爲UINavigaionController的子類調用的?
- 23. 爲什麼必須在C#6中公開無參數的結構構造函數?
- 24. 默認構造函數未定義隱式超級構造函數getdata()。必須定義一個明確的構造函數
- 25. 爲什麼隱式拷貝構造函數調用基類拷貝構造函數並且定義的拷貝構造函數沒有?
- 26. 「之前期望的構造函數,析構函數或類型轉換」<'token「
- 27. 預期的構造函數,析構函數或類型轉換之前,「*」標記
- 28. 錯誤:預期的構造函數,析構函數或類型轉換之前「(」
- 29. 預期的構造函數,析構函數或類型轉換「=」令牌」
- 30. 期望的構造函數,析構函數或類型轉換之前'('token
定義** ROMability **。這不是一個標準術語AFAIK。 – 2013-02-28 15:27:14
你必須定義「ROMability」是什麼意思?是將_code_放入ROM中,還是將一個完整的_object_放入ROM中?如果是後者,那麼這個類不能包含修改對象的任何代碼(你不能修改ROM),但如果只是存儲代碼,並且你在RAM中創建對象,那麼就沒有這樣的限制。 – 2013-02-28 15:28:31
如果一個對象被定義爲const,它將被放入ROM中,這在嵌入式系統編程中經常是一個重要的考慮因素。所以我在這個參考文獻中提出要確保這些點爲什麼能保持。 – 2013-02-28 15:29:02