2010-09-16 43 views
3

是否有任何性能損失,當我使用多個嵌套結構/類(有點像使用穆蒂尺寸堆陣列),或者是它的語言,只是一個組織的功能,使其更容易跟蹤數據和編譯器不實際看到有什麼不同?使用嵌套結構時是否存在性能損失?

謝謝

回答

3

不是真的。類/結構體只是將偏移量定義到內存中,所以如果在類中的類中有類,編譯器會將偏移量加起來。

性能進場,一旦你有一個指針(每一個指針引用是閱讀和可能的L2高速緩存未命中的存儲器)或虛擬功能(非常糟糕,尤其是在較老的CPU)。

編輯:有一件事我應該注意,雖然 - 如果你正在開發一個應用程序,性能也不是絕對的關鍵,着力做好一流的設計,而不是性能。雖然像L2緩存未命中這樣的東西在編寫需要以60fps運行的東西時會產生很大的差異,但它與正常的桌面應用程序沒有多大關係。

+0

那麼指針會受到懲罰? – vol7ron 2010-09-16 23:50:29

+0

將它們引用。 pA-> pB-> pC-> pD將強制系統從四個地址讀取。每個人都可能處於不同的緩存頁面,並導致昂貴的L2緩存未命中。既然你已經遵循pA來找出pB,你將無法預取。但是:指針用於將少量使用的數據從主結構中保留下來,所以如果你有一個需要迭代的結構數組,那麼保留你在結構中使用的實際數據以及所有很少使用的東西在一個單獨的類/結構中,以便您需要獲取更少的緩存頁面。 – EboMike 2010-09-16 23:59:16

+0

虛擬函數調用只是一個或兩個內存解除引用,用於從vtable中獲取函數地址,然後調用函數。性能不會比例如C中具有函數指針的結構差得多。並且在Linux內核中這樣的結構是* everywhere *。 – SoapBox 2010-09-17 00:19:07

1

不應該有任何表現或記憶懲罰。它們只是語法糖,可以讓程序員更容易。

0

簡短回答:不可以。

1

大多數情況下,沒有其他人提到過。但是,有一個小例外:將結構放在結構中可能會由於對齊問題而導致較小的內存使用懲罰,相對於直接放在單個結構中的相同基元。理論上這可能會導致緩存未命中,從而損害性能。例如:

​​
+0

編譯器優化會處理這個問題嗎?它看起來幾乎就像一個內聯類型優化。 – Faken 2010-09-17 01:24:12

+1

編譯器優化無法處理此問題,因爲結構佈局是ABI的一部分,需要詳細說明。 – dsimcha 2010-09-17 02:48:41