2017-02-05 8 views
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で正しく機能しますか?

+0

リストの代わりに 'std :: vector'を使うことができると考える価値があります。 'std :: list'がより複雑になるべきときでさえ、' std :: list'よりも利点を与える 'CPU'キャッシングでうまくいきます。 – Galik

+0

@Galik現在、リンクリストのさまざまな実装方法のベンチマークを行っていますので、このメンバー関数が実際にインライン展開されるとどうなるかと思います。 –

+1

'_List_node_base :: _ M_transfer'は' bits/stl_list.h'で定義されていません。これは単なる関数宣言であり、定義ではありません(メソッドは 'src/C++ 98/list.cc'のように他の場所で定義されています)。コンパイラはその定義(すなわち本文)なしに関数をインライン化することはできません。リンク時の最適化を有効にしてコンパイルを試みることはできますが、これは動作するとは限りません(宣言に追加したカスタム属性を削除する必要があります)。 – Cornstalks

答えて

1

Try boost::container::list

これはヘッダーのみですので、好きなときにインラインで力を入れても問題ありません。

パフォーマンスが必要な場合は、選択したコンテナがリストではないようです。

関連する問題