⑴ 靜態數據與動態數據的區別在計算機內存中的存儲方式有何不同各有什麼缺點
一般認為在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是隨著對象的創建而存在。靜態先於對象存在。
靜態方法只能訪問靜態的成員變數和靜態的成員方法。
非靜態方法,既可以調用靜態的成員變數也可以調用非靜態的成員變數;
非靜兆梁扮態方法既可以調用靜態的成員方法,也可以調用非靜態的成員方法。