内存模型和名称空间知识点总结

简介: 内存模型和名称空间知识点总结

内存模型和名称空间

内容:

1.单独编译

2.存储持续性,作用域和链接性

3.定位new运算符

4.名称空间

单独编译

1.程序的三个部分

头文件:包含结构声明和使用这些结构的函数的原型

源代码文件:包含与结构有关的函数的代码

源代码文件:包含调用与结构相关的函数的代码

2.请不要将函数定义或者变量声明放在头文件里,这样可能会造成重复定义。除非这个函数是内联函数(什么是内联函数请看对象和类的知识点总结)

3.头文件一般包括

函数原型

结构声明

类声明

模板声明

使用#define或const 定义的符号常量

内联函数

个人理解是前四个不会生成声明的变量,而后两个是因为有特殊的链接属性。

4.#linclude<>在计算机标准的头文件里面寻找。

#include<>在源代码目录下寻找,没有的话再去标准的头文件里面寻找。

5.注意:不要将头文件加入到项目列表里,也不要用#include<>里面包含源文件。

6.为了避免重复定义,C++中采用了

#ifndef
...
#endif

来避免重复定义,它不能避免一个文件被重复包含两次,而只是忽略第一次包含之外的所有内容。

7.在链接编译模块时,要确保所有对象文件或库都是由同一个编译器生成的。

存储的持续性,作用域和链接性

数据保留在内存中的时间

1.自动存储持续性:在函数定义中声明的变量(包括函数参数)的存储持续性为自动的。作用域为创建它的代码块,生命周期也是一样。

2.静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量的存储持续性都为静态。生命周期为主函数存在的时间。

3.线程存储持续性:生命周期为整个线程存在的时间

4.动态粗出持续性:生命周期为程序员掌控,new创建内存,delete释放内存。


可分为

1.代码区:存放函数体二进制代码,有操作系统进行管理

2.全局区:存放全局变量和静态变量和常量。该区域数据在程序结束后由操作系统释放。

3.栈区:由编译器自动释放,存放函数的参数值,局部变量

4.堆区:由程序员分配和释放。


作用域和链接

1.函数的作用域是全局的,不能是局部的。

2.存储方式是通过存储持续性,作用域和链接性来描述的。

3.C++中的auto关键字有指出某个变量为自动存储,例如:

auto float ford;

4.静态持续变量有三种链接性:外部链接性(可在其他文件中访问),内部链接性(只能在当前文件访问),无链接性(只能在当前函数和代码块访问)。

5.

...
int global = 1000;
static int one_file = 50;
int main()
{
....
}
void function(int n)
{
static int count = 0;
int llama;
}

global (外部链接),one_file(内部链接),count(无链接) 都是静态持续但是链接性不同,生命周期都是整个程序运行时存在。所有的静态变量在未初始化前都是默认为0


静态持续性,外部链接性

相当于全局变量。

1.单定义规则要求全局变量(外部变量)是一次定义的,如果要在其他文件当中使用这个全局变量,必须在前面加extern来引用这个变量。

2.在同一个文件下,可以在不同的cpp实现不同的功能,例如在一个cpp文件里面写函数声明,可以在另外一个cpp文件里写函数实现。注意是两个cpp,但是一般不这样做。都是将函数声明写在头文件里面。

3.可以在一个文件里面使用extern表明使用的全局变量。


静态持续性,内部链接性

加限定符static后作用域为整个文件,为内部链接性。

外部链接性的变量可以被其他文件使用,但是内部链接性变量只能被声明它的文件使用。

1.static 关键字表明在这个cpp文件里面一直存在,但是在其他cpp文件里面就不存在,还是可以继续声明相同的变量名。但是没有static关键字就不行。


静态持续性,无链接性

在代码块中声明的变量并且在变量名前加了static关键字,这个属于无链接性,代码块活动时它存在,代码块不活动时它也存在。


个人对这三种静态存储持续性理解:

有外链接性在函数体外声明并且不加static关键字->用于不同的cpp文件之间

有内链接性在函数体外声明并且加有static关键词->用于不同的函数体之间。

无链接性在函数体内部声明并且加有static关键词->用于对同一个函数的多次调用。


说明符和限定符

存储说明符(同一个声明中不能有多个说明符,但是thread_local 除外,它可跟static和extern结合使用)

auto用于自动类型推导

register显示的指出变量是自动的

