青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

SmartPtr
本博客已搬至:http://www.cnblogs.com/baiyanhuang/
posts - 29,comments - 176,trackbacks - 0
By SmartPtr(http://m.shnenglu.com/SmartPtr/) 
 
 今天收到學(xué)弟的一封信,問我關(guān)于變量與內(nèi)存的一些問題,其實這是一個很基本的概念,但可能還有很多人對這個還不太了解(包括自己可能也會有誤解的地方),遂將原信與回信放于此:
  
原信
問幾個我比較混亂的問題。
看一下我寫的對不對
int g_variable; //占編譯后的代碼空間,運(yùn)行時占內(nèi)存(常住內(nèi)存)
const int c_value = 5;    //占編譯后的代碼空間, 是不是常住內(nèi)存呢?
void fun(void)
{
static int s_variable;    //占編譯后的代碼空間,運(yùn)行時占內(nèi)存(常住內(nèi)存)
int variable;    //fun 被調(diào)用時放入棧中(占用內(nèi)存)
}
如果我定義一下大一點的數(shù)組,如:
const int c_array[100] = ...;
程序一運(yùn)行時就會被分配 400 Byte 的內(nèi)存空間嗎?還是在我使用它時會被分配400 Byte 的內(nèi)存空間嗎?

回信
先給你大概講一下基本概念, 問題在原信下用紅色回答
 
一個程序的運(yùn)行起來后,其在內(nèi)存中有5個區(qū)域
1. 程序代碼區(qū)
這個很簡單,存放執(zhí)行指令,代碼要執(zhí)行,肯定要加載進(jìn)內(nèi)存, 我們不必關(guān)心。
 
2. 文字常量區(qū)
一般我們這樣定義一個字符串時,其是在文字常量區(qū)的:
char* s1 = "hello, world";
char* s2 = "hello, world";
if(s1 == s2)
  printf("s1和s2指向同一個在文字常量區(qū)的字符串");
 
這里, s1和s2指向的是同一個字符串
 
3. 靜態(tài)存儲區(qū)
全局變量,靜態(tài)變量會放在這個區(qū)域,事實上,全局變量也是靜態(tài)的。
 
以上1,2,3三個區(qū)域的內(nèi)存在程序起來的時候就開辟好了的。
 
4. 棧
局部變量就是在棧里的。另外,函數(shù)調(diào)用時的參數(shù)也是在棧里的,這個現(xiàn)在不必關(guān)心
 
5. 堆
malloc或new出來的內(nèi)存就是在堆里的,需要程序員自己管理清除。


**********原信***************************************************

問幾個我比較混亂的問題。
看一下我寫的對不對
 
int g_variable; //占編譯后的代碼空間,運(yùn)行時占內(nèi)存(常住內(nèi)存)
[Huang]屬于3,程序一運(yùn)行就占內(nèi)存,知道程序退出才釋放
 
const int c_value = 5;    //占編譯后的代碼空間, 是不是常住內(nèi)存呢?
[Huang]其實這個與是否const無關(guān),如果這句是全局的,那么同上,如果是局部的,那么屬于4
 
void fun(void)
{
static int s_variable;    //占編譯后的代碼空間,運(yùn)行時占內(nèi)存(常住內(nèi)存)
int variable;    //fun 被調(diào)用時放入棧中(占用內(nèi)存)
}
[Huang]第一句屬于3, 第二句屬于4
 
如果我定義一下大一點的數(shù)組,如:
 
const int c_array[100] = ...;
 
程序一運(yùn)行時就會被分配 400 Byte 的內(nèi)存空間嗎?還是在我使用它時會被分配400 Byte 的內(nèi)存空間嗎?
[Huang]還是那句話,是全局的,那么 程序一運(yùn)行時就會被分配 400 Byte 的內(nèi)存空間, 如果是局部的,那么在我使用它時會才會被分配400 Byte 的內(nèi)存空間
 
你這里多次提到const, 其實const與這個主題并沒有關(guān)系。的確,const與static聲明的全局變量具有內(nèi)部鏈接的特性,但是即使在每個obj里都有一個此變量的拷貝,也不影響其內(nèi)存在靜態(tài)區(qū)的分配。
posted on 2007-09-13 00:01 SmartPtr 閱讀(1154) 評論(5)  編輯 收藏 引用

FeedBack:
# re: 答學(xué)弟問之變量與內(nèi)存問題
2007-09-13 00:36 | aGAric
還有一點,如果你的全局變量是初始化過的
比如
staitc int array[100] = {0};

那么你的編出來的.o ,或者是.exe也會大出 100*sizeof(int)。 如果沒有初始化,那么他們放在bss段,就不占程序code的大小了。

const 還是有區(qū)別的, const的變量可能是在只讀的數(shù)據(jù)區(qū)域。  回復(fù)  更多評論
  
# re: 答學(xué)弟問之變量與內(nèi)存問題
2007-09-13 09:05 | SmartPtr
我的理解是這樣的:
1. 靜態(tài)存儲區(qū)又分為靜態(tài)初始化存儲區(qū)和靜態(tài)未初始化存儲區(qū),正如你說的,前者對應(yīng).data段,后者對應(yīng)bss段, 但是不論在哪個段,都要占程序內(nèi)存空間的吧

2. const變量應(yīng)該只是編譯器語法上的一個限制,數(shù)據(jù)會在哪個存儲區(qū)并不由其決定, 事實上, 繞過C++語法,改變const值是很容易的:
const int ci = 10;
__asm
{
mov eax, 100;
mov ci, eax;
}  回復(fù)  更多評論
  
# re: 答學(xué)弟問之變量與內(nèi)存問題
2007-09-13 23:27 | aGAric
bss段只記著這里有一個數(shù)組,大小是多少就占一點空間,data段里面需要占用整個變量的大小。

某些編譯器的實現(xiàn),確實會把const 的數(shù)據(jù)放在只讀段, 你當(dāng)然可以寫那個地址,但系統(tǒng)可能會拋出一個異常。  回復(fù)  更多評論
  
# re: 答學(xué)弟問之變量與內(nèi)存問題
2008-08-19 11:42 | Matrix
這樣改不了const的值哇@SmartPtr
  回復(fù)  更多評論
  
# re: 答學(xué)弟問之變量與內(nèi)存問題
2008-09-17 22:54 | Dandelion
添加volatile關(guān)鍵字,就看到了
const volatile int ci = 10;
__asm
{
mov eax, 100;
mov ci, eax;
}

不加volatile關(guān)鍵字的話,編譯器發(fā)現(xiàn)在自己的可見范圍內(nèi)ci沒有被改變,于是就假設(shè)_asm{}之后ci的值沒變,導(dǎo)致生成的匯編代碼為:
push 0Ah

加了關(guān)鍵字后,編譯器就不會對ci做任何的假設(shè),于是生成的匯編代碼變成了這樣:
mov eax,dword ptr[i]
push eax  回復(fù)  更多評論
  

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品卡一卡二| 亚洲精品色图| 日韩一级黄色大片| 美女在线一区二区| 日韩手机在线导航| 亚洲国产天堂久久综合| 久久网站免费| 亚洲欧美日韩综合| 亚洲精一区二区三区| 国产综合亚洲精品一区二| 久久一二三区| 亚洲天堂成人| 久久激情婷婷| 麻豆精品91| 亚洲国产婷婷| 亚洲午夜精品一区二区三区他趣 | 欧美激情一区二区三区成人| 亚洲成人在线视频播放 | 久久理论片午夜琪琪电影网| 亚洲欧美日韩第一区| 国产一区二区三区四区| 欧美日韩视频第一区| 欧美韩日一区二区| 国产精品第一页第二页第三页| 国产精品另类一区| 一区二区在线观看视频在线观看| 国产色综合久久| 夜夜嗨av一区二区三区| 欧美在线观看视频| 欧美日韩国内| 在线观看亚洲视频啊啊啊啊| 亚洲精选91| 欧美在线网站| 午夜一级在线看亚洲| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲精品日日夜夜| 久久精品一区二区国产| 久久久精品国产免大香伊| 国产精品99久久久久久久久| 亚洲国产女人aaa毛片在线| 99国产精品久久久久久久久久| 一个人看的www久久| 免费亚洲一区| 国产精品久久二区二区| 亚洲视频免费在线| 欧美v日韩v国产v| 亚洲激情二区| 亚洲亚洲精品三区日韩精品在线视频| 欧美中文日韩| 亚洲第一精品夜夜躁人人爽| 91久久午夜| 亚洲破处大片| 国产精品视频网| 欧美激情第三页| 国产精品多人| 亚洲专区一二三| 亚洲欧美日韩在线高清直播| 亚洲国产精品久久久| 久久久国产精品亚洲一区| 久久久www免费人成黑人精品| 亚洲九九精品| 久久九九国产精品| 久久精品国产亚洲aⅴ| 久热精品视频| 欧美一区二区三区在线观看视频| 久久视频在线看| 亚洲欧美日韩一区二区在线| 亚洲男人的天堂在线| 一区在线视频| 亚洲欧洲在线视频| 亚洲经典自拍| 亚洲视频观看| 欧美日本高清一区| 亚洲色诱最新| 亚洲精品视频免费观看| 欧美成va人片在线观看| 亚洲另类视频| 亚洲国产日本| 在线观看亚洲精品| 久久久久久成人| 午夜在线视频观看日韩17c| 欧美视频一区二区三区…| 卡一卡二国产精品| 亚洲国产精品成人| 欧美激情中文字幕在线| 99精品视频一区二区三区| 亚洲一区久久久| 亚洲福利视频一区二区| 鲁鲁狠狠狠7777一区二区| 午夜亚洲激情| 欧美午夜精品久久久| 久久久久久久久久看片| 国产视频一区欧美| 亚洲无毛电影| 日韩视频在线播放| 亚洲欧美日韩天堂一区二区| 亚洲免费婷婷| 欧美日韩性视频在线| 美女精品视频一区| 日韩视频欧美视频| 国产精品久久久久一区| 欧美亚洲系列| 欧美成人午夜激情| 一区二区三区高清不卡| 国产一区二区欧美| 久久这里有精品15一区二区三区| 国产精品久久久久久久一区探花 | 欧美在线观看视频一区二区| 国产婷婷精品| 欧美日本在线播放| 欧美激情综合网| 久久米奇亚洲| 香蕉视频成人在线观看| 欧美日韩国产a| 国产精品久久精品日日| 国产精品免费福利| 亚洲一区尤物| 亚洲精品视频啊美女在线直播| 国产一区二区三区在线观看视频 | 午夜精品国产更新| 亚洲第一黄网| 欧美亚男人的天堂| 久久精品一区| 亚洲免费在线观看| 亚洲久久一区二区| 亚洲国产精品电影在线观看| 一区二区久久久久| 欧美日韩一区成人| 国产精品一二三| 国产在线一区二区三区四区| 国产精品色婷婷| 亚洲福利在线视频| 在线一区视频| 久久aⅴ乱码一区二区三区| 亚洲欧洲在线视频| 日韩午夜电影av| 欧美在线一二三四区| 米奇777超碰欧美日韩亚洲| 老司机久久99久久精品播放免费| 免费在线成人av| 久久精品国产第一区二区三区| 美女在线一区二区| 欧美粗暴jizz性欧美20| 亚洲一级网站| 在线观看成人小视频| 亚洲东热激情| 久久精品国产欧美激情| 免费中文字幕日韩欧美| 亚洲国产精品久久久久| 夜夜精品视频一区二区| 欧美影院成人| 欧美成人精品在线播放| 另类综合日韩欧美亚洲| 欧美国产视频在线观看| 久久九九精品| 欧美午夜不卡视频| 亚洲人成网站777色婷婷| 午夜久久tv| 欧美福利视频一区| 欧美在线免费播放| 你懂的网址国产 欧美| 亚洲日本欧美| 欧美国产视频日韩| 久久成人精品无人区| 欧美日韩美女| 久久国产乱子精品免费女| 欧美一区二区成人| 国产视频一区在线观看| 亚洲人成精品久久久久| 亚洲第一精品福利| 欧美激情亚洲国产| 欧美一级淫片播放口| 欧美成黄导航| 久久精品一区二区| 欧美一区二区三区视频在线观看| 欧美精品一区二区三区高清aⅴ| 黄色成人在线免费| 国内精品视频666| 欧美一区二区三区四区在线观看| 欧美国产日韩精品免费观看| 欧美在线你懂的| 国产精品女人网站| 亚洲永久在线| 亚洲精品三级| 久久久噜噜噜久久| 久久久久久电影| 国产精品看片你懂得| 性亚洲最疯狂xxxx高清| 亚洲一区二区三区在线视频| 国产精品国码视频| 欧美激情一二三区| 免费中文字幕日韩欧美| 国产一区自拍视频| 国产日韩在线视频| 日韩午夜av| 韩国女主播一区| 男女精品视频| 国产一区二区三区四区三区四 | 国产精品亚洲不卡a| 亚洲视频欧美在线|