Должен ли std::list::size иметь постоянную сложность в C++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 имеет отличную поддержку функций C++11, и я не вижу причин, почему они не реализовали бы эту.

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

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

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

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

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

1 ответ

Решение

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

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

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

Цитирование:

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

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

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

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

Другие вопросы по тегам