приёма/отправки данных через сокет с гарантией отсутствия как минимум лишних копирований. Кто-нибудь в курсе, как это реализовано? Учитывая, что syscall send ожидает непрерывный кусок памяти
https://www.boost.org/doc/libs/1_56_0/doc/html/boost_asio/overview/core/buffers.html ЕМНИП, оно внутри должно дергать writev (см man 3 writev )
sendmsg скорее всего.
не суть, смысл тот же. Там внутри iovec :)
Будьте аккруатнее - контейнер, который вы передаёте на вход может быть скопирован. Так что передавайте на вход спаны или другие легковесные вьюшки, внимательно читайте документацию
Спасибо! Вообще я знаком более-менее с ней на пользовательском уровне. Просто стало интересно, мол, как же так, есть гарантия отсутствия оверхеда по производительности, а сокет принимает только по сути спан на сырую память. Мне не хватало пинка в сторону writev и sendmsg)) Как-то стыдно даже, что не знал о таких вызовах А так классная библиотека в сочетании со spawn-ом
Вы правы. В случае с UDP действительно скорее всего будет вызов sendmsg
Вроде как const buffer sequence это адаптеры только, в каком случае оно копируется? Ещё в beast видел использование этих buffer sequence прям вообще в крайнем варианте, когда оно чуть не из символов собирается. А это ж тоже мне кажется антипаттерн, это дорого даже в случае iovec, краем глаза даже замечал там отдельные buf-stream схлопыватели потому что с ssl это ну прям совсем плохо.
Вот например https://www.boost.org/doc/libs/1_75_0/doc/html/boost_asio/reference/basic_stream_socket/async_receive/overload1.html "Although the buffers object may be copied as necessary" Если buffers окажется вектором из буферов, то скопируется вектор (да, с динамической аллокацией)
А вектор из буферов подходит под mutable buffer sequence без адаптеров?
Да. Пара разрабов на этом обжигались
У меня 2 от стрерилили ноги
Обсуждают сегодня