12

私は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 機能が長い間欠落している理由はありますか?

3 番目の可能性はありますか。

gcc 4.8.1 を使用できますが、標準ライブラリの古いバージョンを使用できますか?

4

1 に答える 1

10

これは正確にはバグではなく、ここでそれについて読むことができます:

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

これは、古いバージョンの gcc との互換性の問題です。彼らは本当に「データメンバー」を追加したくないようです。

引用:

このパッチは、c++98 と c++11 のコードに互換性を持たせず、ディストリビューションに深刻な問題を引き起こしています。

は、 gcc patch4.7 用に実装された修正です (その中には O(1) がありました)。

別の引用:

現在のリリースでは、ABI の互換性を維持することがより重要であると判断されました。

于 2013-10-03T08:27:22.310 に答える