【C++ grammar】C++简化内存模型
1、stack(栈)
编译器自动分配内存(函数内部定义得局部变量、形参)
2、堆(Heap)
一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收(new和delete)
3、Global\Static(全局区、静态区)
1、全局变量和静态变量的存储是放在一块儿的
2、可以简单认为:程序启动全局/静态变量就在此处、程序结束释放
4、Constant(常量区)
可以理解为所有常量都放在一起,该区域内容不可修改、
c++内存示例:
堆向高地址方向生长
栈向低地址方向生长
所以中间的空白区域会由两者共享,增大了内存的利用效率。
观察变量存放位置;
问题:
下面哪个语句可以接在const char* p = “Hello”;后面:
1、p[0]=‘A’
2、p = “World”;
3、cin>>p
4、*(p+1)=‘e’
1和4共同的问题:表达式必须是可以修改的左值
运算符的左边应该是一个“左值”。所谓“左值”就是指在程序中占用内存空间、可以被修改的量,比如各种变量。
‘’A‘’是一个字符串常量,他一经定义系统就会分配一段地址给他(常量区)式子左边p[0]也是一个常量地址,所以不能用 = 将一个常量地址赋值给一个常量地址。这也就能回答问题:表达式必须是可修改的左值的答案,因为p[0]也是一个常量地址。
3、符号方向反了
关于1、4问题的详细解释看这篇文章:
C语言中字符串赋值处理方式
char *p,a='5';
p=&a; //显然是正确的,
p="abcd"; //但为什么也可以这样赋值??
双引号做了3件事:
1.申请了空间(在常量区),存放了字符串
2. 在字符串尾加上了’/0’
3.返回地址
这里就是 返回的地址 赋值给了 p
【C++ grammar】C++简化内存模型相关推荐
- 深入理解C语言-二级指针三种内存模型
二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {&quo ...
- Swift 对象内存模型探究(一)
MemoryLayout 基本使用方法 HandyJSON 是 Swift 处理 JSON 数据的开源库之一,类似 JOSNModel,它可以直接将 JSON 数据转化为类实例在代码中使用. 由于 S ...
- java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...
JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...
- java线程内存模型_深度解析Java多线程的内存模型
内部java内存模型 硬件层面的内存模型 Java内存模型和硬件内存模型的联系 共享对象的可见性 资源竞速 Java内存模型很好的说明了JVM是如何在内存里工作的,JVM可以理解为java执行的一个操 ...
- Golang面向并发的内存模型
Golang面向并发的内存模型 在早期,CPU都是以单核的形式顺序执行机器指令.Go语言的祖先C语言正是这种顺序编程语言的代表.顺序编程语言中的顺序是指:所有的指令都是以串行的方式执行,在相同的时刻有 ...
- C++ Primer Plus学习(九)——内存模型和名称空间
内存模型和名称空间 单独编译 存储持续性.作用域和链接性 名称空间 单独编译 程序一般可以分为三部分: 头文件:包含结构声明和使用这些结构的函数的原型: 源代码文件:包含与结构有关的函数的代码: 源代 ...
- 【JAVA】Java 内存模型中的 happen-before
前言 Java 语言在设计之初就引入了线程的概念,以充分利用现代处理器的计算能力,这既带来了强大.灵活的多线程机制,也带来了线程安全等令人混淆的问题,而 Java 内存模型(Java Memory M ...
- Java内存模型(JMM)详解
在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型.它们的答案是一致的:能够让我们更好的 ...
- 内卷老员工之java内存模型
java内存模型 java内存模型都不知道,如何内卷老员工 Java 内存模型指 Java 虚拟机如何使用计算机的内存. Java 内存模型指定不同线程如何以及何时可以看到其他线程写入共享变量的值,以 ...
最新文章
- 牛客练习赛79E-小G的数学难题【dp,单调队列】
- python的复数实部和虚部都是整数_Python(一)
- TCPClient、TCPListener的用法
- oracle获取行的值给产量,递归oracle sql识别值
- tkinter的pack布局与place布局结合
- 小程序 - 首次使用
- 计算机网络的DIX,《计算机网络》期末考试试卷(B卷)
- 信号与系统----导论1杂谈为什么要学信号与系统
- 利用Ejb开发WebService
- dotween路径移动_unity 移动物体到指定位置的几种方法
- 长ping域名带时间戳
- cocos2d-x-3.4-025-仿霍比特人3五军之战片尾动画
- laravel安装laravel-s
- Altium Designer——常见贴片钽电容封装尺寸及特性
- 网管员必知:常用电脑密码破解
- Matlab安装失败问题
- PCIe卡知识扫盲:你想了解的都在这里
- mxnet下载与使用
- 山东初二计算机会考,2017山东莱芜初二会考科目时间安排:6月14日
- PHP通过CURL上传图片(微信公众号上传素材)
热门文章
- H5工程师在谷歌浏览器调试并开发原生APP项目的解决办法
- 教你玩转CSS 媒体类型
- routersploit简单实例
- 将 改为c语言表达式,基于c语言表达式求解课程设计修改.doc
- linux blender骨骼绑定,在Linux系统中安装开源3D创建套件Blender的方法
- 从零开始的全栈工程师——html篇1.2
- 浅谈.Net版(C#)的CMP模式
- Java属性中指定Json的属性名称(序列化和反序列化)
- js判断是否在iframe中
- Altium 原理图出现元件“Extra Pin…in Normal of part ”警告的解决方法