c/c++
程式設計基本功
c++其內容精深博大,任何一塊都信手拈來者不多,究其精者更不多,不論何其原因,最重要一點就是其基本功之不紮實,對基礎性東西不加以精深研究。我也是一樣,經過幾輪經典的面試,讓我痛改以前的不紮實的作風,以此來磨礪自己。
一.記憶體管理篇
乙個由c/c++
編譯的程式占用的記憶體分為以下幾個部分:
1. **區
(code section)
2. 資料區(data section)
3. 棧(stack)
4. 堆(heap)
解釋說明:
1.資料區:
有人說資料區分全域性區
,靜態區
,文字常量區
. 這些應該來說是細分資料區,其實這些被細分的區在
os裡面還是被願意稱作為資料區。這裡面存放的變數的值及占用的空間始終伴貫穿著整個程式的生命週期,直到程式結束後由系統收回。
下面給出乙個程式例子,我們進行彙編之後可以看出變數所在的記憶體區域。
#include
struct employee
;
struct employee architect = ;
struct employee ceo = ;
struct employee drone;
void main()
下面是vs.net 2005
彙編產生的**:
.file "f:/project/myproject/sample5/sample5.cpp"
.global?drone@@3uemployee@@a; drone
.global?architect@@3uemployee@@a; architect
.global?ceo@@3uemployee@@a; ceo
.bss
.local?drone@@3uemployee@@a,72; drone
.rdata
$sg8630:
.ascii"bill/000"
.space3
$sg8631:
.ascii"blunden/000"
.data
?architect@@3uemployee@@a:; architect
.ascii"gil/000"
.space28
.ascii"bates/000"
.space26
.byte0x2d
.space3
.word0x
186a
0?ceo@@3uemployee@@a:; ceo
.ascii"reed/000"
.space27
.ascii"almer/000"
.space26
.byte0x
2a.space3
.word0x17318
; function compile flags: /odtp
; file f:/project/myproject/sample5/sample5.cpp
.text
.global?main@@$$hyahxz; main
?main@@$$hyahxz:; main
;.proc.defd:i()
; function header:
; max stack depth = 2
; function size = 58 bytes
; local varsig tk = 0x0
; exception information:
; 0 handlers, each consisting of filtered handlers
;.proc.beg
; 20:strcpy(drone.firstname,"bill");
ldsflda?drone@@3uemployee@@a
ldsflda$sg8630
call?strcpy@@$$j0yapadpadpbd@z
pop; 21:strcpy(drone.lastname,"blunden");
ldsflda?drone@@3uemployee@@a
ldc.i4.s32; i32 0x20
addldsflda$sg8631
call?strcpy@@$$j0yapadpadpbd@z
pop; 22:drone.age=35;
ldsflda?drone@@3uemployee@@a
ldc.i4.s64; i32 0x40
addldc.i4.s35; u8 0x23
stind.i1
; 23:drone.salary=(int) (3.5);
ldsflda?drone@@3uemployee@@a
ldc.i4.s68; i32 0x44
addldc.i.33; u32 0x3
stind.i4
; 24:return;
; 25: }
ldc.i.00; i32 0x0
ret.end ?main@@$$hyahxz; main
;.proc.end.i4
_textends
public__mep@?main@@$$hyahxz
public_main
;comdat __mep@?main@@$$hyahxz
datasegment
__mep@?main@@$$hyahxz token
0a000009
; function compile flags: /odtp
dataends
;comdat _main
_textsegment
_mainproc; comdat
jmpdword ptr __mep@?main@@$$hyahxz
_mainendp
_textends
end以上我們就可以清楚的知道資料區儲存的是全域性變數和本地變數,想想看其實彙編其實也不是蠻難的嗎j。
2.**區
存放函式體的二進位制**.
下面是我引用《
memory management: algorithms and implementation
》一書上面的例子,我發現很有趣。
/* --codedata.c-- */
#include
void code()
void main()
**有意思的一部分就是把**區變為資料區(紅色標註部分),
os有規定**區只有被訪問許可權,沒有寫的許可權。下面是在
windows
下面執行時發出的警告資訊。
(圖形1-1)3.棧
棧是是向低位址擴張的先進後出的資料結構,是一塊續的記憶體區域。每乙個棧都有乙個棧指標(如圖
1-2)
,用來儲存棧中最後一項元素的低位址。當新元素被加進棧中,棧指標就會相應的減少,這時的棧指標指向指新元素的第乙個位元組的位址。(圖形
1-2)
/* sample2.cpp */
int main()
4. 堆
是向高位址擴充套件的資料結構,是不連續的記憶體區域.
(未完,待續)
程式提速 程式設計基本功
由於現在硬體的高配置,已經很少有程式設計師去關注程式效率的問題,不過相對於做演算法的朋友,效率是永遠的追求。這裡談談我優化程式的一點經驗,供新手討論,高手見笑了。一 程式設計基本功 前幾天給員工做培訓,隨口出了道題,不想竟難倒了所有人。題目是這樣的 現行的人民幣面值有1角,5角,1元,5元,10元,...
程式設計漫談(四) 基本功
讀 程式設計珠璣i 有感 program.program better.program faster.要從事軟體開發,首先要學會程式設計。如何程式設計呢?如何編寫更高效更優雅的程式呢?程式設計珠璣 通過簡單而熟悉的示例,揭示了許多非常有益的程式設計原理和技巧,極具啟發性。基本流程 問題定義 應用框架...
基本功練習 2 26
型別轉換 先看下面一段程式,這段程式摘自 c專家程式設計 如果是有這樣一段程式的話,你永遠無法知道x的值到底是多少,因為這句賦值語句x array d 1 根本不會執行。原因在哪?經過除錯發現程式執行到if語句進行判斷完之後,直接跳過下面一條語句的執行。下面來分析一下原因,因為sizeof求算型別大...