用 malloc 的 char 数组替换 std::vector 的缓冲区

Replace std::vector's buffer with a malloc'ed char array

我有以下 class 持有 std::vector 作为数据的可调整大小 "buffer"。

class packet
{
public:
    struct PacketHeader
    {
        size_t dataSize = 0;
        size_t paddedDataSize = 0;
    } header_;

    const unsigned char* data() const
    {
        return &data_[0];
    }

    unsigned char* data()
    {
        return &data_[0];
    }

    /// changes the size of the data vector
    void resize(size_t sz)
    {
       header_.dataSize = sz;

        // check if padding is needed
        if (sz % AES_BLOCK_SIZE != 0){
            auto padding = AES_BLOCK_SIZE - (sz % AES_BLOCK_SIZE);      
            data_.resize(sz + padding);
            for (int i = 1; i <= padding; i++)
            {               
                data_[(sz + padding) - i] = '[=11=]';
            }
            header_.paddedDataSize = sz + padding;
        } else{         
            data_.resize(sz);
        }
    }

private:    
    std::vector<unsigned char> data_;   
};

然后我在通过网络传输数据之前对数据执行一些 AES 加密,这需要另一个相同大小的临时缓冲区来生成密文,然后必须将密文复制回向量中。

void TcpConnection::send_packet(packet& pkg)
{
    // I cut out all the unrelevant lines of code

    // We need a temporary buffer for the encryption
    unsigned char* enc_out = (unsigned char*)malloc(pkg.header_.paddedDataSize);

    // AES-128 bit CBC encryption
    aes_cbc_encrypt(pkg.data(), enc_out, pkg.header_.paddedDataSize);

    // now I need to copy all the data back from the temporary buffer into the objects vector

    memcpy(pkg.data(), enc_out, pkg.header_.paddedDataSize);    

    free(enc_out);

    io_service_.post([this, pkg]() { transmit(pkg); });
}

这似乎是一项相当昂贵的任务。有没有更好的方法,让 vector 拥有临时缓冲区的所有权(我是否正确理解这些新的 std::move 和右值移动语义用于此类内容?)

移动语义有助于避免复制。

但是,不要为加密数据分配缓冲区,而是使用向量。然后,您可以使用 std::move 替换 packetdata_ 成员的内容。