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> &parameterVector 如果我申报 typeA myArray[100]; vector<int> myVector (4, 100); 然后myArray存储在堆栈中,消耗sizeof(t

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

struct typeA
{
    long first;
    string second
    double third;
};
vector<int> parameterVector
vector<int> &parameterVector
如果我申报

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> &parameterVector
向量参数向量 该函数获取myVector对象的副本,并将其存储在堆栈中

但如果我这样做:

struct typeA
{
    long first;
    string second
    double third;
};
vector<int> parameterVector
vector<int> &parameterVector
向量和参数向量
该函数获取对堆栈中存储的myVector的引用,因此我现在在堆栈中存储了一个变量,引用也存储在堆栈中的myVector对象,该对象包含指向堆中存储的实际元素数组的指针

这是正确的吗

我有一些疑问:

  • 实际元素是否存储在堆中的静态数组(从C继承的元素,用方括号表示)中
  • myVector对象是只有一个指向第一个元素的指针,还是有多个指向每个元素的指针
  • 因此,按值传递向量不会带来太多问题,因为唯一被复制的是向量对象,而不是实际的元素。是这样吗
  • 如果我把整个事情搞错了,当通过值传递一个向量参数时,也复制了实际元素,那么为什么C++允许这个,因为它阻碍了静态数组?(据我所知,静态数组总是作为对第一个元素的引用传递) 谢谢

    实际元素是否存储在堆中的静态数组(从C继承的元素,用方括号表示)中

    通常,向量的元素使用动态数组存储在自由存储器中,如

    some_type* some_name = new some_type[some_size]
    
    myVector对象是只有一个指向第一个元素的指针,还是有多个指向每个元素的指针

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

    因此,按值传递向量不会带来太多问题,因为唯一被复制的是向量对象,而不是实际的元素。是这样吗

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

  • 实际元素是否存储在堆中的静态数组(从C继承的元素,用方括号表示)中
  • std::vector
    将在堆上为使用标准分配器的所有元素分配内存。它将管理内存并在必要时重新分配。因此,不存在静态数组。它更像是在C中处理动态数组,但没有所有陷阱

    如果您正在寻找C阵列的现代替代品,请查看
    std::array
    。请注意,
    std::array
    也会复制所有元素。通过引用传递,如果这是你的意思的话

  • myVector对象是只有一个指向第一个元素的指针,还是有多个指向每个元素的指针
  • std::vector
    通常是指向第一个元素的指针、一个大小和更多的位,供内部使用。但细节实际上是具体实现的

  • 因此,按值传递向量不会带来太多问题,因为唯一被复制的是向量对象,而不是实际的元素。是这样吗
  • 否。每当向量对象被复制到另一个向量对象时,所有元素都将被复制

    如果我把整个事情搞错了,当通过值传递一个向量参数时,也复制了实际元素,那么为什么C++允许这个,因为它阻碍了静态数组?(据我所知,静态数组总是作为对第一个元素的引用传递) “静态阵列”是一种C-Legacy。您不应该在新代码中再使用它们。如果您希望通过引用传递向量,则这样做不会复制任何内容。如果要移动向量,请移动它,而不是复制它。每当你告诉编译器,你想复制一个对象,它就会

    好的,为什么是这样?

    C语言的行为与语言的其他部分不一致。当您传递int时,它将被复制;当您传递struct时,它将被复制;当您传递指针时,它将被复制;但是当您传递数组时,数组将不会被复制,而是被复制到它的第一个元素的指针


    < C++方式比较一致。按值传递复制所有内容,按引用传递不复制所有内容。使用C++11移动构造函数,可以通过移动对象来传递对象。这意味着原始向量将保留为空,而新的已接管原始内存块的责任。

    如果按值传递向量,则元素将被复制到声明
    vector¶meterVector
    声明
    parameterVector
    以作为
    typeA
    元素向量的引用,不是指针。关于
    向量myVector(4100)
    ,这不是一个有效的声明。它试图创建一个v