env: g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
兩個 global object 和一個有什麼分別呢?恩 ... 沒分別, 不過誰要當老大呢?讓我們來看看有兩個 global object 的例子。
這時候 g++ 產生的是 _GLOBAL__I_ab。
若是把 L14, L15 交換
15 Io io;
14 Ab ab(7);
g++ 會產生的 _GLOBAL__I_io, 很有趣吧!
而有兩個 global object 的話, __static_initialization_and_destruction_0ii
會 invoke 兩次 __cxa_atexit 以及 Ab::Ab(7) 和 Io::Io() (L13, L25)。
11 1fd: 67 66 c7 04 24 7c 10 addr32 movl $0x107c,(%esp)
12 204: 00 00
13 206: 66 e8 e4 00 00 00 calll 2f0 <_ZN2IoC1Ev>
21 231: 67 66 c7 44 24 04 07 addr32 movl $0x7,0x4(%esp)
23 23b: 67 66 c7 04 24 80 10 addr32 movl $0x1080,(%esp)
24 242: 00 00
25 244: 66 e8 c4 01 00 00 calll 40e <_ZN2AbC1Ei>
而 L11, L 23 0x107c, 0x1080 分別是 io, ab 這兩個 global object 的位址 (請自己用 readelf -a 查詢, 我懶得再貼了), 這就是 this 指標。L21 則是 Ab::Ab(7) 的參數 7。
也就是:
Io::Io() 但實際上是 Io::Io(&io)。
用 c 的話要自己傳入, 這麼固定的工作就交給 c++ compiler 了, 這也是 c++ 如此優雅的原因, 但了解背後的秘密是很重要的。
好吧!我還是貼了 ...
19: 00001080 8 OBJECT GLOBAL DEFAULT 5 ab
20: 0000029c 83 FUNC GLOBAL DEFAULT 1 _ZN2IoC2Ev
21: 000004dc 0 NOTYPE GLOBAL DEFAULT 2 __end_ctors
22: 000004dc 0 NOTYPE GLOBAL DEFAULT 3 _start_dtors
23: 000004d8 0 NOTYPE GLOBAL DEFAULT 2 start_ctors
24: 00000344 39 FUNC GLOBAL DEFAULT 1 _ZN2IoD2Ev
25: 0000107c 0 NOTYPE GLOBAL DEFAULT 5 __bss_start__
26: 00001088 4 OBJECT GLOBAL DEFAULT 5 __dso_handle
27: 000004dc 0 NOTYPE GLOBAL DEFAULT 3 _end_dtors
28: 0000107c 0 NOTYPE GLOBAL DEFAULT 5 sbss
29: 000004dc 0 NOTYPE GLOBAL DEFAULT 3 start_dtors
30: 000003d8 54 FUNC GLOBAL DEFAULT 1 _ZN2AbC2Ei
31: 0000040e 54 FUNC GLOBAL DEFAULT 1 _ZN2AbC1Ei
32: 00000494 68 FUNC GLOBAL DEFAULT 1 _ZN2Ab5printEPKc
33: 000004d8 0 NOTYPE GLOBAL DEFAULT 2 __start_ctors
34: 0000107c 4 OBJECT GLOBAL DEFAULT 5 io
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。