堆栈框架问题:Java与C++

pan*_*ajt 7 c c++ heap stack

Q1.在Java中,所有对象,数组和类变量都存储在堆上?C++也是如此吗?数据段是Heap的一部分吗?

C++中的以下代码怎么样?

class MyClass{
    private:
            static int counter; 
            static int number;
};

MyClass::number = 100;
Run Code Online (Sandbox Code Playgroud)

Q2.据我所知,编译器给出特定值的变量存储在数据段中,未初始化的全局变量和静态变量存储在BSS中(块起始符号).在这种情况下,编译器将静态的MyClass :: counter初始化为零,因此将其存储在BSS中,初始化为100的MyClass :: number存储在数据段中.我在做出结论时是否正确?

Q3.考虑以下代码:

void doHello(MyClass &localObj){   
// 3.1 localObj is a reference parameter, where will this get stored in Heap or Stack?
      // do something
}

void doHelloAgain(MyClass localObj){   
// 3.2 localObj is a parameter, where will this get stored in Heap or Stack?
      // do something
}

int main(){
      MyClass *a = new MyClass();  // stored in heap

      MyClass localObj;   
      // 3.3 Where is this stored in heap or stack?
      doHello(localObj);
      doHelloAgain(localObj);
}
Run Code Online (Sandbox Code Playgroud)

我希望我能清楚地向所有人提出问题

编辑:

有关BSS的一些理解,请参阅本文

EDIT1:将类名从MyInstance更改为MyClass,因为它名字很差.真诚的歉意

EDIT2:将类成员变量号从非静态更改为静态

Bil*_*l K 6

这有点简化,但据我所知,大多数都是准确的.

在Java中,所有对象都在堆上分配(包括所有成员变量).大多数其他东西(参数)是引用,并且引用本身与本机类型(整数,长整数等)一起存储在堆栈中,除了字符串之外,字符串更多是对象而不是本机类型.

在C++中,如果要使用"new"关键字分配所有对象,那么它与java的情况几乎相同,但在C++中有一个独特的情况,因为您可以在堆栈上分配对象(您并不总是如此)必须使用"新").

还要注意,Java的堆性能比C的堆性能更接近C的堆栈性能,垃圾收集器做了一些相当聪明的东西.它仍然不如堆栈好,但比堆好多了.这是必要的,因为Java无法在堆栈上分配对象.