在
原理篇之後, 我們來實作如何喚起 global object dtor。
cpp_abi.h 補上需要的資訊, struct DObjs, 用來紀錄要
調用呼叫的 dtor。
6 #define DOBJS_SIZE 3
我宣告 size 為 3 的 DObjs array, 目前要用到的只有 io, ab 這兩個 globle object, 正確實作的話, 應該要去知道有幾個 global objects, 不過這裡我們就偷懶一下, 寫死就好。
int __cxa_atexit(void (*destructor) (void *), void *arg, void *__dso_handle);
則是要資訊紀錄在 DObjs 裡頭, 把每一個 dtor, this pointer, 紀錄下來, __dso_handle 沒有用到, 我目前還搞不定 share objects。
void g_dtors(void);
呼叫每一個 global object dtor (依照建構時相反的順序)
參考以下 cpp_abi.cpp 實作。
再來的程式就簡單了, L84 就是呼叫 g_dtors, 直接把之前紀錄的 dtor 一個一個執行, 就完成在退出 cpp_main 時執行 global object 的解構。
整個 global objects ctor/dtor 的實作就是這樣, 沒有那麼神祕了吧!
再來要聊聊 local static object。
完整程式碼:
simple os: git clone git@github.com:descent/simple_os.git
git branch: cpp_runtime
git commit: 92e0183c722166c84da8b28aa11fd8afeff0ff6c
directory: simple_os/cpp_runtime/global_object/dos_cpp
沒有留言:
張貼留言
使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。
我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。