64-94 内存模型与引用

结构体:

初始化方式不同于类,不需要构造函数

#include<iostream>
#include<string>
using namespace std;
struct student {
	string name;
	int id;
};
int main() {
	student zzx = { "zzx",213 };
}

不知道有什么好解释的,也就全员public吧。

通讯录管理系统:

注意一下最好保证内存中的数据清空比较好,没了

程序的内存模型:

1.C++运行时,内存大方向被分为4个区域

代码区(函数体的二进制代码)、全局区(全局变量、静态变量、全局常量)、栈区(编译器分配和释放)、堆区(程序员分配和释放)

2.程序运行前,已分为代码区和全局区,代码区共享(方便多次调用)且只读(无法篡改),全局区不包括局部常量、局部变量,栈区包括了局部非静态变量

3.栈由编译器管理,不会产生内存碎片,而堆由程序员自己管理,会产生内存碎片

栈:使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;从高地址到低地址

堆:存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些;从低地址到高地址

引用:

相当于给变量取别名,本质是指针常量,编译时会自动解引用,所以用法和指针规则不同

常量必须有初始值->引用必须初始化->不需要判断引用是否存在

编译器会为栈区的局部变量做一次保留

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;

int main() {
    int* func1();
    int* func2();
    int& func3();
    int& func4();
    int* p = func1();
    cout << "*p=" << *p << endl;
    cout << "*p=" << *p << endl;
    cout << "func1=" << (int)&func1 << endl;
    *func1() = 20;
    cout << "*p=" << *p << endl;
    cout << "func2=" << (int)&func2 << endl;
    *func2() = 30;
    cout << "*p=" << *p << endl;
    cout << "func3=" << (int)&func3 << endl;
    int& p2 = func3();
    cout << "p2=" << p2 << endl;
    cout << "func4=" << (int)&func4 << endl;
    func4();
    cout << "p2=" << p2 << endl;
    system("pause");
}
int* func1() {
    int a = 10;
    cout << "&a=" << (int)&a << endl;
    int* p = &a;
    return p;
}
int* func2() {
    int b = 15;
    cout << "&b=" << (int)&b << endl;
    int* p = &b;
    return p;
}
int& func3() {
    int c = 20;
    cout << "&c=" << (int)&c << endl;
    return c;
}
int& func4() {
    int d = 25;
    cout << "&d=" << (int)&d << endl;
    return d;
}
/*
输出
&a=19920584
*p=10
*p=2069207432
func1=4067488
&a=19920584
*p=20
func2=4067908
&b=19920584
*p=30
func3=4068108
&c=19920584
p2=20
func4=4068213
&d=19920584
p2=25
*/

由此可看出栈对局部变量只做一次保留,否则对象必须存储在全局区,又因为程序结构过于简单,编译器每次都把函数内唯一的局部变量分配到栈区内相同的地址,即使并不是相同的函数。

常量引用类似于常量指针(指针-5)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jvm内存模型和垃圾回收(GC)是Java程序中重要的概念。 Java虚拟机(JVM)内存模型定义了Java程序中对象的分配和回收。它包括了堆、栈、方法区和程序计数器。Java内存模型(JMM)则用于规定多线程环境下的内存访问和操作顺序。 GC是垃圾收集器自动完成的过程,用于回收不再使用的对象,释放内存空间。JVM会根据系统环境和内存需求来决定何时进行GC。我们也可以通过调用System.gc()方法手动触发一次垃圾回收,但是具体的回收时机由JVM决定。需要注意的是,手动调用System.gc()方法并不推荐,因为它会消耗较多的资源。 垃圾收集器是实现垃圾回收的具体实现。它们采用不同的算法和策略来收集和回收垃圾对象。Java中有多种垃圾收集器可供选择,如Serial、Parallel、CMS(Concurrent Mark Sweep)和G1(Garbage-First)等。每个垃圾收集器都有不同的特点和适用场景,可以根据应用程序的需求进行选择和配置。 因此,JVM内存模型定义了对象的分配和回收方式,而垃圾回收器则是具体实现了垃圾回收的过程,根据不同的算法和策略来回收不再使用的对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [JVM内存模型与垃圾回收](https://blog.csdn.net/weixin_40980639/article/details/125934179)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值