【发布时间】:2010-07-28 12:32:30
【问题描述】:
我有一个 std::vector 值,我知道它的最大大小,但实际大小在使用过程中会有所不同:
void setupBuffer(const size_t maxSize) {
myVector.reserve(maxSize);
}
void addToBuffer(const Value& v) {
myVector.push_back(v);
if (myVector.size() == maxSize) {
// process data...
myVector.clear();
}
}
但是,在 setupBuffer 中,我需要获取指向 myVector 数据开头的指针。我正在使用第三方库,我必须在其中预先缓存此指针,以便在“处理数据...”部分进行的调用中使用。
void setupBuffer(const size_t maxSize) {
myVector.reserve(maxSize);
cachePtr(&(myVector[0])); // doesn't work, obviously
}
我不想预先 resize() 向量,因为我想使用 vector.size() 来表示添加到向量中的元素数。
那么,有没有办法在分配(reserve())之后但在它有任何元素之前获取指向向量缓冲区的指针?我会想象缓冲区存在(只要我限制 push_back'd 值的数量就不会移动)......也许这不能保证?
【问题讨论】:
-
为什么需要缓存指针,而不是在需要时安全读取?
-
我正在使用第 3 方库进行 I/O 到特定文件格式。它的工作方式是通过发送指针和最大大小在库中设置“缓冲区”。然后你可以异步调用例如'write' 将数据刷新到磁盘。我可以在每次达到 maxSize 时设置指针,但这将是额外的开销(我必须测试多少)。不过,好点子。
-
请注意,此问题询问如何获取指针,但在您拥有该指针后,您可以做什么 的答案会有所不同。有关直接涵盖该问题的问题,请参阅Is accessing the raw pointer after std::vector::reserve safe?