首先,**如下:
1
2 #include 3 #include 4
5 class cfox
6 ;13
14 cfox::cfox(void)
15 18
19 void cfox::print(void)
20 23
24 class imyclass
25 31 protected:
32 int id;
33 char name[16];
34 };
35 36 imyclass::imyclass(void)
37 41 class cmyclass : public imyclass
42 47 private:
48 cfox *pfox;
49 };
50 51 cmyclass::cmyclass(void)
52 55 void cmyclass::doaction(int id)
56 61 else
62
65 66 this->id = 0xabcdef;
67 68 }
69 70 71 int main(void)
72
在函式 cmyclass::doaction()裡設定斷點,在執行完這個函式最後乙個賦值語句的時候,停下來。
此時,執行gdb命令:
(gdb) where
#0 cmyclass::doaction (this=0x11008, id=0) at test_class.cpp:68
#1 0x00008b38 in main () at test_class.cpp:75
(gdb) p *this
$1 =
process 544
start addr end addr size offset objfile
0x8000 0x9000 0x1000 0x0 /mnt/test_class
0x10000 0x11000 0x1000 0x0 /mnt/test_class
0x11000 0x32000 0x21000 0x0 [heap]
0xb6d39000 0xb6e64000 0x12b000 0x0 /lib/libc-2.19.so
0xb6e64000 0xb6e6c000 0x8000 0x12b000 /lib/libc-2.19.so
0xb6e6c000 0xb6e6e000 0x2000 0x12b000 /lib/libc-2.19.so
0xb6e6e000 0xb6e6f000 0x1000 0x12d000 /lib/libc-2.19.so
0xb6e6f000 0xb6e72000 0x3000 0x0
0xb6e72000 0xb6e8f000 0x1d000 0x0 /lib/libgcc_s.so.1
0xb6e8f000 0xb6e97000 0x8000 0x1d000 /lib/libgcc_s.so.1
0xb6e97000 0xb6e98000 0x1000 0x1d000 /lib/libgcc_s.so.1
0xb6e98000 0xb6f02000 0x6a000 0x0 /lib/libm-2.19.so
0xb6f02000 0xb6f09000 0x7000 0x6a000 /lib/libm-2.19.so
0xb6f09000 0xb6f0a000 0x1000 0x69000 /lib/libm-2.19.so
0xb6f0a000 0xb6f0b000 0x1000 0x6a000 /lib/libm-2.19.so
0xb6f0b000 0xb6fc4000 0xb9000 0x0 /lib/libstdc++.so.6.0.18
0xb6fc4000 0xb6fcb000 0x7000 0xb9000 /lib/libstdc++.so.6.0.18
0xb6fcb000 0xb6fcf000 0x4000 0xb8000 /lib/libstdc++.so.6.0.18
0xb6fcf000 0xb6fd1000 0x2000 0xbc000 /lib/libstdc++.so.6.0.18
---type to continue, or q to quit---
0xb6fd1000 0xb6fd7000 0x6000 0x0
0xb6fd7000 0xb6ff6000 0x1f000 0x0 /lib/ld-2.19.so
0xb6ffa000 0xb6ffd000 0x3000 0x0
0xb6ffd000 0xb6ffe000 0x1000 0x0 [sigpage]
0xb6ffe000 0xb6fff000 0x1000 0x1f000 /lib/ld-2.19.so
0xb6fff000 0xb7000000 0x1000 0x20000 /lib/ld-2.19.so
0xbefdf000 0xbf000000 0x21000 0x0 [stack]
0xffff0000 0xffff1000 0x1000 0x0 [vectors]
可以看出,this是在heap裡的。
(gdb) p &name
$4 = (char (*)[16]) 0x11010
(gdb) p pfox
$5 = (cfox *) 0x11028
(gdb) p &this->id
$6 = (int *) 0x1100c
然後,看下this 所在的 heap的記憶體:
(gdb) x /20w this
0x11008: 0x00008ce0 0x00abcdef 0x6c707041 0x00000065
0x11018: 0x00000000 0x00000000 0x00011028 0x00000011
0x11028: 0x0000000a 0x00000000 0x00000000 0x00020fd1
0x11038: 0x00000000 0x00000000 0x00000000 0x00000000
0x11048: 0x00000000 0x00000000 0x00000000 0x00000000
C 類記憶體分布
成員變數依據宣告的順序進行排列 類內偏移為0開始 成員函式不佔記憶體空間 上部分為成員變數,下部分為虛表 當建立乙個含有虛函式的父類的物件時,編譯器在物件構造時將虛表指標指向父類的虛函式 同樣,當建立子類的物件時,編譯器在建構函式裡將虛表指標 子類只有乙個虛表指標,它來自父類 指向子類的虛表 這個虛...
C 中類的記憶體分布
如何計算類物件占用的位元組數?乙個空類的話1個位元組。這是為了保證n個連續空類宣告時,變數位址有偏移,防止變數覆蓋。非空類的話用關鍵字sizeof計算。如果手工計算就相當麻煩,光padding就一堆規則了。而且有些額外資訊比如虛函式 多個虛函式也只產生乙個vptr指標 等等。乙個類成員 當有虛函式時...
C 類記憶體結構分析
本文的目標是闡述清楚 c 的類相關的記憶體結構問題。這個問題對於已經很了解的人來說,太簡單了,這還有必要拿出來與人分享嗎?但對於那些不了解的人,始終有一層窗戶紙不能被捅破,似乎總是不能非常到位的理解本質。本文的闡述過程會分為幾個階段,類與物件的關係,物件到底是什麼,類的函式時如何被處理的,多型是如何...