軟件測(cè)試 | 全局變量和局部變量有什么區(qū)別?
它們之間主要的區(qū)別是變量的作用范圍不同。全局變量在全局范圍內(nèi)都有效,而局部變量只在聲明變量的作用域內(nèi)有效。全局變量是屬于實(shí)例的,在初始化對(duì)象的時(shí)候初始化,生命周期與該實(shí)例相同,之所以叫全局變量是因?yàn)樵搶?shí)例中的所有方法或?qū)傩远伎梢砸?;局部變量是在?shí)例方法內(nèi)或Static塊中,聲明周期從調(diào)用該方法到該方法退出,并且只有該方法能夠引用之。全局變量都有可能,一般來(lái)說(shuō)存儲(chǔ)在堆棧段。
操作系統(tǒng)和編譯器通過內(nèi)存分配的位置來(lái)知道全局變量分配在全局?jǐn)?shù)據(jù)段,并且在程序被運(yùn)行的時(shí)候就被加載。
編譯器通過語(yǔ)法詞法的分析,判斷出是全局變量還是局部變量。如果是全局變量的話,編譯器在將源代碼翻譯成二進(jìn)制代碼時(shí)就為了全局變量分配好一個(gè)虛擬地址(Windows 下0x00400000以上的地址,也就是所說(shuō)的全局區(qū)),所以,程序在對(duì)全局變量的操作時(shí)是對(duì)一個(gè)硬編碼的地址操作。
局部變量,編譯時(shí)不分配空間,而是以相當(dāng)于ebp或esp的偏移來(lái)表示局部變量的地址,所以,局部變量?jī)?nèi)存是在局部變量所在的函數(shù)被調(diào)用時(shí)才真正分配。以匯編的角度來(lái)看:函數(shù)執(zhí)行時(shí),局部變量在棧中分配,函數(shù)調(diào)用完畢釋放局部變量對(duì)應(yīng)的內(nèi)存,另外,局部變量可以直接分配在寄存器中。
操作系統(tǒng)通過變量的分配地址就可以判斷出是局部變量和全局變量。