比方说,我有一个这样的结构:通过值传递的C++向量:我得到它的权利?
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<int> parameterVector
功能得到myVector对象,并将其存储在堆栈中的副本。
但是,如果我不喜欢这样写道:
vector<int> ¶meterVector
的功能得到了参考myVector存储在堆栈中,所以我现在都存储在堆栈中的变量,引用也存储在myVector对象在堆栈中,它包含一个指向存储在堆中的实际元素数组的指针。
这是正确的吗?
我有几个疑惑这里:
- 做实际的元素,会存储在一个静态数组(由C继承而来的,用方括号表示)在堆中?
- myVector对象是否只有一个指向第一个元素的指针,或者它有多个指向每个元素的指针?
- 因此,按值传递一个向量不会带来很大的问题,因为唯一被复制的是矢量对象,但不是实际的元素。是这样吗?
- 如果我弄错了所有的东西,并且实际的元素也被复制以及通过值传递向量参数,那么为什么C++允许这样做,考虑到它会阻止它与静态数组? (据我所知,静态数组总是作为参考传递给第一个元素)。
谢谢!
如果按值传递一个向量,则元素也会被复制 –
声明'vector&parameterVector'声明'parameterVector'是'typeA'元素的向量的引用*,而不是指针。 –
而关于'vector myVector(4,100)',那不是一个有效的声明。它试图创建一个由四个元素组成的向量,每个元素初始化为“100”。但是你不能将'typeA'对象初始化为'100'。 –