С буфером C, я часто делаю так:Как эффективно обрабатывать std :: vector, как буфер C?
BYTE buffer[MAX_SIZE];
int dataSize = 0;
while (appRunning())
{
dataSize += Receive(buffer + dataSize, MAX_SIZE - dataSize);
int processedSize = ProcessBuffer(buffer, dataSize);
ASSERT(processedSize <= dataSize);
dataSize -= processedSize;
memmove(buffer, buffer + processedSize, dataSize);
};
Можно ли сделать это с станд :: вектор без значительной потери производительности?
EDIT: Я нашел способ заменить необработанный буфер C на std :: vector.
std::vector<BYTE> vbuf;
vbuf.reserve(MAX_SIZE); // allocated at once
while (appRunning())
{
int pendingSize = GetPendingDataSize(); // from a socket
if (pendingSize > vbuf.capacity())
pendingSize = vbuf.capacity();
vbuf.resize(pendingSize);
int recvSize = Receive(vbuf.data(), vbuf.size());
ASSERT(recvSize < vbuf.size());
int processedSize = ProcessBuffer(vbuf.data(), vbuf.size());
std::rotate(vbuf.begin(), vbuf.begin() + processedSize, vbuf.end());
vbuf.resize(vbuf.size() - processedSize);
};
Фактически, в моем практическом использовании получение данных и обработка данных могут выполняться в многопоточном режиме. Поэтому, используя вектор, мне не нужно вручную управлять распределением буфера, размером данных и объемом буфера. Сравнивая с буфером C, ограничение производительности здесь происходит при вызове vbuf.resize(). Но я считаю, что штраф ничтожен. Любой лучший способ оценивается.
'buffer' является фиксированным. Лучше использовать 'std :: array <>'. – ikh
До тех пор, пока вы не измените размер (std :: vector), вы не потеряете производительность ... Вы можете получить указатель на необработанные данные с помощью std :: vector :: data. Как отметил Иш, вы можете использовать данные std :: array и std :: array ::. std :: array - это контейнер, который инкапсулирует массивы фиксированного размера (в основном «c-массив»). – degski
@ degski. Цель, которую я хочу переместить std :: vector, заключается в том, чтобы избежать ручного управления распределением буфера, размером буфера и размером данных. –