【问题标题】:Creating objects on the stack在堆栈上创建对象
【发布时间】:2016-03-06 22:58:32
【问题描述】:

我有一个包含大向量的类

class myClass
{
public:
    myClass(int size)
private:
    vector<int> myVector;
}

myClass::myClass(int size)
{
    myvector = vector<int>(size);
}

如果我调用myClass o(100000),对象会在堆栈上创建。但是,堆栈上到底是什么?我从堆栈分配多少内存?向量的内容应该在堆上分配,对吧?

谁能给我解释一下栈上到底是什么,堆上是什么?

【问题讨论】:

  • 您可以使用sizeof(o)来查找。
  • 或者看看你的vector实现。堆栈上的每条数据都有固定的大小,因此您可以在其上放置新项目。如果向量的内容在堆栈上,那么您可以插入其中的项目数量将是有限的。
  • Yoy 可以使用sizeof(myClass) 检查堆栈上的数据量。无论向量的大小如何,堆栈内存的大小都是恒定的。
  • @5gon12eder 谢谢

标签: c++


【解决方案1】:

基本上你可以将std::vector概括为

template<typename T>
struct vector {
    T* data;
    size_t size;
    size_t capacity;
};

各个实现可能会有所不同,但它们通常看起来像上面那样。

所以它只是在堆栈上创建的这个向量容器,将保存数据的数组是从堆中提取的。

--- 编辑 ---

对于给定的堆栈变量,您可以使用sizeof 运算符来判断它需要多少堆栈空间,例如

myClass o(100000);
std::cout << "o's size is " << sizeof(o) << "\n";

【讨论】:

  • 你能用myClass o(100000);这一行告诉我我在堆栈上分配了多少字节的内存吗?
  • 不,但您可以使用sizeof。例如std::vector&lt;int&gt; v; std::cout &lt;&lt; sizeof(v) &lt;&lt; "\n";
  • sizeof(o) 给定您的 myClass o 示例。
  • 在良好的环境中,堆栈大小不应受到限制,即应仅受设备内存量的限制。如果你确定你不是在做一个内存关键的程序,堆栈溢出通常意味着代码中的一些错误。
  • @IvanKuckir 您将如何为具有 50 个线程的程序设置堆栈? (当然,每个线程都应该有自己的堆栈)
猜你喜欢
  • 2010-12-08
  • 1970-01-01
  • 2023-03-18
  • 2012-08-12
  • 1970-01-01
  • 2016-12-15
  • 2020-04-09
  • 2010-09-24
  • 2014-11-12
相关资源
最近更新 更多