[英]Efficiency of std::get with std::tuple
我很好奇在std::tuple<>
上調用std::get<>
的查找時間。 一些簡短的谷歌搜索(包括通常有這些信息的參考頁面)沒有結果。
我最初的直覺(和恐懼)是元組的遞歸結構(如果它被實現為可變參數模板)將導致需要N個查找的順序(調用get<3>(t)
看起來像t.rest().rest().first()
。我希望我離開這里......
然后,我希望編譯器能夠優化它以直接返回正確的偏移量,而不需要N個調用的開銷。
基本上我想要的是:運行時有保證嗎? 這是否限制了std::tuple
的實現方式?
效率將與訪問結構的成員相當。 get<>
在編譯時解析。
C ++規范不保證任何函數的運行時性能。 即使它表示漸近要求,也只能保證操作的相對數量,而不是這些操作的性能。 O(1)並不意味着快,O(n)也不是慢。
您可以信任您的編譯器/優化器/標准庫實現,也可以自己重寫它以獲得您想要的任何性能。 std::get
,在大多數合理的編譯器(具有優化)下,應該或多或少地等效地直接訪問結構中的值。 但規范並不要求在任何時候。
第一個問題的答案( std::get
需要多長時間)取決於你的庫如何選擇實現std::tuple
和std::get
。 但通常情況下,庫會選擇使用非遞歸方法,類似於此處概述的方法: http : //mitchnull.blogspot.com/2012/06/c11-tuple-implementation-details-part-1.html 。 使用這種方法, std::get
的訪問時間將是常量,大致相當於訪問結構成員所花費的時間。
在回答標准是否提供任何保證時:正如其他人所說的那樣,否則,標准在此處不作任何保證。 一個邪惡的圖書館作家可以選擇在N中使std::get
指數,他們仍然是符合標准的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.