⑴ (C语言)编译时给全局变量和静态变量分配存储空间,运行时给局部变量分配存储空间,这样说对吗
全局变量,静态局部变量,静态全局变量都在静态存储区分配空间,而局部变量在栈里分配空间
全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
⑵ C++类类型在说明时编译器会给它开辟什么内存空间
在你的类中由于你没有编写你自己的默认构造函数,所以执行语句A a1,a2,a3;时编译器会调用编译器提供的默认构造函数来生成三个对象。此时已经分配了内存空间,这些空间位于栈上,如果你用的是new关键字的话,这些内存将在自由存储空间里面分配,也就是在堆上,在C++中,程序员在堆上申请的内存空间,要自己负责释放。
楼上的讲错了。
类的成员函数在内存中只有一份拷贝,而数据成员是每一个对象都有一份自己单独拷贝,并且就是靠这些属性来区分对象。
正是由于在成员函数中隐藏了this指针,所有成员函数会自动跟踪对象。
⑶ C语言里面的数组都是在编译的时候就分配好内存的吗
编译的时候 只是确定了内存的大小
实际分配还是在运行时分配的
否则 无数的C语言程序 每一个都分配一段内存
却不运行 电脑受不了的
⑷ java中的全局变量和静态变量是在编译时分配内存还是在加载时分配内存
全局变量是在创建对象的时候分配内存的 创建对象过程为
分配空间。
递归的创建父类对象。
初始化成员变量。
调用构造方法创建一个对象。
静态变量是在类加载的时候分配空间的,静态变量和对象没有关系 是在JVM第一次读到一个类的时候加载信息的过程中分配空间的 加载过程为
1 .加载父类(如果父类已经加载过,则不在加载)。
2.初始化静态属性 。
3 .按顺序的初始化静态代码块 初始化的前提就是分配空间 。
而且静态变量在以后的创建对象的时候不在初始化 所以一般用静态来保存共享信息
⑸ 关于编译过程中分配内存的问题
好吧,问题没看清楚.
他所谓的编译时候分配的内存,其实就是你exe运行前的准备工作.
这些东西操作系统也能帮你做到.
你那书是把编译和调试归为一体了,所以对于他来说,编译就会运行程序...
编译只是为了生成exe文件,而exe文件是放在硬盘上的.
所以,你重启之后exe还在,运行exe之后,才分配内存
⑹ 给变量分配内存单元是在什么时候进行的
这个涉及到局部变量还是全局变量的问题,函数中的变量属于局部变量,所以再调用到之后才开辟内存空间,但局部变量所在函数调用完毕,局部变量就被取消了,然后所占内存就被收回了。 而全局变量由于作用域很广,一旦定义,编译器就会分配内存,程序运行期间这块内存单元一直有效,直到整个程序结束才由系统收回内存~~
⑺ 编译时分配内存和运行时分配内存
编译其实只是一个扫描过程,进行词法语法检查,代码优化而已,编译程序越好,程序运行的时候越高效。
我想你说的“编译时分配内存”是指“编译时赋初值”,它只是形成一个文本,检查无错误,并没有分配内存空间。
当你运行时,系统才把程序导入内存。一个进程(即运行中的程序)在主要包括以下五个分区:
栈、堆、bss、data、code
代码(编译后的二进制代码)放在code区,代码中生成的各种变量、常量按不同类型分别存放在其它四个区。系统依照代码顺序执行,然后依照代码方案改变或调用数据,这就是一个程序的运行过程。
⑻ C++中,只有类,没有对象,编译时是否会赋予类被分配空间的能力
你说的“空间”看来是指数据呢。那确实是不会。
另外对于函数,没有被调用到,运行时就不会给它分配对应空间,这指的也是数据空间
代码空间的话,类或者函数,都有。
⑼ c语言中编译系统和操作系统谁为变量分配相应的存储空间
编译系统将程序编译成可执行代码
操作系统执行程序,按照可执行代码需求为程序分配代码空间、常量空间、变量空间、堆栈空间,然后执行程序。
⑽ c语言哪些占程序空间哪些占内存空间
一个由C/C++编译的程序占用的内存分别为以下四个部分:
程序代码区:存放程序的二进制代码。
静态数据区:存放程序运行期间用到的数据。其存储空间是在编译时分配的,在整个程序执行期间静态数据区中的数据一直存在,程序结束后由系统释放。
动态内存区(也称栈):也存放程序运行期间用到的数据,其存储空间在程序运行期间由编译器自动分配释放,其生命周期短于程序的运行期。
堆区:由程序员分配释放,若程序员不释放,程序结束时可能由系统回收。
以上内容抄自课本《C语言与程序设计》(电子工业出版社)