2013-09-24 59 views
1

我正在編寫一個程序,其中速度優化是至關重要的。每增加1%速度都不錯。C++在沒有初始化的情況下在堆棧上分配

在一個被稱爲很多的函數中,我需要一個固定大小的(小)類MyClass數組。在開始時,我使用了std :: vector。整個事情是小的(通常爲256項,類大小是12個字節,這意味着3072個字節,如果數組對準16字節)

現在它發生:使用

  • C型分配在堆棧上的數組MyClass [256]提高了性能。根據我的理解,這是因爲沒有內存分配/刪除操作,堆棧分配是免費的。
  • 使用:: operator new使用內存分配,也提高了性能。因爲它跳過了類的初始化,我不需要。除此之外,我希望儘可能避免原始內存初始化。

所以它應該更快分配堆棧和跳過初始化。如果需要,我可以重寫類構造函數,但我不知道如何。

感謝,

艾蒂安

+0

「MyClass [256],在堆棧上分配」只是順便說一句,你不能決定什麼將在堆棧上,堆什麼,標準沒有澄清它,因爲它只是指定有關生存期類型和存儲類類型。所以它是編譯器的自由決定因素;) – dhein

+0

好吧,這就是理論。我不知道任何不使用堆的新編譯器和本地存儲變量的堆棧。 –

+0

感謝理論的澄清......但我分發二進制文件,我的編譯器確實在堆棧中分配了局部變量,它使我的應用程序運行得更快,所以即使沒有保證,我也會採用它:) – galinette

回答

3

你不需要初始化?所以大概MyClass沒有構造函數,也沒有需要構造的數據成員?在這種情況下,編譯器無論如何都不會進行任何初始化。所以只需使用新的。

如果MyClass確實有一個構造函數,那麼你應該考慮它爲什麼在你說的時候不需要初始化。

如果MyClass確實有數據成員需要構造(一std::string說)然後我會查詢您的斷言,你不需要初始化。

但是你是對的另一點,從矢量切換到數組應該爲你節省一些時間。

+0

你確定?基本上我的類包含一個指針和兩個整數。我相信整數始終是零初始化的。實際上,使用新的MyClass [256]會使應用程序比使用醜陋的static_cast (:: operator new(sizeof)要慢5%(實際上,它只是一個結構) – galinette

+0

(MyClass [256]))),我可以找到的唯一原因是在第一種情況下進行初始化 – galinette

+1

@galinette您是否正在使用完全優化和發佈模式進行編譯?例如,Visual Studio在調試模式下初始化所有內容。 –

相關問題