我在我的程序中有一個助手類,在我的程序的不同類中使用了許多靜態函數。例如。在多個翻譯單元中複製C++中的靜態成員函數嗎?
helper.h
:
Class helper {
public:
static void fn1()
{ /* defined in header itself */ }
/* fn2 defined in src file helper.cpp */
static void fn2();
}
助手僅具有靜態成員函數。所以,其他模塊不會創建幫助對象。輔助功能在其他模塊中使用,如:
A.cpp
#include "helper.h"
A::foo() {
helper::fn1();
helper::fn2();
}
B.cpp
#include "helper.h"
B::foo() {
helper::fn1();
helper::fn2();
}
該編譯器創建A.cpp
和B.cpp
的輔助功能單獨的副本?我閱讀了一些較早的帖子,並從編譯器將創建的答覆中收集了這些信息。但是當我從A.cpp
和B.cpp
打印fn1
和fn2
的地址爲printf("Address of fn1 is %p\n", &helper::fn1);
和printf("Address of fn1 is %p\n", &helper::fn1);
時,我得到相同的地址。我現在很困惑。有人可以澄清,如果我錯過了什麼。
我擔心輔助函數的多個副本(如果發生的話)的原因是我們試圖減少我們的可執行文件大小,並希望優化它。
+1。我應該仔細閱讀一下這個問題;)刪除我的帖子。 – Mahesh 2011-03-20 22:59:11
@snkrish:是模板靜態成員函數還是模板靜態全局函數?如果它是一個靜態成員函數,那麼您可能會爲每個模板參數組合獲得一個新副本,但編譯單元的數量仍然不會影響它。如果使用靜態全局(或名稱空間)函數,則將在每個編譯單元中獲得新副本。 – 2011-03-21 01:53:22
感謝您的詳細解答,現在我明白了地址相同的原因。我有一個後續問題,我不確定是否應該開始一個單獨的帖子。如果上述相同的fn2是使用模板編寫的:template static void fn2(); - 應該在頭文件本身中定義fn2,還是應該使用extern模板 helper :: fn2(){/ *定義在helper.cpp * /}中來優化可執行文件大小。編譯器是否會創建函數的一個副本,無論fn2是否用不同的T調用,而不管它是如何定義的? –
cppcoder
2011-03-21 01:58:24