当前位置:首页 » 服务存储 » 静态储存区和常量存储区别
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

静态储存区和常量存储区别

发布时间: 2023-05-19 13:23:12

⑴ 静态数据与动态数据的区别在计算机内存中的存储方式有何不同各有什么缺点

一般认为在c中分为这几个存储区

1栈 - 有编译器自动分配释放

2堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收

3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放

4文字常量区--专门放常量的地方,比如字符串常量。 - 程序结束释放

5代码区 存放程序代码

在函数体中定义的变量通常是在栈上,用malloc, calloc, realloc等分配内存的函数分

配得到的就是在堆上。在所有函数体外定义的是全局量,加了static修饰符后不管在哪

里都存放在全局区(静态区),在所有函数体外定义的static变量表示在该文件中有效,

不能extern到别的文件用,在函数体内定义的static表示只在该函数体内有效。另外,

函数中的"adgfdf"这样的字符串存放在常量区。

=====================================================================

针对你的题目,动态数据存放在堆区或栈区 而静态数据存放在全局区(静态区)

特点:动态数据 由系统自动分配内存或由程序员自主分配
系统自动分配的存放在栈区 一般包括局部变量 函数参数等等
程序员自主分配的存放在堆区 又malloc new等实现
它的生存期是变量的作用域 不是整个程序

静态数据 存放在静态区 和全局变量一个区 它的生存期是整个程序

⑵ c++中的常量和静态有什么区别

在全局域,不管const或是static都代表内存中是唯一。
不同之处在于const是个真正的唯一,不仅有唯一的地址,也有唯一的值;
而static仅仅有唯一的地址,其值可以被改变。
在局部域,比如说类,const丢失了地址的唯一性,保留了值的唯一性,因为一个类有很多个对象,而没个对象的地址肯定不同。
最有趣的是static,成为所有对象公用的一个地址,如果悄陵此时你还喜欢用const static,那还不如使用一个全局的const

关于静态常森运纯量(static const)?
是不该有在这个概念的。
因为,这还不如声明一个 无名enum 或者 无名namespace 好。
常量是说:“不能修改!或强烈建议别修改!”,const仅说明变量(或者函数)的不可修改性(或不修改别人)。
静态是说:“它是在静态数据区的变量”,static影响变量的作用域和存储域。

实际上,C++标准不赞成在名称空间和全局作用域中使用关键字static(该标此咐准使用“不赞成”表明,这种做法,目前合法,但以后很可能将其视为非法)。例如,下面代码:

static int nCount;

int fun1();

int main()

{



}

int fun1()

{



}

C++标准的意思是,程序员应该这样做:

namespace

{

int nCount;

}

int fun1();

int main()

{



}

int fun1()

{



}

⑶ C#中的静态变量和常量有什么具体的区别请详细说一下,我看了概念总感觉这两者很像。

静态变量也是变量,但旦宴芹就这一点就和常量不一样;常量的值是不可改变的,在程序运行的时候祥李就已经模毕决定了它的值;
但是静态变量的值是可以在运行时被更改的,它们唯一的共同点只是在程序的一开始就存在于内存当中,仅此而已

⑷ 静态存储和动态存储的区别

1. 静态内存

静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。

程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会

自动释放所占用的内存空间。

变量的分配与释放,都无须程序员自行考虑。

基本类型,数组

2. 动态内存

用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配。

  • 处理器不工作,电脑什么都做不了。

    处理器的工作就是处理指令(多条指令就构成一个程序)。

    处理器从内存中取指令集(程序)。

    问题是如果断电的话,内存中的指令就会丢失。因而内存归类为“易失性”介质。

    所以我们要把程序、数据存储在不易失性的介质中,比如硬盘和光盘。

⑸ c++全局/静态存储区和常量存储区是一样的吗

当然不一样,下面详细讲解一下内存分配的几个区:
栈:
就是那些由编译器在需要的时候分配,
在不需要的时候自动清除的变量的存储区。
里面的变量通常是局部变量、函数参数等。
在一个进程中,位于用户虚拟地址空间顶部
的是用户栈,编译器用它来实现函数的调用。
和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。

堆:
就是那些由new分配的内存块,他们的释放编译器不去管,
由我们的应用程序去控制,一般一个new就要对应一个delete。
如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
堆可以动态地扩展和收缩。

自由存储区,
就是那些由malloc等分配的内存块,他和堆是十分相似的,
不过它是用free来结束自己的生命的。

全局/静态存储区,
全局变量和静态变量被分配到同一块内存中,
在以前的c语言中,全局变量又分为初始化的
和未初始化的(初始化的全局变量和静态变量在一块区域,
未初始化的全局变量与静态变量在相邻的另一块区域,
同时未被初始化的对象存储区可以通过void*来访问和操纵,
程序结束后由系统自行释放),在C++里面没有这个区分了,
他们共同占用同一块内存区。

常量存储区,
这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改

