C++ C++;按值传递的向量:我做对了吗?
假设我有一个这样的结构:C++ C++;按值传递的向量:我做对了吗?,c++,vector,heap-memory,C++,Vector,Heap Memory,假设我有一个这样的结构: struct typeA { long first; string second double third; }; vector<int> parameterVector vector<int> ¶meterVector 如果我申报 typeA myArray[100]; vector<int> myVector (4, 100); 然后myArray存储在堆栈中,消耗sizeof(t
struct typeA
{
long first;
string second
double third;
};
vector<int> parameterVector
vector<int> ¶meterVector
如果我申报
typeA myArray[100];
vector<int> myVector (4, 100);
然后myArray存储在堆栈中,消耗sizeof(typeA)*100字节的垃圾数据(至少在我存储一些实际数据之前)
每当我将此数组作为参数传递时,我总是传递指向堆栈中第一个元素的第一个元素的指针。所以指针从一个堆栈移动到另一个堆栈
但如果我宣布
typeA myArray[100];
vector<int> myVector (4, 100);
向量myVector(4100);
然后myVector对象实际上存储在堆栈中,它包含一个指针,指向堆中存储的4*sizeof(int)字节数组的第一个元素,实际数据存储在该数组中。所以指针从堆栈移动到堆
每当我将此向量作为参数传递时,如果我将其添加到参数列表中,如下所示:
struct typeA
{
long first;
string second
double third;
};
vector<int> parameterVector
vector<int> ¶meterVector
向量参数向量
该函数获取myVector对象的副本,并将其存储在堆栈中
但如果我这样做:
struct typeA
{
long first;
string second
double third;
};
vector<int> parameterVector
vector<int> ¶meterVector
向量和参数向量
该函数获取对堆栈中存储的myVector的引用,因此我现在在堆栈中存储了一个变量,引用也存储在堆栈中的myVector对象,该对象包含指向堆中存储的实际元素数组的指针
这是正确的吗
我有一些疑问:
some_type* some_name = new some_type[some_size]
myVector对象是只有一个指向第一个元素的指针,还是有多个指向每个元素的指针
通常,向量将具有指向第一个元素的指针、大小变量和容量。它可以有更多,但这些是实现细节,没有被标准定义
因此,按值传递向量不会带来太多问题,因为唯一被复制的是向量对象,而不是实际的元素。是这样吗
否。复制向量是一个O(N)操作,因为它必须复制向量的每个元素。如果没有,那么您将有两个向量使用相同的底层数组,如果其中一个被破坏,那么它将从另一个下面删除该数组
std::vector
将在堆上为使用标准分配器的所有元素分配内存。它将管理内存并在必要时重新分配。因此,不存在静态数组。它更像是在C中处理动态数组,但没有所有陷阱
如果您正在寻找C阵列的现代替代品,请查看std::array
。请注意,std::array
也会复制所有元素。通过引用传递,如果这是你的意思的话
std::vector
通常是指向第一个元素的指针、一个大小和更多的位,供内部使用。但细节实际上是具体实现的
< C++方式比较一致。按值传递复制所有内容,按引用传递不复制所有内容。使用C++11移动构造函数,可以通过移动对象来传递对象。这意味着原始向量将保留为空,而新的已接管原始内存块的责任。如果按值传递向量,则元素将被复制到声明
vector¶meterVector
声明parameterVector
以作为typeA
元素向量的引用,不是指针。关于向量myVector(4100)
,这不是一个有效的声明。它试图创建一个v