使用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);
};
Run Code Online (Sandbox Code Playgroud)
是否有可能在std::vector不失去太多性能的情况下这样做?
编辑:我找到了一种方法来替换原始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);
};
Run Code Online (Sandbox Code Playgroud)
实际上,在我的实际使用中,接收数据和处理数据可以在多线程中完成.因此,通过使用向量,我不需要手动管理缓冲区的分配,数据大小和缓冲区容量.与C缓冲区相比,这里的性能损失是在vbuf.resize()调用时.但我认为惩罚是微不足道的.任何更好的方式表示赞赏.
lgr*_*ski -1
凭记忆写的,请检查是否适合你:
std::vector<BYTE> buffer;
buffer.reserve(MAX_SIZE);
int dataSize = 0;
while (appRunning())
{
dataSize += Receive(&buffer[0] + dataSize, MAX_SIZE - dataSize);
int processedSize = ProcessBuffer(&buffer[0], dataSize);
ASSERT(processedSize <= dataSize);
dataSize -= processedSize;
memmove(&buffer[0], &buffer[0] + processedSize, dataSize);
};
Run Code Online (Sandbox Code Playgroud)