2017-02-05 31 views
0

После профилирования от 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 правильно?

+0

Возможно, стоит рассмотреть возможность использования 'std :: vector' вместо списка. Они хорошо сочетаются с кэшированием «CPU», что может дать им преимущества перед «std :: list», даже если 'std :: list' должен иметь лучшую сложность. – Galik

+0

@Galik В настоящее время я работаю над бенчмаркингом различных методов реализации в связанном списке, поэтому мне интересно, что произойдет, если эта функция-член действительно встроена. –

+1

'_List_node_base :: _ M_transfer' не определен в' bits/stl_list.h'. Это просто объявление функции, а не определение (метод определен в другом месте, например 'src/C++ 98/list.cc'). Компилятор не может встроить функцию без ее определения (т. Е. Тела). Вы можете попытаться выполнить компиляцию с включенной оптимизацией времени соединения, хотя это не гарантировано для работы (и вам все равно придется удалить настраиваемый атрибут, добавленный в объявление). – Cornstalks

ответ

1

Пробег: boost::container::list.

Это только заголовок, поэтому нет никаких проблем, чтобы наложить силовое усилие, которое вам нравится.

В любом случае, когда вам нужна производительность, это не значит, что список - это контейнер по вашему выбору.

 Смежные вопросы

  • Нет связанных вопросов^_^