簡體   English   中英

std :: get與std :: tuple的效率

[英]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::tuplestd::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.

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