static 全局声明的时候为内部链接性,在局部声明时表明局部变量是静态存储

extern表明的是引用声明

thread_local在线程中相当于常规静态变量

mutable在用const声明的函数时可以修改被mutable说明的变量。


1.const修饰的全局变量的链接性是内部的


函数和链接性

1.C++不允许在一个函数中定义另一个函数,所以所有的函数的存储持续性都=自动为静态的。


new运算符和定位new运算符

使用new运算符的时候自动在堆区寻找到一个存储空间存储,释放的时候用delete,但是使用定位new运算符的时候必须包含new头文件并且指定存储在哪个空间里面,例如:

#include<new>
char buffer2(500);
....
p4 = new(buffer2)int[20];
##  名称空间
为了避免变量,函数,结构,枚举,类以及类和结构的成员名称的冲突问题。
声明区域:声明区域是可以在其中进行声明的区域
潜在作用域:变量的潜在作用域从声明的区域开始,到其声明区域的结尾。
作用域:变量对程序而言可见的区域。
1.名称空间可以是全局的,可以在另一个名称空间里面声明,但是不能在代码块里面声明。
###  using声明和using编译指令
using 声明将特定的名称添加到它所属的声明区域中。
using编译指令使在该名称空间中的全部名称都可以使用。
两者的比较
1.using声明像是在函数里面声明一样,而using编译指令就像是大量的使用::运算符。
2.在使用了using编译指令后,如果在局部函数里面继续声明与所编译的名称空间相同的变量,则会隐藏名称空间的变量,而不会报错,但是使用using声明就会报错。所以使用using声明比使用using编译指令要安全一点。




目录
相关文章
|
3月前
|
存储 开发框架 .NET
"揭秘.NET内存奥秘:从CIL深处窥探值类型与引用类型的生死较量,一场关于速度与空间的激情大戏!"
【8月更文挑战第16天】在.NET框架中,通过CIL(公共中间语言)可以深入了解值类型与引用类型的内存分配机制。值类型如`int`和`double`直接在方法调用堆栈上分配,访问迅速,生命周期随栈帧销毁而结束。引用类型如`string`在托管堆上分配,堆栈上仅存储引用,CLR负责垃圾回收,确保高效且自动化的内存管理。
55 6
|
19天前
|
存储 缓存 算法
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
JVM核心知识点整理(内存模型),收藏再看!
|
4月前
|
存储 算法 安全
Java面试题:Java内存模型及相关知识点深度解析,Java虚拟机的内存结构及各部分作用,详解Java的垃圾回收机制,谈谈你对Java内存溢出(OutOfMemoryError)的理解?
Java面试题:Java内存模型及相关知识点深度解析,Java虚拟机的内存结构及各部分作用,详解Java的垃圾回收机制,谈谈你对Java内存溢出(OutOfMemoryError)的理解?
65 0
|
2月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
106 5
|
3月前
|
算法 安全 UED
探索操作系统的内核空间:虚拟内存管理
【7月更文挑战第50天】 在现代操作系统中,虚拟内存管理是核心功能之一,它允许操作系统高效地使用物理内存,并为应用程序提供独立的地址空间。本文将深入探讨操作系统虚拟内存管理的机制,包括分页、分段以及内存交换等关键技术,并分析它们如何共同作用以实现内存的有效管理和保护。通过理解这些原理,读者可以更好地把握操作系统的内部工作原理及其对应用程序性能的影响。
|
4月前
|
Java fastjson C++
JVM内存问题之JVM中元空间持续增长并且GC无法释放的原因可能是什么
JVM内存问题之JVM中元空间持续增长并且GC无法释放的原因可能是什么
137 2
|
4月前
|
运维 DataWorks 安全
DataWorks产品使用合集之如何查看空间资源、CPU、内存和存储空间容量
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
5月前
|
算法 Java
垃圾回收机制(Garbage Collection,GC)是Java语言的一个重要特性,它自动管理程序运行过程中不再使用的内存空间。
【6月更文挑战第24天】Java的GC自动回收不再使用的内存,关注堆中的对象。通过标记-清除、复制、压缩和分代等算法识别无用对象。GC分为Minor、Major和Full类型,针对年轻代、老年代或整个堆进行回收。性能优化涉及算法选择和参数调整。
68 3
|
4月前
|
机器学习/深度学习 分布式计算 大数据
MaxCompute产品使用合集之如何查看空间资源、CPU和内存以及存储空间容量
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。