如果我在C++中有一个指向向量的指针:
vector<int>* vecPtr;我想要访问向量的一个元素,然后我可以通过取消引用向量来实现:
int a = (*vecPtr)[i];但是,这种取消引用实际上会在堆栈上创建向量的副本吗?假设向量存储了10000个整数,那么通过取消引用vecPtr 10000个整数会被复制吗?
谢谢!
发布于 2009-12-16 06:10:14
10000不会复制int%s。解除引用是非常便宜的。
为了说明这一点,您可以重写
int a = (*vecPtr)[i];作为
vector<int>& vecRef = *vecPtr; // vector is not copied here
int a = vecRef[i];此外,如果您担心存储在vector中的整个数据将位于堆栈中,并且使用vector<int>*而不是vector<int>来避免这种情况:情况并非如此。实际上,堆栈上只使用了固定数量的内存(大约16-20字节,具体取决于实现),与vector中存储的元素数量无关。vector本身在堆上分配内存和存储元素。
发布于 2009-12-16 06:10:30
不,不会复制任何内容;取消引用只会告诉C++您想要在向量上调用operator[],而不是在指针vecPtr上调用。如果您没有取消引用,C++将尝试查找在std::vector<int>*类型上定义的operator[]。
这可能会让人很困惑,因为operator[]是为所有指针类型定义的,但它相当于偏移指针,就好像它指向一个vector<int>数组一样。如果您真的只在那里分配了一个向量,那么对于除0之外的任何索引,表达式的计算结果都是对垃圾的引用,因此您将得到一个段错误或您没有预料到的结果。
一般来说,通过指针访问向量是一件痛苦的事情,而且(*vecPtr)[index]语法也很笨拙(但比vecPtr->operator[](index)好)。相反,您可以使用:
vecPtr->at(index)这实际上是检查范围,不像operator[],所以如果您不想为检查索引是否在范围内而付出代价,那么您就只能使用(*vecPtr)[]了。
https://stackoverflow.com/questions/1910712
复制相似问题