Я заявляю 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
). Могу ли я сделать это как-нибудь? Мое хранилище достаточно велико, и я обрабатываю его достаточно быстро, поэтому я уверен, что могу работать с указателем из хранилища напрямую.
Ты не можешь
Это точно необходимо, чтобы очередь SPSC могла быть реализована без блокировки (при условии фиксированной емкости).
Вы не можете съесть свой торт и съесть его тоже
Кроме того, вы прошли через микрооптимизацию.
Ваш профилировщик сказал вам, что это ваше узкое место в производительности? (намекНет, это не так.
После извлечения элемента из очереди его содержимое может быть перезаписаны в любой момент времени; и скорее, чем позже, если очередь заполнена или близка к полной.
Следовательно, это существенный что содержимое будет перемещено / скопировано до того, как элемент будет помечен как вытолкнутый, иначе вы получите повреждение памяти.
Если вы хотите просто указатель на элемент … решение состоит в том, чтобы создать очередь указателей. Определите свою очередь за boost::shared_ptr<fut_sess_contents>
и только этот указатель будет скопирован (в C ++ 11, если поддерживается, вы должны предпочесть std::unique_ptr<fut_sess_contents>
).