[英]Replace std::vector's buffer with a malloc'ed char array
我有以下類將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
和右值移動語義用於此類內容?)
移動語義可以幫助避免復制。
然而,不是 malloc'ing 加密數據的緩沖區,而是使用向量。 然后,您可以使用std::move
替換packet
的data_
成員的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.