spsc_queue pop — избегать memcpy?

Я заявляю spsc_queue как это:

boost::lockfree::spsc_queue<fut_sess_contents,  boost::lockfree::capacity<1024>> futInfoUpdates;

Я обрабатываю это так:

fut_sess_contents entry_fsc;
while (futInfoUpdates.pop(entry_fsc))
{
.... work
}

Я предполагаю, что я прохожу entry_fsc здесь по ссылке и spsc_queue memcpy следующий элемент. Это не выглядит эффективным, я бы предпочел просто получить указатель на элемент в хранилище и работать с элементом из хранилища напрямую (избегая дополнительных memcpy). Могу ли я сделать это как-нибудь? Мое хранилище достаточно велико, и я обрабатываю его достаточно быстро, поэтому я уверен, что могу работать с указателем из хранилища напрямую.

1

Решение

Ты не можешь

Это точно необходимо, чтобы очередь SPSC могла быть реализована без блокировки (при условии фиксированной емкости).

Вы не можете съесть свой торт и съесть его тоже

Кроме того, вы прошли через микрооптимизацию.

Ваш профилировщик сказал вам, что это ваше узкое место в производительности? (намекНет, это не так.

2

Другие решения

После извлечения элемента из очереди его содержимое может быть перезаписаны в любой момент времени; и скорее, чем позже, если очередь заполнена или близка к полной.

Следовательно, это существенный что содержимое будет перемещено / скопировано до того, как элемент будет помечен как вытолкнутый, иначе вы получите повреждение памяти.

Если вы хотите просто указатель на элемент … решение состоит в том, чтобы создать очередь указателей. Определите свою очередь за boost::shared_ptr<fut_sess_contents> и только этот указатель будет скопирован (в C ++ 11, если поддерживается, вы должны предпочесть std::unique_ptr<fut_sess_contents>).

0

По вопросам рекламы [email protected]