如何在STL中强制内联单个成员函数?
How to forcibly inline a single member function in STL?
从 perf record
进行分析后,它表明 std::__detail::_List_node_base::_M_transfer
在对 std::list
类型的列表进行排序时花费了大量时间。所以,我在想强行内联这样的成员函数是否会提高整体性能。
这就是我所做的;更改 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); }
进入
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); }
但是,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中正确强制内联单个成员函数?
它是header-only,所以在任何你喜欢的地方放置force是没有问题的。
无论如何,当你需要性能时,list 并不是你选择的容器。
从 perf record
进行分析后,它表明 std::__detail::_List_node_base::_M_transfer
在对 std::list
类型的列表进行排序时花费了大量时间。所以,我在想强行内联这样的成员函数是否会提高整体性能。
这就是我所做的;更改 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); }
进入
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); }
但是,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中正确强制内联单个成员函数?
它是header-only,所以在任何你喜欢的地方放置force是没有问题的。
无论如何,当你需要性能时,list 并不是你选择的容器。