导航:首页 > 源码编译 > 静态变量是在编译时分配内存空间

静态变量是在编译时分配内存空间

发布时间:2022-05-13 14:27:26

‘壹’ 我们经常看到书上面说的 某某变量的内存单元是编译器在编译时候分配的 是什么意思

所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以

明确计算出来,并且不会再改变,因此它们可以直接存放在可执行文件的特定的节里(而且包含初始化的值),程序运行时也是直接将这个节加载到特定的段中,不
必在程序运行期间用额外的代码来产生这些变量。
其实在运行期间再看“变量”这个概念就不再具备编译期间那么多的属性了(诸如名称,类型,作用
域,生存期等等),对应的只是一块内存(只有首址和大小),
所以在运行期间动态申请的空间,是需要额外的代码维护,以确保不同变量不会混用内存。比如写new表示有一块内存已经被占用了,其它变量就不能再用它了;
写delete表示这块内存自由了,可以被其它变量使用了。(通常我们都是通过变量来使用内存的,就编码而言变量是给内存块起了个名字,用以区分彼此)
内存申请和释放时机很重要,过早会丢失数据,过迟会耗费内存。特定情况下编译器可以帮我们完成这项复杂的工作(增加额外的代码维护内存空间,实
现申请和释 放)。从这个意义上讲,局部自动变量也是由编译器负责分配空间的。进一步讲,内存管理用到了我们常常挂在嘴边的堆和栈这两种数据结构。
最后对于“编译器分配空间”这种不严谨的说法,你可以理解成编译期间它为你规划好了这些变量的内存使用方案,这个方案写到可执行文件里面了(该文件中包含若干并非出自你大脑衍生的代码),直到程序运行时才真正拿出来执行。

‘贰’ (C语言)编译时给全局变量和静态变量分配存储空间,运行时给局部变量分配存储空间,这样说对吗

全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间

全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

‘叁’ 静态变量是在编译时分配内存空间,编译时是什么时候编译时都做什么东西啊

静态变量在编译时进行初始化,运行阶段分配内存空间。静态变量在整个程序生命周期都是存在的。

‘肆’ 静态成员在什么时候给分配空间

你这个问题其实差不多就是问静态成员的生存期吧,静态成员变量可以简单的理解为全局变量。全局变量一般是在程序刚开始运行时创建,程序结束时才销毁。因此你在程序的整个运行期内任何时候都可以访问到的。

‘伍’ C++中局部静态变量是在什么时刻产生(分配内存)在编译时,还是等运行到该变量的首次出现时

局部static 变量在程序运行的时候分配空间了,只不过作用域是局部的,生存期和全局变量一样到程序结束

‘陆’ 静态变量在内存哪分配的

内存不止分为堆和栈,还有另外3个区:
|-----------|
|     栈     |
|-----------|
|      |      |
|     \|/     |
|             |
|     /|\     |
|      |      |
|-----------|
|     堆     |
|-----------|
| 未初始化|
|------------|
|    初始化 |
|------------|
|   正文段 |
|------------|
其中栈是由编译器自动分配释放,堆区是程序员申请释放;
全局变量和静态变量是存储的一起的,全局未初始化变量和静态未初始化变量放在未初始化区(又称BSS区),全局初始化变量和静态初始化变量放在初始化区;
代码的二进制存放在正文段。。

‘柒’ 编译器编译高级语言为低级语言的时候,给全局变量或静态变量是如何分配内存的

对于C和C++的编译器,全局变量和静态变量都是在专门的数据区保存的,更具体一点,一般是在.data和.bss段保存的,具体在哪个段,编译器会根据代码中是否对这些变量进行了初始化来决定,如果初始化过,并且初始化的值不为0,那么这个这个变量一般就会被放在编译结果的.data段中,否则就是放在.bss段中。
.data段中就保存变量的符号,还保存变量的初始化值,而在.bss段中,只保存变量的符号,而不保存值,这是因为这部分的变量都将被初始化为0,这也是为什么static声明的变量即使没有初始化也会是0的原因。
这些段都会在程序被执行的时候由操作系统(或链接器)加载到指定的内存中,便完成相应的初始化。

‘捌’ c++编译系统在编译时对静态存储变量分配存储单元吗

是啊,就是在编译的时候分配的么,不过你也可以动态分配,比如malloc函数,这样的内存是在堆中申请的,所以程序执行的时候才会申请,一般的变量什么的,包括数组都是在栈中存放,堆就是要靠用户管理的数据区域,栈则是有系统自动管理的。

‘玖’ C语言中,给变量分配内存是在什么时候是在编译的时候吗

编译只是把源文件翻译成可执行文件,此时如果不运行程序,分配内存干吗?应该是在运行程序时分配内存

阅读全文

与静态变量是在编译时分配内存空间相关的资料

热点内容
ubuntu压缩zip 浏览:2
vigenere算法的方法是什么 浏览:666
pdf保护破解 浏览:341
仿微信聊天系统源码广州公司 浏览:106
怎么查看我的世界服务器日志 浏览:430
怎么从程序员走到成功 浏览:824
把软件放入文件夹中如何移出 浏览:209
红包源码企业即时聊天软件 浏览:581
xp安装python 浏览:10
西门子参数编程读取半径值 浏览:403
洗首饰解压小视频 浏览:966
01背包问题的算法解决 浏览:373
sd卡放哪个文件夹 浏览:301
解释器模式java 浏览:104
android垂直自动滚动条 浏览:153
计算器java小程序 浏览:27
java的简称 浏览:68
云服务器公网ip地址 浏览:581
php对数据库操作 浏览:237
java爬图片 浏览:868