Должен ли std:: list:: size иметь постоянную сложность в С++ 11?

Я использую gcc 4.8.1, и после нескольких часов отладки ужасной загадочной проблемы производительности я обнаружил, что std::list::size фактически реализован как вызов std::distance.

/**  Returns the number of elements in the %list.  */
      size_type
      size() const _GLIBCXX_NOEXCEPT
      { return std::distance(begin(), end()); }

Это меня удивило, поскольку в ссылке говорится, что сложность std:: list:: size должна быть постоянной и сложность std::distance является линейным для std::list::iterator.

Я действительно смущен, так как я думаю, что gcc имеет отличную поддержку возможностей С++ 11, и я не вижу причин, по которым они не будут реализовывать этот.

Это ошибка в ссылке или в gcc?

В последнем случае:

Есть ли причина, почему такая фундаментальная функция С++ 11 будет отсутствовать так долго?

Есть ли третья возможность, например:

Могу ли я иметь gcc 4.8.1, но какую-то более старую версию стандартной библиотеки?

Ответ 1

Это не совсем ошибка, и вы можете прочитать об этом здесь:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49561

Это скорее совместимость со старыми версиями gcc. Похоже, что они действительно не хотят добавлять дополнительный "элемент данных".

Цитата:

Этот патч сделал код С++ 98 и С++ 11 несовместимым и вызывает серьезные проблемы для дистрибутивов.

Где patch - это исправление, которое они реализовали для gcc 4.7 (в нем было O (1)).

Другая цитата:

поддержание совместимости с ABI было решено стать более важным для текущих выпусков