2020年2月21日
摘要: 如果一个指针指向的内存没有访问权限,或者指向一块已经释放的内存,那么就无法对该指针进行操作,这样的指针称为野指针。 规避野指针 指针变量如果暂时不需要赋值,以定要初始化为nullptr,因为任何指针变量被创建时不会自动成为nullptr,它的缺省值是随机的。 当指针指向的内存被释放时,要将指针的值设 阅读全文
posted @ 2020-02-21 22:31 xiaobaizzZ 阅读(431) 评论(0) 推荐(0)
摘要: 在进程的地址空间中,代码区、常量区、全局数据区的内存在程序启动时就已经分配好了,它们大小固定,不能由程序员分配和释放,只能等程序运行结束由操作系统回收,这称为静态内存分配。 栈区和堆区的内存在程序运行期间可以根据实际需要来分配和释放,不用在程序刚启动就备足所有内存。这称为动态内存分配。 堆和栈的区别 阅读全文
posted @ 2020-02-21 22:26 xiaobaizzZ 阅读(404) 评论(0) 推荐(0)
摘要: 函数的调用和栈是分不开的。 栈帧/活动记录 当发生函数调用时,会将函数运行需要的信息全部压入栈中,这常常被称为栈帧(Stack Frame)或活动记录(Activate Record)。 活动记录一般包含以下几个方面: 1.函数的返回地址,也就是函数执行完成后从哪里开始执行后面的代码。 func() 阅读全文
posted @ 2020-02-21 22:06 xiaobaizzZ 阅读(1118) 评论(0) 推荐(0)
摘要: 程序的虚拟地址空间分为多个区域,栈是其中地址较高的一个区域。 栈可以存放函数参数、局部变量、局部数组等作用范围在函数内部的数据,它的作用就是完成函数的调用。 栈的概念 栈溢出(Stack Overflow) 对于每个程序来说,栈能使用的内存是有限的,一般是1M 8M,这在编译时就已经决定了,程序运行 阅读全文
posted @ 2020-02-21 21:42 xiaobaizzZ 阅读(837) 评论(0) 推荐(0)
摘要: 进程 一个具有一定独立功能的程序在一组数据集合上的一次动态执行过程。 进程最显著的特点是拥有独立的地址空间。 内核模式 内核空间存放的是操作系统内核代码和数据,是被所以程序共享的。 操作系统禁止用户进程直接访问内核空间。 用户进程调用系统调用(System Call)来访问内核空间。 用户模式 用户 阅读全文
posted @ 2020-02-21 21:24 xiaobaizzZ 阅读(455) 评论(0) 推荐(0)
摘要: 内存模型(Memory Model) 程序内存在地址空间中的分布情况称为内存模型 内存模型由操作系统构建,并且会受到编译模式的影响。 内核空间和用户空间 Windows默认情况下会将高地址的2GB分配给内核 Linux默认情况下会将高地址的1GB分配给内核 Linux下32位环境的用户空间内存分布情 阅读全文
posted @ 2020-02-21 18:25 xiaobaizzZ 阅读(444) 评论(0) 推荐(0)
摘要: MMU负责将虚拟地址映射为物理地址 对内存权限的控制 MMU除了能够完成虚拟地址到物理地址的映射,还能够对内存权限进行控制。 操作系统在构建页表时将内存权限定义好,当MMU对虚拟地址进行映射时,首先检查当前程序是否有权限使用,如果有,就完成映射,如果没有,就产生一个异常,并交给操作系统处理。 阅读全文
posted @ 2020-02-21 18:21 xiaobaizzZ 阅读(737) 评论(0) 推荐(0)
摘要: 计算机内存是以字节(Byte)位单位划分的。 CPU通过地址总线来访问内存,64位的CPU一次可以处理8个字节的数据,那么就从内存读取8个字节的数据,少了浪费主频,多了没有用。 阅读全文
posted @ 2020-02-21 17:42 xiaobaizzZ 阅读(332) 评论(0) 推荐(0)
摘要: 虚拟地址空间:就是程序可以使用的虚拟地址的有效范围。虚拟地址空间的大小由操作系统决定,但还会受到编译模式的影响。 CPU的数据处理能力 地址总线:用于在内存上定位数据,例如:地址总线有20根,寻址能力为2^20 = 1MB 数据总线:位于主板之上,不在CPU中,用于在CPU和内存之间传输数据。决定了 阅读全文
posted @ 2020-02-21 17:10 xiaobaizzZ 阅读(711) 评论(0) 推荐(1)
摘要: 在C语言中,指针变量的值就是一个内存地址,&运算符的作用也是取变量的内存地址。 include using namespace std; int a = 1, b = 255; int main(){ int pa = &a; cout 中间层思想 使不同程序的地址空间相互隔离 提高内存使用效率 阅读全文
posted @ 2020-02-21 16:37 xiaobaizzZ 阅读(365) 评论(0) 推荐(0)
摘要: 程序是保存在硬盘中的,要载入内存才能运行,CPU也被设计为只能从内存中读取数据和指令。 阅读全文
posted @ 2020-02-21 16:20 xiaobaizzZ 阅读(1955) 评论(0) 推荐(0)
摘要: 类只是一个模板(Template),编译后不占用内存空间,所以在定义类时不能对成员变量进行初始化,因为没有地方存储数据。 只有在创建对象以后才会给成员变量分配内存,这个时候就可以赋值了。 栈上创建对象:有名字。 堆上创建对象:没有名字,没法直接使用,必须要用一个指针指向它,再借助指针来访问它的成员变 阅读全文
posted @ 2020-02-21 16:01 xiaobaizzZ 阅读(108) 评论(0) 推荐(0)
摘要: 深拷贝+浅拷贝(C++、python) lambda表达式 inline函数 const引用 只能指针 阅读全文
posted @ 2020-02-21 00:32 xiaobaizzZ 阅读(197) 评论(0) 推荐(0)
摘要: C++中的const更像编译阶段的 define 变量是要占用内存的,即使被const修饰也不例外。m,n两个变量占用不同的内存,int n = m;表示将m的值赋给n。 在C语言中,编译器会先到m所在的内存取出一份数据,再将这份数据赋给n; 在C++中,编译器会直接将10赋给m,没有读取内存的过程 阅读全文
posted @ 2020-02-21 00:17 xiaobaizzZ 阅读(131) 评论(0) 推荐(0)