面试题:C++ 内存四区

旅行   2024-10-08 11:55   广东  

欢迎关注本公众号,专注面试题拆解

分享一套视频课程:《C++实现百万并发服务器》 面试需要项目的可以找我获取
,免费分享。 欢迎V:fb964919126







C++ 内存四区





在C++中,程序的内存可以大致分为四个区域来管理不同的数据类型和生命周期。这四个区域分别是:


代码区

这个区域存放的是程序的可执行文件和常量字符串等不会改变的数据。这部分通常是由操作系统加载并管理的。


特点:

只读性:代码区中的内容通常是只读的,因为一旦程序开始执行,代码不应该被修改。这样可以防止程序意外地改变自己的指令序列,从而导致错误的行为。


共享性:如果多个进程运行相同的程序,则它们可以共享同一个代码区。这是因为代码本身不需要为每个进程单独复制一份,操作系统可以为多个进程映射相同的物理页面,这样可以节省内存资源。


包含机器码:代码区包含了已经编译和链接后的机器码指令,这些指令可以直接由处理器执行。


包含常量数据:除了机器码之外,代码区还可能包含一些只读的常量数据,比如字符串字面量或者是其他不会在程序运行过程中改变的数据。


不可写入性:为了保护代码不被篡改,代码区通常是不可写的。这意味着程序不能直接修改其自身的指令。不过,在某些情况下,如JIT(Just-In-Time)编译器或解释型语言的运行时,可能会有技术允许在运行时生成新的代码。


位置独立性:现代编译器和链接器通常会生成位置无关的代码(Position-Independent Code, PIC),这意味着代码可以在内存中的任何位置加载和执行,而不影响其正确性。


加载时初始化:在程序启动时,代码区由操作系统加载到内存中,并且设置为只读属性。这一过程通常在程序启动时完成。

全局区

全局变量和静态变量都存储在这个区域中。全局变量是在程序的生命周期内一直存在,而静态变量则是在声明后一直存在直到程序结束。这个区域的数据一般是在加载程序时分配,并且在整个程序运行期间都不会释放。


全局区的叫法有很多:全局区、静态区、数据区、全局静态区、静态全局区

这部分可以细分为data区和bss区

data区

data区里主要存放的是已经初始化的全局变量、静态变量

bss区

bss区主要存放的是未初始化的全局变量、静态变量,这些未初始化的数据在程序执行前会自动被系统初始化为0或者NULL


栈区

栈是用来存储局部变量(自动变量)的地方,当函数被调用时,其内部的局部变量就会被分配到栈上,函数退出后这些局部变量就会被销毁。栈的特点是先进后出(LIFO),并且由系统自动进行内存管理。


堆区

堆是用来存放通过运算符 new 动态分配的内存块,程序员需要手动进行释放(使用 delete 或 delete[])。堆的特点是可以动态地分配和释放空间,但是需要程序员自己管理,否则容易产生内存泄漏。

总结:

所有的代码包括变量声明、执行语句等最终会被编译并放置在代码区中。


栈区用于存储函数调用时的局部变量和函数参数,其生命周期由编译器自动管理,随着函数的调用和返回而自动分配和释放。


堆区则用于存储通过动态内存分配(如new或malloc)获得的内存,其生命周期由程序员手动控制,需要显式地释放(使用delete或free)。


当程序经过编译后生成了可执行文件(如.exe文件),在程序未执行之前,主要分为代码区和全局区两大部分。代码区包含程序的机器码和常量数据,而全局区则存放全局变量和静态变量。


内存四区的存在使得我们可以根据不同数据的需求赋予其不同的生命周期管理,从而提供了更大的编程灵活性


题外话:需要<<深度探索C++对象模型>>这本书电子版的,加v:fb964919126

end



CppPlayer 



关注,回复【电子书】珍藏CPP电子书资料赠送

精彩文章合集

专题推荐

【专辑】计算机网络真题拆解
【专辑】大厂最新真题
【专辑】C/C++面试真题拆解

CppPlayer
一个专注面试题拆解的公众号
 最新文章