2015-05-16 84 views
3

我正在編寫一個裸機C++應用程序,它將進入一個無限循環,然後永遠不會退出。沒有析構函數的C++函數

我有一些對象將被構造在main()的頂部,並且永遠不會離開作用域。內存(代碼和RAM)非常重要,因爲我只有幾個k字節可以使用。

優化器通常會爲我去掉未使用的析構函數嗎?如果沒有,有沒有辦法告訴編譯器不要生成任何默認的析構函數?

此外,有沒有類似的方式來擺脫其他類的默認功能(複製構造函數等)。

+1

請查閱http://www.embedded.com/design/mcus-processors-and-socs/4007134/Building-Bare-Metal-ARM-Systems-with-GNU-Part-4 – CryingHippo

回答

3

使用C++ 11,可以刪除默認的析構函數和一些其他成員函數。對於一個類A,這可以通過。

~A() = delete; 

也就是說,刪除析構函數確實會對如何創建實例引入一些限制。

對於舊的(pre C++ 11)編譯器,只需不聲明析構函數。雖然編譯器通常會創建一個析構函數,但它通常是內聯的並且什麼也不做的 - 所以編譯器可能會選擇完全消除這些代碼。

您還需要閱讀您的編譯器文檔(或檢查它發出的代碼)以瞭解它的實際功能。當涉及到消除未使用的代碼(包括C++ 11中的delete d成員函數)時,您將依賴編譯器實現的質量。您還可能會發現不同的優化設置會影響它的功能(例如,空內聯編譯器生成的析構函數實際上是否優化爲不存在)。

1

如果您使用的是C++ 11,那麼可以刪除默認的析構函數。檢查下面的代碼:

class A 
{ 
    public: 
     ~A() = delete; 
};