簡體   English   中英

如果在編譯期間不知道局部變量const的值,則在C ++中聲明局部變量const的好處

[英]Benefit of declaring a local variable const in C++, if its value is not known during compile time

我目前正在使用一款對性能至關重要的軟件,因此每次優化對我來說都很重要。 在循環中經常發生一種緊急情況,在該循環中,我通過使用double計算std::vector的兩個int索引(為清楚起見,將度量標准位置轉換為map-positions)。

我認為有三種明智的方法可以做到這一點。

//first possibility

int indexX, indexY;
for(int x = 0; x <= xMax; ++x)
{
  for(int y = 0; y <= yMax; ++y)
  {
    indexX = //calculate value using x somehow
    indexY = //calculate value using y somehow
    //do multiple things with indexX and indexY 
  }
}

//second possibility

for(int x = 0; x <= xMax; ++x)
{
  for(int y = 0; y <= yMax; ++y)
  {
    int indexX = //calculate value using x somehow
    int indexY = //calculate value using y somehow
    //do multiple things with indexX and indexY 
  }
}

//third possibility

for(int x = 0; x <= xMax; ++x)
{
  for(int y = 0; y <= yMax; ++y)
  {
    const int indexX = //calculate value using x somehow
    const int indexY = //calculate value using y somehow
    //do multiple things with indexX and indexY 
  }
}

在對SO進行了一些搜索之后,人們似乎通常不建議第一種情況,並說,如果將變量聲明為盡可能局部的,則可以進行更好的優化。 我已經測試過了,到目前為止似乎是正確的,在編譯過程中啟用了IF優化。

但是,我不確定情況2/3。 使用關鍵字作為函數參數的修飾符而不是局部變量的修飾符,我可以在const找到與const有關的所有主題。 向我介紹const正確性是關於該主題的非常籠統的討論,並且主要涉及“意外錯誤保護”。 可接受的答案還指出了“可能”進行編譯器優化,但是在我的案例中我看不到任何性能差異。

據我所知,編譯器很可能會像轉換const int number = 5的實際數量(如說在這里 ,這是C#,但我不希望它對於C不同++),但是,在我的情況下,它不會在知編譯時間。

編譯器是否檢測到局部變量只分配了一次,從而保證將兩種情況都相同? 難道一個人可能會比另一個人帶來更好的優化? 在一種情況下,這些優化是否總是總是比另一種更好?還是可以在兩種情況之間切換? 可能取決於平台嗎?

編輯:我應該提到。 該代碼將在“高度不同的平台”上編譯,但不幸的是,在大多數情況下,我無法檢查匯編結果。

很抱歉,因為這可能不是預期的答案,但是如果代碼將在“高度不同的平台”上編譯 ,則您甚至不應嘗試進行此類低級優化。 像往常一樣,仔細檢查所有算法,在一個平台上分析代碼(…),以查看您大部分時間在哪里,並對這些部分進行兩次檢查。 如果還不夠,請直接在裝配體(每個受支持的目標平台一個)中編寫評論最多的零件。 但是對於與您類似的問題,我現在假設編譯器比C ++程序員更聰明...

暫無
暫無

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

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