【发布时间】:2015-11-06 13:25:40
【问题描述】:
假设我有一个这样的结构:
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<typeA> &parameterVector声明parameterVector是对typeA元素向量的引用,而不是指针。 -
关于
vector<typeA> myVector (4, 100),这不是一个有效的声明。它尝试创建一个包含四个元素的向量,每个元素都初始化为100。但是您不能将typeA对象初始化为100。 -
是的,没错@Joachim Pileborg。对术语混淆和无效声明感到抱歉。我刚刚编辑了它。
-
在 C++ 中,将变量传递给函数的默认方式是按值传递。这就是
int、char*等的传递方式。向量并不特殊,它们只是遵循相同的规则。奇怪的是 C 样式的数组,因为它与其他所有内容都不一致。
标签: c++ vector heap-memory