Эффективность 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, и они все равно будут соответствовать стандарту.