⑹ 常量存储区和静态存储区有什么区别 static const int a=10;是存到常量存储区还是静态存储区

如楼上所说,常量存储区里面的数据是放在代码段里的,不占内存。静态存储区是在内存空间中的,在其所属的类(或文件)中是全局的。
c语言中const好像没有用处。
static const int a=10;我个人认为是存到静态区的。你可以上网搜一下static const修饰的变量是如何赋初值的,一般有两种方法。一是定义时直接赋初值,二是类外赋初值。而常量是无法用这两种方法赋初值的。

⑺ C语言里,哪些变量是存放在堆里,哪些是存放在栈里

放在堆里的数据是管理员自己开辟空间和释放空间,如,new 和malloc。

而放在栈里的数据时计算机自动分配内存和释放的,如变量。

⑻ c++中的常量和静态有什么区别

"常量"在程序运行时,不会被修改的量。换言之,常量虽然是为了硬件、软件、编程语言服务,但是它并不是因为硬件、软件、编程语言而引入。
常量区分为不同的类型,如25、0、-8为整形常量,6.8、-7.89为实型常量,'a''b'为字符常量。常量一般从其字面形式即可判断。这种常量称为字面常量或直接常量。
静态变量的类型关键字是static。
静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就段做是静态变量,
例如外部变量虽属于静态存储方式,但不一定是静态变量镇燃茄,必须由
static加以定义后才能成为静态外部变量,或称静御察态全局变量。
对于自动变量,它属于动态存储方式。
但是也可以用static定义它为静态自动变量,或称静态局部变量,从而成为静态存储方式。
由此看来,一个变量可由static进行再说明,并改变其原有的存储方式。

⑼ 深入Java对象及元素的存储区域


