首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

static 局部变量存在那个位置?该怎么解决

2013-04-05 
static 局部变量存在那个位置?如题 我自己查资料得出的结果是在静态区但是有人跟我说是在堆区,这让我感到

static 局部变量存在那个位置?
如题 


我自己查资料得出的结果是在静态区

但是有人跟我说是在堆区,这让我感到很诧异,这到底是怎么一回事?
[解决办法]
这具体得看编译器的实现吧。有的编译器会把只读段和代码段合并。
[解决办法]
可以放在全局区
[解决办法]
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。  程序结束后由系统释放
[解决办法]
请参考:
一个进程在内存中的布局
[解决办法]
全局变量和静态数据都在全局数据区。即使是函数内部的静态局部变量也是如此。
[解决办法]

引用:
引用:
堆区和栈区有啥区别


栈区:存局部变量,定义的参数,比如int,char之类的,在函数结束时,系统会自动收回存储单元。
堆区:new,malloc等动态开辟的存在堆,函数结束时,需要我们用delete、free手动释放存储区。


学习了.
再补个静态区
全局变量和静态变量都存储在静态区。
分两块。一块是存已经初始化的。一块是没初始化的
[解决办法]
jvm把对象信息与成员属性值保存在堆内存
      类信息包括接口定义、类定义、方法定义、static块、静态变量,都保存在方法区又叫代码段。这个区貌似不能gc,出现的OutOfMemberError PermGen overflow就是指要加载的字节码信息所需要的总内存大小已经超出这一区定义的最大值,可以在启动jvm时指定PermGen的最大值。
     栈内存就是方法调用所占用的内存,基本类型变量和方法调用时所引用的各种对象地址保存在此处,以及方法调用产生的方法调用地址信息都保存在栈内存。如果方法调用层次过多,会发生OutOfMemoryError Stack Overflow。递归层数太多时可能会发生这一错误。jvm为每个线程创建一个栈,也就是说同一线程内的所有方法调用共用一个栈,从jdk6开始每创建一个线程默认为线程分配1M内存的栈。可以在启动jvm时指定栈内存的最大最小值。
     堆内存保存java所有对象信息,包括成员属性和对象本身所占用的空间。一个Object对象占用8字节,也是一个没有任何属性的对象所占用的最小字节。Integer对象占用4+8字节,Long对象占用8+8字节。一个对象所占用的全部内存数是它在堆内存中占用的字节数+所有这个对象的引用所占用的字节数。jvm为每个引用分配4字节(32位机的内存寻址位数就是32位刚好4字节)。
     一个jvm进程占用的内存总数是jvm自身消耗的内存+堆内存+所有栈内存的和+方法区所占用的内存。sun的jvm实现,hotspot严格区分这几部分内存,互不干扰。
    通常说的gc就是回收堆内存。栈内存不需要回收,因为随着方法执行,不断伴随着入栈出栈,方法返回时,方法占用的栈内存就被自动释放了。jvm自身消耗的内存由jvm自己管理。方法区占用的内存似乎还不能回收,我也不确定,我看过的文章有不同的说法,有说直到jdk6还不能回收的,有说jdk5以前不能回收的。
[解决办法]
用错标签了,不好意思。。

TITLEb.c
.386P
include listing.inc
if @Version gt 510
.model FLAT
else
_TEXTSEGMENT PARA USE32 PUBLIC 'CODE'
_TEXTENDS
_DATASEGMENT DWORD USE32 PUBLIC 'DATA'
_DATAENDS
CONSTSEGMENT DWORD USE32 PUBLIC 'CONST'
CONSTENDS
_BSSSEGMENT DWORD USE32 PUBLIC 'BSS'
_BSSENDS
_TLSSEGMENT DWORD USE32 PUBLIC 'TLS'
_TLSENDS
FLATGROUP _DATA, CONST, _BSS
ASSUMECS: FLAT, DS: FLAT, SS: FLAT
endif
PUBLIC_g_f
;---------------------------------数据段 start
_DATASEGMENT
COMM_g_e:DWORD                ;g_e
_scDD05H                       ;sc
_g_fDD03H                   ;g_f
_?sg@?1??main@@9@9 DD 0aH         ;sg
_DATAENDS
;-------------------------------数据段 end
PUBLIC_main
;-------------------------------BSS段 start
;BSS(Block Started by Symbol)通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。
;注意和数据段的区别,BSS存放的是未初始化的全局变量和静态变量,数据段存放的是初始化后的全局变量和静态变量。


_BSSSEGMENT
_sdDD01H DUP (?)               ;sd
_?sh@?1??main@@9@9 DD 01H DUP (?) ;sh
_BSSENDS
;------------------------------BSS段 end
_TEXTSEGMENT
_a$ = -4
_b$ = -8
_mainPROC NEAR
; File b.c
; Line 10
pushebp
movebp, esp
subesp, 8
; Line 14
movDWORD PTR _a$[ebp], 25; 00000019H
; Line 17
movDWORD PTR _?sh@?1??main@@9@9, 100; 00000064H
; Line 18
movDWORD PTR _sd, 20; 00000014H
; Line 19
movDWORD PTR _g_e, 30; 0000001eH
; Line 21
movDWORD PTR _b$[ebp], 18; 00000012H
; Line 23
movesp, ebp
popebp
ret0
_mainENDP
_TEXTENDS
END



[解决办法]
内存分配方式有三种:
(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

热点排行
Bad Request.