我一直在使用 std::vector 来存储从文件中读取的一些二进制数据,然后将其序列化为通过套接字发送的数据报。我为端到端功能编写了单元测试,但由于意外原因失败了:
std::vector<char> buf;
response->data(buf);
ASSERT(1 == buf.size());
这个想法是传输 1 个字节并接收 1 个字节。我实际得到的是 4 个字节。
基本上发生的事情是编码和解码中使用的插入事件将向量的大小调整为 bufsize * 2 字节或字符。我在任何地方的文档中都没有看到这一点。
unsigned long sourceLen = 1;
char source[] = { '0' };
...
std::vector<char> buf;
buf.resize(sourceLen);
buf.insert(buf.begin(), source, source + sourceLen);
ASSERT(1 == buf.size()); // Fails: buf.size() == 2.
这在解码方法中的接收端再次发生,并产生四个字节的缓冲区。我通过不使用插入方法解决了这个问题,而是实现了一个 C 风格的循环:
buf.resize(sourceLen);
for (unsigned long i = 0; i < sourceLen; ++)
{
buf[i] = source[i];
}
ASSERT(1 == buf.size()); // Succeeds: buf.size() == 1.
那么,为什么 insert 会以这样一种方式调整向量的大小,最终得到比开始时更多的数据呢?哦,我确实尝试了这个,它解决了缓冲区大小问题,但没有复制任何数据:
buf.resize(sourceLen);
buf.insert(buf.begin(), data, data + dataLen - 1);
ASSERT(1 == buf.size()); // Succeeds: buf.size() == 1.
ASSERT(buf[0] == source[0]); // Fails: buf[0] == ''.
和往常一样,我在提交问题后有一个想法。插入是否保留当前内容并插入新值?即向量的调整大小应该在调用插入之前将其大小调整为零字节?
更新:
我在文档中错过了这个......
The vector is extended by inserting new elements before the element at the specified position, effectively increasing the container size by the number of elements inserted.