[英]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的另一個問題我得出的結論是, 這實際上是否需要完成或由編譯器自動完成的答案可能是編譯器/設置依賴的。
我的問題是,如果_foo
是static
類成員,它會有什么不同嗎? 在手動優化中是否還有一點,或者訪問靜態類成員不比訪問本地變量更“昂貴”?
PS - 我是出於好奇而不是解決具體問題 。
訪問屬性意味着取消引用該對象,以便訪問它。
由於屬性可能在執行期間發生變化(讀取線程),因此每次訪問該值時,編譯器都將從內存中讀取值。
使用局部變量將允許編譯器使用寄存器作為值,因為它可以安全地假設該值不會從外部更改。 這樣,該值只從內存中讀取一次。
關於你關於靜態成員的問題,它是相同的,因為它也可以被另一個線程改變,例如。 編譯器還需要每次從內存中讀取值。
我認為一個局部變量更可能參加一些優化,正是因為它是局部的作用:這一點可以通過編譯器使用,例如,如果它認為沒有人修改局部變量,則編譯器可以加載一次 ,並在每次迭代中使用它。
在成員數據的情況下,編譯器可能必須更多地工作以得出結論,沒有人修改該成員。 考慮一下多線程應用程序,並注意C ++ 11中的內存模型是多線程的,這意味着其他一些線程可能會修改該成員,因此編譯器可能不會斷定沒有人修改它,因此它必須發出用於每個使用它的表達式的load成員的代碼,可能在一次迭代中多次,以便使用成員的更新值。
在此示例中,_foo將被復制到新的局部變量中。 所以兩種情況都一樣。 Statis值與任何其他變量一樣。 它只是存儲在專用於靜態內存的不同內存段中。
讀取靜態類成員實際上就像讀取全局變量一樣。 他們都有一個固定的地址。 讀取非靜態的意味着首先讀取this-pointer,向結果添加偏移量,然后讀取該地址。 換句話說,讀取非靜態的操作需要更多步驟和內存訪問。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.