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

时间:2016-04-21 21:04:55

标签: c++ c++11 move-semantics

我有以下类将std::vector作为数据的可调整大小的“缓冲区”。

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] = '\0';
            }
            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); });
}

这似乎是一项相当昂贵的任务。是不是有更好的方法,让矢量取得临时缓冲区的所有权(我是否正确理解这些新的std::move和rvalue移动语义用于这种东西?)

1 个答案:

答案 0 :(得分:1)

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

但是,不使用malloc为缓冲区加密数据,而是使用向量。然后,您可以使用std::move替换packet的{​​{1}}成员的内容。