После профилирования от perf record
оно показало, что std::__detail::_List_node_base::_M_transfer
заняло много времени при сортировке списка типов std::list
. Таким образом, я озвучиваю, может ли принудительная inline такая функция-член может увеличить общую производительность или нет.Как принудительно встроить одну функцию-член в STL?
Это то, что я сделал; изменить как декларацию и внедрение в 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 правильно?
Возможно, стоит рассмотреть возможность использования 'std :: vector' вместо списка. Они хорошо сочетаются с кэшированием «CPU», что может дать им преимущества перед «std :: list», даже если 'std :: list' должен иметь лучшую сложность. – Galik
@Galik В настоящее время я работаю над бенчмаркингом различных методов реализации в связанном списке, поэтому мне интересно, что произойдет, если эта функция-член действительно встроена. –
'_List_node_base :: _ M_transfer' не определен в' bits/stl_list.h'. Это просто объявление функции, а не определение (метод определен в другом месте, например 'src/C++ 98/list.cc'). Компилятор не может встроить функцию без ее определения (т. Е. Тела). Вы можете попытаться выполнить компиляцию с включенной оптимизацией времени соединения, хотя это не гарантировано для работы (и вам все равно придется удалить настраиваемый атрибут, добавленный в объявление). – Cornstalks