簡體   English   中英

將靜態類成員復制到本地變量以進行優化

[英]Copy static class member to local variable for optimization

在瀏覽開源代碼(來自OpenCV )時,我在方法中遇到了以下類型的代碼:

// copy class member to local variable for optimization
int foo = _foo; //where _foo is a class member

for (...) //a heavy loop that makes use of foo

從SO的另一個問題我得出的結論是, 這實際上是否需要完成或由編譯器自動完成的答案可能是編譯器/設置依賴的。

我的問題是,如果_foostatic類成員,它會有什么不同嗎? 在手動優化中是否還有一點,或者訪問靜態類成員不比訪問本地變量更“昂貴”?

PS - 我是出於好奇而不是解決具體問題

訪問屬性意味着取消引用該對象,以便訪問它。

由於屬性可能在執行期間發生變化(讀取線程),因此每次訪問該值時,編譯器都將從內存中讀取值。

使用局部變量將允許編譯器使用寄存器作為值,因為它可以安全地假設該值不會從外部更改。 這樣,該值只從內存中讀取一次。

關於你關於靜態成員的問題,它是相同的,因為它也可以被另一個線程改變,例如。 編譯器還需要每次從內存中讀取值。

我認為一個局部變量更可能參加一些優化,正是因為它是局部的作用:這一點可以通過編譯器使用,例如,如果它認為沒有人修改局部變量,則編譯器可以加載一次 ,並在每次迭代中使用它。

在成員數據的情況下,編譯器可能必須更多地工作以得出結論,沒有人修改該成員。 考慮一下多線程應用程序,並注意C ++ 11中的內存模型是多線程的,這意味着其他一些線程可能會修改該成員,因此編譯器可能不會斷定沒有人修改它,因此它必須發出用於每個使用它的表達式的load成員的代碼,可能在一次迭代中多次,以便使用成員的更新值。

在此示例中,_foo將被復制到新的局部變量中。 所以兩種情況都一樣。 Statis值與任何其他變量一樣。 它只是存儲在專用於靜態內存的不同內存段中。

讀取靜態類成員實際上就像讀取全局變量一樣。 他們都有一個固定的地址。 讀取非靜態的意味着首先讀取this-pointer,向結果添加偏移量,然后讀取該地址。 換句話說,讀取非靜態的操作需要更多步驟和內存訪問。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM