繁体   English   中英

可以将分配在“堆栈”上的向量从 function 传递到 function 吗?

[英]Can a vector allocated on the "stack" be passed from function to function?

我知道当 function 完成执行时,分配在 function 堆栈上的变量变得不可访问。 然而,向量类型将它们的元素分配在堆上,无论它们是如何分配的。 例如,

vector<int> A;

将在堆而不是堆栈上为其元素分配空间。

我的问题是,假设我有以下代码:

int main(int argc, char *argv[]) {
    // initialize a vector
    vector<int> A = initVector(100000);

    // do something with the vector...

    return 0;
}


// initialize the vector
vector<int> initVector(int size) {
    vector<int> A (size);  // initialize the vector "on the stack"

    // fill the vector with a sequence of numbers...
    int counter = 0;
    for (vector<int>::iterator i = A.begin(); i != A.end(); i++) {
        (*i) = counter++;
    }

    return A;
}

在主function中使用vector A会不会出现memory访问问题? 我尝试了几次,它们都正常工作,但我担心这可能只是运气。

我的看法是,向量 A 在堆上分配其元素,但它有一些分配在堆栈本身上的“开销”参数(可能是向量的大小)。 因此,如果这些参数被另一个分配覆盖,则在主 function 中使用向量可能会导致 memory 访问问题。 有任何想法吗?

当您执行“返回 A;”时你按值返回,所以你得到了向量的副本—— C++ 创建一个新实例并调用复制构造函数或 operator= 它。 因此,在这种情况下,分配 memory 的位置并不重要,因为您无论如何都必须复制它并销毁旧副本(尽管有一些可能的优化)。

向量(以及所有其他 STL 容器)中的数据也按值移动,因此您存储整数的副本,而不是指向它们的指针。 这意味着您的对象可以在任何容器操作中被复制多次,并且它们必须正确实现复制构造函数和/或赋值运算符。 C++ 默认为你生成那些(只是在你所有的成员变量上调用 copy ctor),但它们并不总是做正确的事情。

如果要将指针存储在 STL 容器中,请考虑使用共享指针包装器(std::shared_ptr 或 boost::shared_ptr)。 他们将确保正确处理 memory。

是的,它会正常工作,因为分配了元素的 memory,这将用于构建vector<int> A =变量。 但是,就性能而言,这不是最好的主意。

我建议将您的 function 更改为以下内容

void initVector(vector<int>& a, int size) 

有关用法的其他参考,请参阅Returning a STL vector from a function…[C++] Returning Vector from Function

有关性能的其他参考(使用 C++11),请参阅从 function 调用 C++0x 返回 std::vector 的正确方法(移动语义)

C++ 向量实际上有两个 memory 与一个指针链接。 第一个在堆栈中,第二个在堆中。 所以你在一个 object 中同时拥有堆栈和堆的特性。

std::vector<int> vec;
vec.push_back(10);
vec.push_back(20);
vec.push_back(30);
std::cout << sizeof(vec) << std::endl;

运行该代码后,您会注意到堆栈区域不包含元素,但它仍然存在。 因此,当您将向量从 function 传递给另一个向量时,您需要操作堆栈区域,并且该向量将像任何其他基于堆栈的 object 一样被复制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM