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

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

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


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

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

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

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

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

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

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

不加volatile關鍵字的話,編譯器發現在自己的可見范圍內ci沒有被改變,于是就假設_asm{}之后ci的值沒變,導致生成的匯編代碼為:
push 0Ah

加了關鍵字后,編譯器就不會對ci做任何的假設,于是生成的匯編代碼變成了這樣:
mov eax,dword ptr[i]
push eax  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲婷婷免费| 欧美久久视频| 亚洲国产婷婷香蕉久久久久久99 | 亚洲日本va午夜在线电影| 在线观看一区欧美| 最新国产乱人伦偷精品免费网站| 亚洲精品小视频| 亚洲影院在线| 蜜臀久久99精品久久久久久9| 免费成人黄色| 一区二区三区久久精品| 午夜影视日本亚洲欧洲精品| 久久蜜桃精品| 国产精品成人在线观看| 国一区二区在线观看| 亚洲精品国产拍免费91在线| 亚洲欧美国产精品桃花| 女人色偷偷aa久久天堂| 夜夜嗨av一区二区三区| 久久精品欧美| 国产精品久久二区二区| 精品999日本| 亚洲欧美成人一区二区在线电影| 久久香蕉国产线看观看av| 亚洲精品免费看| 久久久久综合网| 国产精品国产三级国产专播品爱网 | 亚洲第一网站| 好吊视频一区二区三区四区| 在线成人www免费观看视频| 麻豆精品视频在线| 欧美高清自拍一区| 国产乱码精品一区二区三区五月婷| 国产一区二区三区精品久久久| 亚洲第一主播视频| 噜噜爱69成人精品| 小辣椒精品导航| 国产精品视频1区| 亚洲欧美另类在线| 9l视频自拍蝌蚪9l视频成人| 美女精品一区| 一本一道久久综合狠狠老精东影业| 久久成人在线| 久久精品首页| 亚洲人午夜精品| 亚洲日本aⅴ片在线观看香蕉| 久久久久亚洲综合| 亚洲精品国产精品久久清纯直播| 欧美成年人视频| 欧美精品aa| 午夜精彩视频在线观看不卡| 亚洲免费视频网站| 亚洲电影免费在线 | 国产精品欧美一区喷水| 日韩视频三区| 一区二区三区国产精华| 国产欧美日韩在线| 欧美激情一区二区三区 | 亚洲国产欧美在线人成| 欧美韩日亚洲| 久久成人国产| 欧美视频精品在线观看| 免费成人黄色| 国产精品日韩一区二区三区| 久久久久亚洲综合| 欧美日韩精品一区| 蘑菇福利视频一区播放| 国产精品人人做人人爽| 亚洲国产mv| 在线精品视频一区二区| 亚洲免费小视频| 亚洲夜间福利| 欧美日韩在线三级| 欧美激情在线有限公司| 国产精品国产三级国产专区53 | 一区二区欧美日韩| 欧美+日本+国产+在线a∨观看| 欧美一区二区在线播放| 欧美日韩国产页| 亚洲卡通欧美制服中文| 亚洲精品老司机| 欧美激情麻豆| 亚洲经典三级| 最新国产成人av网站网址麻豆| 另类综合日韩欧美亚洲| 欧美国产日韩一区| 一本一本久久| 国产一区二区三区四区老人| 亚洲桃色在线一区| 国产精品成人免费视频 | 亚洲欧美另类在线| 久久天堂av综合合色| 亚洲高清自拍| 欧美日韩高清不卡| 午夜欧美不卡精品aaaaa| 久久精品一区二区国产| 一色屋精品视频免费看| 欧美精品在线极品| 欧美一区二区在线播放| 亚洲国产美女精品久久久久∴| 亚洲一区二区综合| 99国产精品视频免费观看一公开 | 亚洲免费观看在线观看| 欧美在线免费一级片| 久久成人综合视频| 亚洲人成网站777色婷婷| 欧美影院视频| 亚洲在线国产日韩欧美| 亚洲精品美女91| 国内精品久久久久伊人av| 欧美午夜久久| 欧美日韩国内| 欧美人与禽猛交乱配| 欧美激情区在线播放| 久久婷婷一区| 久久蜜桃资源一区二区老牛 | 久久精品成人一区二区三区| 亚洲毛片在线观看| 亚洲福利视频网站| 亚洲欧洲在线一区| 久久精品国产清自在天天线 | 亚洲国产综合在线| 亚洲国产精品久久久久婷婷884 | 欧美日韩伦理在线免费| 欧美日韩一区二区视频在线| 欧美精彩视频一区二区三区| 欧美日韩第一区| 国产精品久久久对白| 欧美三级中文字幕在线观看| 欧美看片网站| 国产精品亚洲精品| 国产色综合天天综合网| 亚洲国产精彩中文乱码av在线播放| 精品不卡在线| 亚洲图片在线| 另类激情亚洲| 99视频一区二区| 欧美一级久久久| 国产一区91| 国产日韩av一区二区| 亚洲男女自偷自拍图片另类| 99re6热只有精品免费观看| 亚洲小少妇裸体bbw| 美女精品国产| 国产日韩在线视频| 一本大道久久a久久精品综合| 亚洲欧美中文另类| 亚洲精品久久久久| 免费在线日韩av| 国产在线精品二区| 久久久噜噜噜久久久| 亚洲一区二区成人| 欧美日韩亚洲综合在线| 国产欧美欧洲在线观看| 99精品国产热久久91蜜凸| 激情视频一区二区| 小处雏高清一区二区三区| 亚洲高清影视| 欧美777四色影视在线| 亚洲高清视频在线| 欧美电影电视剧在线观看| 久久综合给合| 亚洲国产视频a| 亚洲区国产区| 国产精品麻豆欧美日韩ww| 亚洲在线一区二区| 久久成人久久爱| 欧美成黄导航| 欧美午夜不卡在线观看免费 | 国产精品久线观看视频| 亚洲色无码播放| 亚洲一二三四区| 精品福利电影| 中日韩美女免费视频网站在线观看| 国产精品久久久久久久午夜| 久久av在线看| 欧美日本韩国一区| 亚洲欧美在线观看| 亚洲一区二区三区乱码aⅴ| 亚洲视频一二| 国产精品青草综合久久久久99| 欧美一区久久| av成人天堂| 久久精品国产77777蜜臀 | 99riav久久精品riav| 国产一区二区三区不卡在线观看| 欧美激情视频一区二区三区在线播放 | 国产精品ⅴa在线观看h| 国产精品mm| 欧美成在线观看| 国产日韩欧美一二三区| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 免费成人在线观看视频| 午夜激情久久久| 欧美日韩欧美一区二区| 亚洲国产日韩欧美一区二区三区| 国产欧美日韩一区| 欧美一区二区免费| 久久久亚洲综合| 精品动漫3d一区二区三区免费|