如何有效地处理像C缓冲区这样的std :: vector?

Vie*_* Ha 6 c++ stl c++11

使用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)