Должен ли 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 было решено быть более важным для текущих выпусков