C++ vector 按值 : did I get it right? 传递

标签 c++ vector heap-memory

假设我有一个这样的结构:

struct typeA
{
    long first;
    string second
    double third;
};

如果我声明

typeA myArray[100];

然后 myArray 存储在堆栈中,消耗 sizeof(typeA)*100 字节的垃圾数据(至少在我存储一些实际数据之前)。

每当我将这个数组作为参数传递时,我总是传递一个指向堆栈中第一个元素的指针。所以指针从一个栈到另一个栈。

但是如果我声明

vector<int> myVector (4, 100);

然后myVector对象实际存储在栈中,它包含一个指针,指向存储在堆中的一个4*sizeof(int)字节的数组的第一个元素,这里是实际存储数据的地方。所以指针从栈到堆。

每当我将这个 vector 作为参数传递时,如果我像这样将它添加到参数列表中:

vector<int> parameterVector

该函数获取 myVector 对象的拷贝并将其存储在堆栈中。

但是如果我这样做的话:

vector<int> &parameterVector

该函数获取存储在堆栈中的对 myVector 的引用,因此我现在在堆栈中存储了一个变量,引用了同样存储在堆栈中的 myVector 对象,该对象包含指向数组的指针存储在堆中的实际元素。

这是正确的吗?

这里有几点疑惑:

  1. 实际元素是否存储在堆中的静态数组(从 C 继承的数组,用方括号表示)中?
  2. myVector 对象是只有一个指向第一个元素的指针,还是有多个指向每个元素的指针?
  3. 因此按值传递 vector 不会造成太大问题,因为唯一被复制的是 vector 对象,而不是实际元素。是这样吗?
  4. 如果我弄错了整个事情,并且在按值传递 vector 参数时也复制了实际元素,那么为什么 C++ 允许这样做,考虑到它不鼓励使用静态数组? (据我所知,静态数组总是作为对第一个元素的引用传递)。

谢谢!

最佳答案

Do the actual elements get stored in a static array (the ones inherited from C, indicated with square brackets) in the heap?

通常使用动态数组将 vector 的元素存储在自由存储中

some_type* some_name = new some_type[some_size]

Does the myVector object have just one pointer to the first element, or it has multiple pointers to each one of the elements?

通常,一个 vector 会有一个指向第一个元素的指针、一个大小变量和一个容量。它可能有更多,但这些是实现细节,并没有由标准定义。

So passing a vector by value doesn't pose much of a problem, since the only thing that gets copied is the vector object, but not the actual elements. Is that so?

没有。复制 vector 是一个 O(N) 操作,因为它必须复制 vector 的每个元素。如果没有,那么您将有两个 vector 使用相同的底层数组,如果一个 vector 被破坏,那么它将从另一个数组中删除数组。

关于C++ vector 按值 : did I get it right? 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33567874/

相关文章:

Lisp 中的列表生成

c++ - (V)C++ (2010) 正则表达式, "recursive captures"

c++ - 为什么在调用 glDrawArrays 之前不需要绑定(bind)顶点缓冲区对象?

java - 如何从 Java 中的对象 vector 获取特定类型的对象

c++ - 对对象 vector 进行排序

c++ - 在 C++ 中检测到堆损坏

c++ - 位旋转功能

c++ - 带有 XML 的 TCP 消息结构

对元组向量进行排序需要第二个值的引用?

c++ - 报告对象正在使用堆栈/堆上的多少内存? (广发局)