您需要一个 std::vector
:
std::vector<char> myData
vector
会自动分配和释放其内存。使用push_back
添加新数据(如果需要,vector
会自动调整大小),使用索引运算符[]
检索数据。
如果您可以猜测所需的内存量,请调用reserve
,以便后续的push_back
不必重新分配太多内存。
如果您想读取一块内存并将其附加到缓冲区,则最简单的方法可能是:
std::vector<char> myData;
for (;;) {
const int BufferSize = 1024;
char rawBuffer[BufferSize];
const unsigned bytesRead = get_network_data(rawBuffer, sizeof(rawBuffer));
if (bytesRead <= 0) {
break;
}
myData.insert(myData.end(), rawBuffer, rawBuffer + bytesRead);
}
myData
现在拥有了所有读取的数据,我们以块的形式进行读取。然而,我们复制了两次。
相反地,我们尝试像这样:
std::vector<char> myData;
for (;;) {
const int BufferSize = 1024;
const size_t oldSize = myData.size();
myData.resize(myData.size() + BufferSize);
const unsigned bytesRead = get_network_data(&myData[oldSize], BufferSize);
myData.resize(oldSize + bytesRead);
if (bytesRead == 0) {
break;
}
}
这种方法可以直接将数据读入缓冲区,但代价是会偶尔过度分配。
可以通过使向量大小在每次重新调整大小时增加两倍(就像第一个解决方案隐式地执行的那样),从而更加智能地实现此操作。当然,如果您具有对最终缓冲区可能的大小有先验知识,则可以事先使用 reserve()
来准备一个更大的缓冲区以尽量减少重新调整大小。
这两个方法都留给读者自己练习:)
最后,如果您需要将数据视为原始数组:
some_c_function(myData.data(), myData.size());
std::vector
保证是连续的。