当前位置:首页 > 内存 > 正文

函数调用的内存分配

  • 内存
  • 2024-06-09 09:54:49
  • 8203

一、c++中两个局部变量和全局变量,变量名相同,请问内存空间如何分配?第一点:C/C++编译的程序占用的内存分为以下几部分
1.栈区(stack)——由编译器自动分配和释放,其中存储函数参数的值。局部变量的值等它的操作类似于数据结构中的栈。
2.堆区(heap):一般由程序员分配和释放。如果程序员不释放它,当程序结束时它可能会被操作系统回收。
注意,它在数据结构上与堆不同。分配方式类似于链表,哈哈。
3.全局区(静态区)(static)——全局变量和静态变量的存储放在一起初始化的全局变量
和静态变量位于同一个区域。已初始化的全局变量和未初始化的静态变量位于另一个相邻区域。-程序结束时系统释放
4.文字常量区:这里放置常量字符串。当程序结束时,系统会释放它。5.程序代码区:存放函数体的二进制代码。
示例程序:
//
inta=0;全局初始化区
char*p1;未初始化的全局区域
main()
{
intb;stack
chars[]="abc";stack
char*p2;stack
char*p3="123456";123456\0at在常量区中,p3在堆栈上。
staticintc=0;全局初始化区(静态)
p1=(char*)malloc(10);
p2=(char*)malloc(20));
分配的10和20字节的区域位于堆区域。
strcpy(p1,"123456");123456\0放在常量区,编译器可以优化它和p3指向的“123456”同一个
地方。
第二点:关于函数调用:
函数调用时,第一个入栈的就是函数调用之后的那个。主功能。一条指令的地址(函数调用语句的下一条可执行指令),然后是函数的各个参数。在大多数C编译器中,参数是从右到左压入堆栈的,因此函数中的局部变量
。请注意,静态变量不会压入堆栈。
当这个函数调用结束时,首先将局部变量出栈,然后是参数,最后栈顶指针指向它原来存放的地址,即
主函数语句中的下一个元素,程序从此处继续运行。
第三点:关于变量作用域的信息:
变量类别的子类别
静态变量(离开函数,值仍然存在)变量)
局部变量、自动变量
注册表变量
全局变量、静态变量(只能在本文件中使用)
非静态变量(允许从其他文件使用)


二、嵌入式系统、PC系统、BS系统:内存占用的差异

在不同的系统中,函数聚合和内存使用有不同的规则。本文中包含的系统;我们将介绍PC系统和BS系统在功能聚合和内存使用方面的差异。
“嵌入式系统”
在嵌入式系统中,如果只定义一个函数而没有被其他函数调用。这就是“隐形人”!优化系统不会将其包含在最终的可执行结果中;那么什么是内存使用呢?不!
💻PC系统文章💻
在PC世界中,如果一个函数静静地坐在那里而不被调用。系统会继续编译它。通过这种方式,您可以检查功能中的错误。然而,是否将其添加到最终的可执行文件中取决于编译系统的心情。即使它实际上被编译了。PC系统在运行时不会一次性将所有程序加载到内存中。它仍然关注操作系统的界面。
🌐BSSystemRoom🌐
服务器端程序总是被认为有点“贪婪”,因此它们总是占用内存。尤其是在WebService这样的系统中,他们看起来就像一个“独裁总统”。对于客户程序;无论是否被调用,只要涉及到流、加载等操作,都会被代码管理系统预编译。因此,她们也是需要占据记忆的“公主”。