在JAVA平台上开发应用程序的时候,有一个很大的特点就是其是在应用程序运行的时候才建立对象。换句话说,在程序运行的时候,才会最终确定对象的归属,即对象应该存储在什么地方。由于存储在不同的区域,其在性能上会有所不同。为此作为Java程序开发人员需要了解各个存储区域的特点以及对性能的影响。然后再根据需要来调整应用程序的区域分配。总的来说,在操作系统中有五个地方可以用来保存应用程序运行中的数据。这类区域的特点以及对性能的影响分析如下。
存储区域一:寄存器
虽然同在内存中,但是不同的区域由于用途不同,其性能也有所不同。如就拿Java应用程序来说,寄存器由于其处于处理器的内部,为此这个区域存取数据最快。跟内存中的其他存储区域有着天壤之别。那么我们把所有对象都放到这个区域内,不就可以提高Java应用程序的性能了吗?理论上是如此,但是在现实中是行不通的。因为这个寄存器的数量是非常有限的。在内存中的寄存器区域是由编译器根据需要来分配的。我们程序开发人员不能够通过代码来控制这个寄存器的分配。所以说,这第一个存储区域寄存器,我们只能够看看,而不能够对其产生任何的影响。
存储区域二:堆栈
对象的创建有两种方式,一是在应用程序开发的过程中就创建对象;二是在程序运行的过程中要用到对象的时候再来创建对象。前者比后者性能要高,而后者比前者要灵活。这主要是因为前者创建对象的时候,就是这个堆栈中创建的。虽然其创建的对象没有保存在寄存器中,但是通过这个对象的推栈指针可以直接从处理器哪里获得相关的支持。如堆栈指针往上移动的时候,则释放原有对象占用的内存;如堆栈指针向下移动时,则为对象分配新的内存。所以,如果把对象存放在这个堆栈中,虽然性能没有像存放在寄存器中那么理想,但是仍然比存储在其他地方要好的多。
由于Java程序是在程序运行过程中才根据需要来创建对象。为此对象就不能够保存在这个堆栈中。不过Java应用程序也不能够白白的浪费这个宝贵的空间。为此虽然Java对象本身没有保存在这个堆栈中(不是不保存而是这里没有他的容身之地),但是还是应该把一些可以放的内容放到这个堆栈中,以提高应用程序的性能。如可以把一些对象引用存放在这个堆栈中。
另外对于一些基本的数据类型对象,Java程序也往往把他们放置在堆栈中,以提高数据处理的性能。如一些整数型、字符型的数据对象,这些对象有些共同的特点,如对象比较小、是Java程序提供的标准对象等等。对于这些对象由于每个应用程序基本上都需要用到,而且我们程序开发人员只能够引用这些对象,而不能够对其进行更改弊衡胡。为此Java程序在处理的时候,往往一开始就创建了对象(即直接在堆栈中创建对象并保存),而不像其他对象一样,在需要的时候才创建。只所以在堆栈中创建这些对象,还有一个重要的原因。因为如果在堆栈中创建对象的话,Java编辑器必须知道存储在堆栈内所有数据的确切大小和生命周期。为了得到这些信息,必须产生相关的代码来获得这些信息,以便其操作堆栈指针。普通的对象大小、生命周期等等难以预先获得,为此在堆栈中创建普通的对象,对于Java应用程序来说并不是很合适。相反,这些Java编译器预定义的对象大小并不会随着机器硬件架构的变化和用户需求的变化而变化;而且这些对象往往从始之终都会存在的,所以也不存在生命周期的问题。所以把这些对象放置在堆栈中是合理的,也是可实现的。如此处理,不仅不会影响到对象的灵活性,而且还可以提供比较好的性能。
存储区域三:堆
堆虽然跟堆栈一样,都是随机访问存储器中的区域,但是两者有很大的不同。因为在堆中,没有堆栈指针,为此也就无法直接从处理器那边获得支持。为此其性能跟堆栈比起来,就有一定的差距。通常情况下,除上面所说的一些预定义对象之外,其他的对象都是保存在这个堆中的。或者说,利用new关键字创建的对象都是保存在堆中的。保存在堆中其好处也是显而易见的。如Java编译器不需要知道从堆里需要分配多少存储区域,也不必知道存储的数据在堆里会存活多长时间。所以在拦磨堆里分配存储有很大的灵活性。当需要对象时,我们可以使用New关键字建立一个对象。然后系统会自动给这个对象在堆中分配一个区域让其作为归宿。不过其最大的不足之处,就是在堆中创建租拦对象与分配存储区域,要比在堆栈中慢许多。鱼与熊掌不能兼得呀。
存储区域四:静态存储区域与常量存储区域
在Java对象中有一些特殊的元素。如有些元素是比较特别的(如利用关键字Static定义的变量)。这些变量对于其他对象来说,可能就是静态的。为了更好的管理这些变量,Java在内存中专门划分了一个静态存储区域来管理这些元素。这里的静态存储区域就是指在固定的位置存放应用程序运行时一直存在的数据。这里需要明确的一点就是,Java对象是不保存在这个地方的,而只是把对象中的一些特殊元素放置这里。由于位置固定,所以下次调用的时候就省去了查找的麻烦。为此其对于提供应用程序的性能是有利的。作为我们程序开发人员来说,在书写代码的时候,就需要灵活应用Static这个关键字。笔者的意见是,能用则用;不能用的时候也要想着法儿用。特别是有些元素用不用Static关键字时对于程序功能没有影响,此时我们要理直气壮的在元素前面加上Static关键字。
在Java对象中还有一类特殊的元素,我们叫做常量。由于常量的值是稳定不变的,如圆周率。为此把他们放在代码的内部是可行的。不过有些时候,在进行一些嵌入式系统开发的时候,我们往往不这么做。而是会把常量元素跟代码分开来保存。如我们会根据情况把常量的值存放在一些只读存储器中。这主要是为了一些特殊的功能考虑的。如出于版权控制的需要。如在打印机上为了保护原装耗材的版权,往往把常量跟代码分开存放。
存储区域五:非RAM存储
有时候,有些程序运行所需要的数据我们还会放置在其他地方。如在一些系统中需要用到流对象,这个对象的数据并没有保存在上面所谈到的任何一个存储区域,这个对象直接被转为为字节流,发送到其他的主机上去了。另外有一种叫做持久化的对象,其是被存储在硬盘中的。这些对象平时在应用程序开发过程中用到的并不是很多,大家只需要了解有这些对象的存在即可。等到需要用到的时候,再去深入研究也不迟。
从上面的分析中我们可以看到,对象的归属我们程序开发人员很难控制。寄存器是编译器来管理的。而堆与堆栈又基本上受到开发平台的限制,我们程序人员也没有这个能耐来干涉他们。其实我们主要能够调整与控制的就是第四个存储区域,即静态存储与常量存储。笔者的建议是,对于非嵌入式程序,能够利用静态存储来实现的,就尽量采用静态存储。而对于常量来说,需要根据需要实现的功能来判断是否需要把常量存储在只读存储器中。有时候对于版权的保护等等需要用到这个只读存储器。

⑽ java中静态常量和静态变量的区别

java中静态常量和静态变量的区别

所渣拦属不同:

静态变量属于类,所以也称为为类变量;成员变量属于对象,所以也称为实例变量(对象变量)

在内存中位置不同:

静态变量存储于方法区里的静态区;成员变量存储于堆内存区

在内存中出现的时间不同:

静态变量随着类的加载而加载、随着类的消失而消失;

成员变量随着对象(也叫实例)的创建而存在,随着对象的消失而消失。

调用方式不同:

静态变量可以通过类名调用,也可以通过对象调用; 成员变量只能通过对象名调用。

在静态方法中是没有this关键字的,如何理解呢?

静态变量是随着类的加载而加载,族灶this是随着对象的创建而存在。静态先于对象存在。

静态方法只能访问静态的成员变量和静态的成员方法。

非静态方法,既可以调用静态的成员变量也可以调用非静态的成员变量;

非静兆梁扮态方法既可以调用静态的成员方法,也可以调用非静态的成员方法。