重載函數編譯後的新名字

我們都知道很多語言都支持函數重載,那麼編譯器是怎麼處理編譯後它們的命名衝突的呢?

1、先給出幾個正確的重載函數:

#include <iostream>
using namespace std;

int Add(int a, int b)
{
    return a + b;
}

double Add(double a, double b)
{
    return a + b;
}


double Add(double a, int b)
{
    return a + b;
}

double Add(int a, double b)
{
    return a + b;
}

void Add(void)
{
    ;
}

int main()
{
    int a = 10;
    int b = 20;
    double d1 = 1.0;
    double d2 = 2.0;
    Add(a, b);
    Add(d1, d2);
    return 0;
}

2、查看編譯後重載函數新名字的方法

a. 在vs2010下面,直接把重載函數都屏蔽了,然後在主函數裏調用這些函數,此時會報錯,這時我們在錯誤信息裏會看到這些函數的新名字。這種方法比較簡單。

b. 在vs2013下面,,先在解決方案裏右鍵你的項目(編譯器界面沒有解決方案的可以用以下方法調出:點擊視圖->解決方案資源管理器或直接Ctrl+Alt+L),接着依次點擊:屬性->配置屬性->鏈接器->調試,找到映射導出一欄,把默認的否改爲:是 (/MAPINFO:EXPORTS)即,然後重新編譯程序。此時,找到你項目(工程)的位置(在你電腦硬盤上的物理位置),找到Debug文件夾裏的後綴爲.map的文件,用記事本或其他文檔瀏覽軟件打開,在裏面可以用編輯->查找的方式,輸入你的重載函數名,一直查找,直到找到幾個連續的與原函數名字比較相似的新函數名即可,這些就是你的新的函數名。

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

c. 在Linux下把編譯後的文件反彙編來查看

①建立一個.cpp文件,把代碼拷貝進去

②編譯該文件

③執行命令objdump -d a.out >log.txt反彙編並將結果重定向到log.txt文件中。

這裏寫圖片描述

這裏寫圖片描述

④對生成log.txt文件進行分析。

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

這裏寫圖片描述

可以看到在log.txt裏重載函數的名字變成了對應的這幾個,我們很明顯的發現在Linux裏重載函數在反彙編之後的新名字可以很清楚的看出來。
而且我們可以總結出重載函數在反彙編之後出現的新名字的規律(Z3這裏權當是一個作用域標識):
作用域+函數名+參數列表參數類型的首字母

發佈了68 篇原創文章 · 獲贊 80 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章