中國(guó)建設(shè)銀行官網(wǎng)站企業(yè)網(wǎng)銀營(yíng)銷策劃與運(yùn)營(yíng)
一、前言
C++相比C是支持函數(shù)重載的,現(xiàn)在我們?cè)敿?xì)探討一下C++函數(shù)重載與類方法承載。
二、案例代碼
我們編譯如下代碼,同樣的我們關(guān)閉代碼優(yōu)化,刪除符號(hào)鏈接文(.pdb)
#include "windows.h"
#include "windef.h"
#include <iostream>
#include <tchar.h>
using namespace std;int LoadFile(const char* filename) {printf("%s", filename);return 1;
}
int LoadFile(char* filename,int mod) {if (mod == 1) {printf("%s", filename);return 1;}return 2;
}
int _tmain() {char filename[] = "C:\\\\windows\\x86\\myfile\n";char* pfilename = filename;const char constfilename[] = "C:\\\\windows\\x86\\myfile\n";const char* pconstfilename = "C:\\\\windows\\x86\\myfile\n";LoadFile(constfilename);LoadFile("C:\\\\windows\\x86\\myfile\n");LoadFile(filename,1);return 0;
}
三、const char* ,char*,const char[],char[]匯編代碼上的區(qū)別
我們注意上述代碼的細(xì)節(jié):
第一個(gè)函數(shù)我們使用靜態(tài)數(shù)組傳參。
第二個(gè)我們使用定值傳參。
第三個(gè)我們使用數(shù)組傳參。
順便探討一下靜態(tài)數(shù)組和數(shù)組的底層區(qū)別。
我們發(fā)現(xiàn)實(shí)際上const char[] 和char[]在匯編上實(shí)際沒有區(qū)別,const僅僅在編譯的時(shí)候?qū)︻愋瓦M(jìn)行檢查。
const char constfilename[]相比const char* pconstfilename,前者不僅僅用到了.rdata的內(nèi)容,還需要占據(jù)相同大小的堆棧空間,而后者僅僅占用一個(gè)指針的堆??臻g,所有他們之間還是有區(qū)別的。
四、重載函數(shù)區(qū)別
函數(shù)調(diào)用詳解,從第三個(gè)與前兩個(gè)對(duì)比可以看到C++直接將其處理為了兩個(gè)不同的函數(shù)。
我們放回符號(hào)鏈接文件再次查看,顯然被處理(修飾)為了不同的函數(shù),具體修飾規(guī)則懶得看了,有需要再說(shuō)。