Если вы хотите, чтобы вектор отображал количество прочитанных данных, дважды наберите resize()
. Однажды перед чтением, чтобы дать себе место для чтения. Еще раз после чтения, чтобы установить размер вектора равным количеству фактически прочитанных байтов. reserve()
не годится, поскольку резервный вызов не дает вам доступа к памяти, выделенной для емкости.
Первый resize()
обнулит элементы вектора, но это вряд ли приведет к значительному снижению производительности. Если это произойдет, вы можете попробовать предложение Potatoswatter, или вы можете отказаться от размера вектора, отражающего размер прочитанных данных, и вместо этого просто resize()
один раз, а затем повторно использовать его точно так же, как и в выделенном буфере. в к.
С точки зрения производительности, если вы читаете из сокета в пользовательском режиме, скорее всего, вы можете легко обрабатывать данные так же быстро, как они поступают. Возможно, нет, если вы подключаетесь к другому компьютеру в гигабитной локальной сети или если на вашей машине часто используется 100% процессор или 100% пропускная способность памяти. Небольшое дополнительное копирование или установка мемов не имеет большого значения, если вы все равно собираетесь заблокировать вызов read
.
Как и вы, я бы хотел избежать дополнительной копии в пользовательском пространстве, но не по соображениям производительности, просто потому, что если я этого не сделаю, мне не нужно писать код для него ...