代码之家  ›  专栏  ›  技术社区  ›  Denis

从具有动态成员的类在堆栈上创建对象

  •  0
  • Denis  · 技术社区  · 2 年前

    假设我们在堆栈上创建一个对象作为

    class Test{
    
    Test(int i) {i_=i;}
    Test(std::vector<int> v) {v_=v;}
    
    int i_;
    std::vector<int> v_;
    };
    
    int main() {
    Test a;
    // how much memory is occupied/reserved now for a?
    .
    .
    .
    return 0;
    }
    

    当还不知道要调用哪个构造函数时,编译器如何确定“a”所需的大小?我的意思是,堆栈上保留了多少内存?如果我使用“new”来创建对象呢?

    为了转移我的观点,我的例子被简化了。我的问题的目的是更好地理解在堆栈/堆上创建/初始化对象的意义。

    0 回复  |  直到 2 年前
        1
  •  1
  •   463035818_is_not_an_ai    2 年前

    当还不知道要调用哪个构造函数时,编译器如何确定“a”所需的大小?

    这个问题源于两个误解:

    第一 Test a; 确实调用了默认构造函数。接下来,要在堆栈上分配的对象的大小是一个常数: sizeof(Test) 。当向向量成员添加更多元素时,此大小不会改变,因为这些元素对 Test ,它们是在堆上动态分配的。

    如果我使用“new”来创建对象呢?

    物体的大小没有差别。 sizeof(测试) 是一个编译时常数,不会根据创建对象的方式而更改。尽管有 Test* p = new Test; 你只有 p 在堆栈上,其大小为 sizeof(Test*) ,而对象在堆上。

    PS:事实上,“堆”和“堆栈”不是标准中使用的术语,但由于它们非常常见,我认为在这里使用它们是可以的。更正式的正确做法是谈论自动和动态存储持续时间( https://en.cppreference.com/w/cpp/language/storage_duration ).