gpt4 book ai didi

c++ - 栈帧问题 : Java vs C++

转载 作者:可可西里 更新时间:2023-11-01 18:26:59 24 4
gpt4 key购买 nike

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

下面的 C++ 代码呢?

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

MyClass::number = 100;

Q2。据我了解,编译器赋予特定值的变量存储在数据段中,未初始化的全局变量和静态变量存储在 BSS (Block started by symbol) 中。在这种情况下,静态的 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);
}

我希望我已经把我的问题说清楚了

编辑:

请引用这个article对BSS的一些了解

EDIT1: 将类名从 MyInstance 更改为 MyClass,因为它是一个糟糕的名称。诚挚的歉意

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

最佳答案

这有些简化,但据我所知大部分是准确的。

在 Java 中,所有对象都分配在堆上(包括您的所有成员变量)。大多数其他内容(参数)都是引用,引用本身与 native 类型(整数、长整数等)一起存储在堆栈中,但字符串除外,它更像是一个对象而不是 native 类型。

在 C++ 中,如果您要使用“new”关键字分配所有对象,情况与 java 几乎相同,但在 C++ 中有一种独特的情况,因为您可以改为在堆栈上分配对象(您不需要'总是必须使用"new")。

另请注意,Java 的堆性能比 C 的堆性能更接近 C 的堆栈性能,垃圾收集器做了一些非常聪明的事情。它仍然不如堆栈好,但比堆好得多。这是必要的,因为 Java 无法在堆栈上分配对象。

关于c++ - 栈帧问题 : Java vs C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1336476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com