Вопрос

Согласно boost:: документация по кортежу, доступ к одному элементу кортежа имеет ту же производительность, что и доступ к переменной-члену.Например, учитывая следующее объявление:

tuple<A, B, C> t1(A(), B(), C());
struct T { A a; B b; C c; }
T t2;

Эти два оператора должны иметь равную (или с незначительной разницей) производительность:

t1.get<2>();
t2.c;

Я просмотрел источники boost::tuple и, если я правильно их понял (я не уверен, что правильно понял), get<N> функция фактически выполняет это действие:

C get<2>(tuple<A, B, C>& t)
{
    return t.tail.tail.head;
    //Generally:  return t.tail. <<N times>> .head;
}

Это больше похоже на поиск в связанном списке, чем на прямой доступ, и, насколько я понимаю, имеет сложность O (N) вместо O (1), которая ожидается от доступа участника.Исходя из моего прошлого опыта работы с boost, я бы предположил, что понял это неправильно;но в чем моя ошибка?Как это происходит get действительно работает?

Это было полезно?

Решение

Вы правы относительно производительности, подобной списку.Однако она может быть решена во время компиляции и, следовательно, сводится к O (1) во время выполнения.(Учитывая достаточно хороший оптимизирующий компилятор.)

Другие советы

Помните, что в C ++ оператор dot - это не перенос указателя, это прямое вычисление смещения.Общий ответ - да, i1.i2.i3.in для всех n - операция с постоянным временем, вычисляемая во время компиляции.

Если вы хотите немного узнать о внутренних компонентах компилятора для этого, не копая слишком глубоко, посмотрите на LLVM getelementptr http://llvm.org/docs/LangRef.html#i_getelementptr Именно так компилятор C ++, такой как CLANG, будет нацеливаться на LLVM при компиляции ссылки на структуру.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top