【C++ grammar】C++简化内存模型
1、stack(棧)
編譯器自動分配內(nèi)存(函數(shù)內(nèi)部定義得局部變量、形參)
2、堆(Heap)
一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由OS回收(new和delete)
3、Global\Static(全局區(qū)、靜態(tài)區(qū))
1、全局變量和靜態(tài)變量的存儲是放在一塊兒的
2、可以簡單認(rèn)為:程序啟動全局/靜態(tài)變量就在此處、程序結(jié)束釋放
4、Constant(常量區(qū))
可以理解為所有常量都放在一起,該區(qū)域內(nèi)容不可修改、
c++內(nèi)存示例:
堆向高地址方向生長
棧向低地址方向生長
所以中間的空白區(qū)域會由兩者共享,增大了內(nèi)存的利用效率。
觀察變量存放位置;
問題:
下面哪個語句可以接在const char* p = “Hello”;后面:
1、p[0]=‘A’
2、p = “World”;
3、cin>>p
4、*(p+1)=‘e’
1和4共同的問題:表達(dá)式必須是可以修改的左值
運算符的左邊應(yīng)該是一個“左值”。所謂“左值”就是指在程序中占用內(nèi)存空間、可以被修改的量,比如各種變量。
‘’A‘’是一個字符串常量,他一經(jīng)定義系統(tǒng)就會分配一段地址給他(常量區(qū))式子左邊p[0]也是一個常量地址,所以不能用 = 將一個常量地址賦值給一個常量地址。這也就能回答問題:表達(dá)式必須是可修改的左值的答案,因為p[0]也是一個常量地址。
3、符號方向反了
關(guān)于1、4問題的詳細(xì)解釋看這篇文章:
C語言中字符串賦值處理方式
雙引號做了3件事:
1.申請了空間(在常量區(qū)),存放了字符串
2. 在字符串尾加上了’/0’
3.返回地址
這里就是 返回的地址 賦值給了 p
總結(jié)
以上是生活随笔為你收集整理的【C++ grammar】C++简化内存模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “能屯复能跃”上一句是什么
- 下一篇: 【C++ grammar】Enhance