-
vi main.c調(diào)出主程序查看全部
-
\0字符串結(jié)束;gcc main.c編譯程序;gcc -g main.c調(diào)試程序查看全部
-
gdb./a.out查看全部
-
p=&a,/a.out,start,list,:wq,vi main.c,gcc main.c,gcc -g main.c,./a.out查看全部
-
n,p,bt,x/1d,gdb,gcc -g main.c,.a/out,查看全部
-
變量的本質(zhì)是內(nèi)存空間,用來指示內(nèi)存地址位置 指針的本質(zhì)就是地址,指針(數(shù)據(jù)類型)所表示的內(nèi)存空間里存儲的是另一個內(nèi)存地址查看全部
-
p;指針指向的變量地址 *p;指針指向的變量值 &p;指針自己所在的地址 既然一個指針保存的是變量的地址,對32位CPU,地址有4個字節(jié),就需要4個內(nèi)存單元來存儲,所以每次++p在內(nèi)存里都是跳4格。查看全部
-
靜態(tài)變量、常量、全局變量都是存在于數(shù)據(jù)段中 靜態(tài)變量每個函數(shù)特有的,是不同的變量 全局變量指向同一個變量查看全部
-
1.編譯命令:gcc -g main.c -o main.out; 2.調(diào)試命令:gdb ./main.out; 3.調(diào)試器: (gdb)list:列出源代碼; (gdb)break line-number:在指定行數(shù)打斷點(diǎn); (gdb)start:開啟單步調(diào)試; (gdb)p a:打印a變量在內(nèi)存中的情況; (gdb)n:執(zhí)行到下一句; (gdb)s:進(jìn)入函數(shù)內(nèi)部; (gdb)bt:查看函數(shù)堆棧; (gdb)f 1:切換到編號為1的函數(shù)中; (gdb)q:退出調(diào)試;查看全部
-
內(nèi)存分析的很牛逼啊。查看全部
-
因?yàn)槠浯娣旁诖a段里所有是不能被修改的查看全部
-
以初始話的字符數(shù)組不能再寫入字符查看全部
-
棧內(nèi)存中,gcc編譯會作內(nèi)存優(yōu)化:1)使同一數(shù)據(jù)結(jié)構(gòu)的變量在一起;2)先定義的變量內(nèi)存地址會小于后定義的;3) 只有堆內(nèi)存和棧內(nèi)存可以寫入數(shù)據(jù),代碼段的內(nèi)存編譯以后無法修改。查看全部
-
內(nèi)存對齊之二篇 cpu對內(nèi)存的操作有對并的概念: 如果操作1字節(jié)的數(shù)據(jù),可以是任意地址,如果是操作2字節(jié)的數(shù)據(jù),如果開始地址在偶數(shù)地址,一次就可以取2字節(jié),如果開始地址在奇數(shù),就要2次內(nèi)存操作才能完成;如果操作4字節(jié)的數(shù)據(jù),最好開始地址在能被4整除的數(shù)值上,這樣用一條32位的內(nèi)存操作指令完成。8字節(jié)的開始位置最好的能被8整除的數(shù)值上,這樣用一條64位的內(nèi)存操作指令完成。就是說,如果對齊了,一次就可以完成,不對齊,就可能多次才能完成。編譯程序處理時也有對齊處理,一般的結(jié)構(gòu)體和對象等估計(jì)都有對齊的處理(把結(jié)構(gòu)體或?qū)ο蟮拈_始位置定在邊界上),這樣,只要你在結(jié)構(gòu)體里對象之間能處理好對齊,你的數(shù)據(jù)就能操作得很快。 有時你定義了一個結(jié)構(gòu)體,用了若干字節(jié),但不是8或4的倍數(shù),但你查內(nèi)存時能發(fā)現(xiàn)它們占用的是8或4的倍數(shù)(多用了幾個字節(jié)),就是這個原因。 比如32位機(jī),32根地址線,32根數(shù)據(jù)線,取數(shù)時,cpu的32根據(jù)地址線與內(nèi)存的0-3號地址對齊,cpu的32位的數(shù)據(jù)線也同樣,一個讀取周期只能取這0-3地址的3個字節(jié)。如果你是取3-4地址的數(shù)據(jù),CPU會自動把它分解成2次取數(shù)據(jù)操作,一次取8位的3單元和一次取8位4單元數(shù)據(jù)。 只有開始地址是0、4、8...的32位的數(shù)據(jù)操作才能一次操作完成,內(nèi)存不支持從1號單元開始的4字節(jié)讀,CPU和內(nèi)存的數(shù)據(jù)線必須相應(yīng)數(shù)據(jù)線對齊才行。 如果要沒有這個限制,CPU和內(nèi)存的制作成本就會高一些。況且,CPU和內(nèi)存的控制總線標(biāo)準(zhǔn)是早就規(guī)定好了的,造CPU的生產(chǎn)出了有你這種功能的CPU,但內(nèi)存不支持,必須某年某月國際上協(xié)商出了新的標(biāo)準(zhǔn),你的這種想法才可能實(shí)現(xiàn)。查看全部
-
內(nèi)存對齊之一篇: 為了加快計(jì)算機(jī)的取數(shù)速度,編譯器默認(rèn)對內(nèi)存進(jìn)行字節(jié)對齊。對結(jié)構(gòu)體(包括類)進(jìn)行字節(jié)對齊的原則是:1)結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型成員的大小所整除;2)結(jié)構(gòu)體每個成員相對于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會在成員之間加上填充字節(jié);3)結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會在最末一個成員之后加上填充字節(jié)。 struct SByte1 { double d; // 偏移量 0~7 char j; // 偏移量8 int a; // 偏移量12~15,由于9不能整除4,故先填充9~11 }; sizeof(SByte1); // = 16 struct SByte2 { char j; // 偏移量0 double d; // 偏移量8~15,由于1不能整除8,故先填充1~7 int a; // 偏移量16~19 }; sizeof(SByte2); // = 24,為了湊成8的倍數(shù),填充20~23查看全部
舉報(bào)
0/150
提交
取消