0
perf record
からプロファイリングした後、std::list
のリストをソートしている間にstd::__detail::_List_node_base::_M_transfer
が多くの時間を費やしたことが示されました。したがって、私は、強制的にそのようなメンバ関数が全体のパフォーマンスを向上させるかどうかをインラインにするかどうかを判断しています。STLで単一メンバー関数を強制的にインライン化する方法は?
これは私がやったことです。コンパイル時
inline void
_M_transfer(_List_node_base* const __first,
_List_node_base* const __last) _GLIBCXX_USE_NOEXCEPT __attribute__((always_inline));
inline void
_M_transfer(iterator __position, iterator __first, iterator __last) __attribute__((always_inline))
{ __position._M_node->_M_transfer(__first._M_node, __last._M_node); }
にbits/stl_list.h
void
_M_transfer(_List_node_base* const __first,
_List_node_base* const __last) _GLIBCXX_USE_NOEXCEPT;
void
_M_transfer(iterator __position, iterator __first, iterator __last)
{ __position._M_node->_M_transfer(__first._M_node, __last._M_node); }
の両方の宣言と実装を変更しかし、g++-6
は失敗し、これがエラーメッセージである:
error: inlining failed in call to always_inline ‘void std::__detail::_List_node_base::_M_transfer(std::__detail::_List_node_base*, std::__detail::_List_node_base*) noexcept’: function body not available
がどのように強制的に単一の部材をインライン化しますSTLで正しく機能しますか?
リストの代わりに 'std :: vector'を使うことができると考える価値があります。 'std :: list'がより複雑になるべきときでさえ、' std :: list'よりも利点を与える 'CPU'キャッシングでうまくいきます。 – Galik
@Galik現在、リンクリストのさまざまな実装方法のベンチマークを行っていますので、このメンバー関数が実際にインライン展開されるとどうなるかと思います。 –
'_List_node_base :: _ M_transfer'は' bits/stl_list.h'で定義されていません。これは単なる関数宣言であり、定義ではありません(メソッドは 'src/C++ 98/list.cc'のように他の場所で定義されています)。コンパイラはその定義(すなわち本文)なしに関数をインライン化することはできません。リンク時の最適化を有効にしてコンパイルを試みることはできますが、これは動作するとは限りません(宣言に追加したカスタム属性を削除する必要があります)。 – Cornstalks