Эффективность std:: get с std:: tuple
Мне любопытно, что время поиска вызывает вызов std::get<>
на std::tuple<>
. Некоторые короткие поисковые запросы (включая справочные страницы, которые обычно имеют эту информацию) не принесли никаких результатов.
Моя первоначальная интуиция (и страх) заключается в том, что рекурсивная структура кортежа (если она реализована в виде вариационного шаблона) приведет к получению требуемого порядка N запросов (вызов get<3>(t)
выглядит как t.rest().rest().first()
. Я надеюсь, что уйду отсюда...
И снова я надеюсь, что компилятор сможет оптимизировать это, чтобы напрямую вернуть правильное смещение без накладных расходов на N вызовов.
В основном, что я хочу: есть ли гарантия на время выполнения? это ограничивает реализацию std::tuple
?
Ответы
Ответ 1
Спецификация С++ не гарантирует гарантии производительности во время выполнения любой функции. Даже когда он устанавливает асимптотические требования, это гарантирует только относительное количество операций, а не производительность этих операций. O (1) не означает быструю, а O (n) означает медленную.
Вы можете доверять своей реализации компилятора/оптимизатора/стандартной библиотеки, или вы можете переписать все это самостоятельно, чтобы получить любую производительность, которую вы хотите. std::get
, под большинством разумных компиляторов (с оптимизацией), должен выполнить более или менее эквивалентно прямое обращение к значению из структуры. Но спецификация не требует, чтобы в любой момент.
Ответ 2
Эффективность будет сопоставима с доступом к члену структуры. get<>
разрешается во время компиляции.
Ответ 3
Ответ на первый вопрос (длина std::get
) зависит от того, как ваша библиотека выбирает реализацию std::tuple
и std::get
. Но, как правило, библиотеки предпочитают использовать нерекурсивный подход, аналогичный описанному здесь: http://mitchnull.blogspot.com/2012/06/c11-tuple-implementation-details-part-1.html. При таком типе подхода время доступа std::get
будет постоянным и примерно эквивалентным времени, которое требуется для доступа к члену структуры.
В ответ на то, что стандарт предоставляет какие-либо гарантии: как говорили другие, нет, стандарт не дает никаких гарантий здесь. Писатель злой библиотеки может выбрать, чтобы сделать экспоненту std::get
экспоненциальной в N, и они все равно будут соответствовать стандарту.