簡體   English   中英

在Visual C ++ 2013中分配給const引用

[英]Assignment to const reference in Visual C++ 2013

例如,在Visual C ++ 2013中,為const引用分配臨時值是合法的

const int& a = 1;

在一個大型軟件項目中,我現在偶然發現了一行代碼,執行時間約為10毫秒:

const std::vector<Item>& desc = (hasItems) ? instance->getItems() : std::vector<Item>();

Item是一個大約20個字節的結構, instance-> getItems()返回一個const std :: vector <Item>& 我沒有看到任何理由為什么這條線應該花費比執行瞬間更長的時間,所以我玩了一下並發現了

const std::vector<Item>& desc = std::vector<Item>();

也需要10毫秒

std::vector<Item> items;
const std::vector<Item>& desc = items;

如你所料,接近即時,即0.00 ..毫秒。

問題是,我可以在現有的復雜軟件項目中可靠地重現這個問題,但在任何精簡的最小例子中,兩個版本的運行速度都相同。 我已在發布版本中測試了所有這些,並啟用了優化。 是否有可能這些優化之一使得這個異常為const引用賦值真的很慢? 我真的想知道導致這種行為的原因。 有沒有人知道是什么原因引起的?

跟進,是否有警告為我意外禁用的const引用賦值? 如果是這樣,它的身份是什么? 如果編譯器可以指出代碼中發生這種情況的其他位置,那將會很方便。

編輯:時間是在感興趣的代碼之前和之后使用簡單的CPU時鍾完成的,除以每秒的時鍾周期。 這不是太准確,但讓你大致了解10.something和0.something之間的區別。 並且它不會以任何方式波動,在這個具體示例中它是完全可重現的。 執行時間存在顯着差異。

 const std::vector<Item>& desc = (hasItems) ? instance->getItems() : std::vector<Item>(); 

您可能沒想到它,但是這一行會生成getItems返回值引用的向量的副本。

形式上,由條件運算符執行的類型強制規則合謀使其成為現實。 實際上,編譯器別無選擇:當引用綁定到臨時引用時,編譯器需要生成代碼以在引用最終超出范圍時銷毀該臨時代碼 - 但如果相同的引用可以綁定到那么這將變得棘手有時是臨時的,有時是左右的。 正是為了避免這種情況,編寫強制類型的規則以確保在您的情況下在條件的兩個分支上創建臨時。

這樣的事情應該有所幫助:

std::vector<Item> blank;
const std::vector<Item>& desc =
      (hasItems) ? instance->getItems() : blank;

或者,我想,你可以設計getItems()以在沒有項目的情況下返回對有效空向量的引用,並且不需要調用者跳過箍。 為此目的保持靜態常常為空的向量變量並非不合理。

暫無
暫無

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

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