对象分配内联在堆栈上

时间:2010-06-26 14:02:37

标签: language-agnostic programming-languages object stack

当它说“在堆栈中内联对象分配”时,这是什么意思?

特别是'内联'位

2 个答案:

答案 0 :(得分:3)

这意味着对象的所有数据都在堆栈上分配,并在当前方法终止时弹出。

替代方案(在C#和Java中发生,或者如果你在C ++中使用指针)是在堆栈上有一个引用或指针,它指的是在堆上分配的对象数据。

我认为这里的“内联”只意味着“作为此方法的堆栈框架的一部分”,而不是与该方法分开存在。

答案 1 :(得分:2)

嗯,你知道堆栈是什么,对吗?如果你在C:中声明一个函数:

int foo() {
    int bar = 42;
    return bar;
}

调用该函数时,会为堆栈上的函数创建一些空间,并在那里分配整数bar。当函数返回时,该堆栈帧中的所有内容都将被释放。

现在,在C ++中:

class A {
    int a;
    int b;
    A(int x, int y) {
       a = x;
       b = y;
    }
    ~A() {  // destructor
       cout << "A(" << a << "," << b << ") being deleted!" << endl;
    }
}

void foo() {
    A on_the_stack(1,2);
    A *on_the_heap = new A(3,4);        
}

在Java等语言中,所有对象都在堆上分配(除非编译器进行某种优化)。但是在某些语言(如C ++)中,类对象可以像int s或float一样直接在堆栈上。除非您明确调用new,否则不会使用堆中的内存。请注意,我们的on_the_heap对象永远不会被释放(通过调用它上面的delete),因此会导致内存泄漏。另一方面,on_the_stack对象在函数返回时自动释放,并且在执行此操作之前将调用其析构函数。