C++函数编译原理和成员函数的实现
C++函數的編譯
C++中的函數在編譯時會根據命名空間、類、參數簽名等信息進行重新命名,形成新的函數名。這個重命名的過程是通過一個特殊的算法來實現的,稱為 名字編碼(Name Mangling)。
Name Mangling 是一種可逆的算法,既可以通過現有函數名計算出新函數名,也可以通過新函數名逆向推演出原有函數名。
Name Mangling 可以確保新函數名的唯一性,只要命名空間、所屬的類、參數簽名等有一個不同,那么產生的新函數名也不同。
小括號中就是 Name Mangling 產生的新函數名,它們都以”?“開始,以區別C語言中的”_“。
不同的編譯器有不同的 Name Mangling 算法,產生的函數名也不一樣。
除了函數,某些變量也會經 Name Mangling 算法產生新名字。
成員函數的實現
對象的內存模型中只保留了成員變量,除此之外沒有任何其他信息,程序運行時不知道 obj 的類型為 Demo,也不知道它還有一個成員函數 display()。那么,究竟是如何通過對象調用成員函數的呢?
成員函數最終被編譯成與對象無關的普通函數,如果函數體中沒有成員變量,那問題就很簡單,不用對函數做任何處理,直接調用即可。
如果成員函數中使用到了成員變量,該怎么辦呢?成員變量的作用域不是全局,不經任何處理就無法在函數內部訪問。
C++規定,編譯成員函數時要額外添加一個參數,把當前對象的指針傳遞進去,通過指針來訪問成員變量。
這樣就完成了對象和成員函數的關聯,只不過與我們從表明上看到的相反,不是通過對象找函數,而是通過函數找對象。
這一切都是隱式完成的,對程序員來說完全透明,就好像這個額外的參數不存在一樣。
總結
以上是生活随笔為你收集整理的C++函数编译原理和成员函数的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++变量位置
- 下一篇: s3c2440移植MQTT