假設我編譯源文件文件,其中包含這一段代碼,類型定義,(二進制)代碼重複和對象文件
struct Point
{
int x;
int y;
};
struct Size
{
int x;
int y;
};
由於Point
和Size
是完全一樣的(在它的成員的存儲器佈局方面),編譯器是否會在目標文件中生成重複代碼(每個代碼爲struct
)?這是我的第一個問題。
現在,讓我們刪除源代碼中的struct Size
,並使用typedef
代替,像這樣定義它,
typedef Point Size;
什麼會編譯現在怎麼辦?它會重複代碼(因爲typedef不僅僅是重命名,而是更多)?
現在假設我們有一個類模板是這樣的:
template <int UnUsed>
class ConcreteError : public BaseError {
public:
ConcreteError() :BaseError(), error_msg() {}
ConcreteError (int errorCode, int osErrorCode, const std::string& errorMessage)
:BaseError(errorCode, osErrorCode, errorMessage){}
};
然後我們設置一些定義,這樣,
typedef ConcreteError<0> FileError;
typedef ConcreteError<1> NetworkError;
typedef ConcreteError<2> DatabaseError;
因爲模板參數int UnUsed
未使用類的實現(只是假設),所以看起來這種情況與具有完全相同內存佈局的多個類完全相同(類似於的情況和struct Size
),對象文件中是否會有重複的代碼?
而如果我們做這樣的,
typedef ConcreteError<0> FileError;
typedef ConcreteError<0> NetworkError;
typedef ConcreteError<0> DatabaseError;
是這種情況更好,因爲現在我們在使用的typedef相同實例類?
PS:這個類模板代碼就是從這裏取:
How to create derived classes from a base class using template programming in C++?
其實,我沒有編譯器如何生成的源代碼的目標文件的任何想法,以及如何處理類名稱,它是成員,其他符號和所有。它如何處理typedefs?這是什麼做這個,
typedef int ArrayInt[100];
是ArrayInt
一個新類型嗎?代碼編譯器在目標文件中爲它創建了什麼? 100
在哪裏存儲?
@lijie:你能解釋爲什麼沒有爲第一個結構定義生成代碼? – Nawaz 2010-12-17 17:51:10
,因爲它們只是類型定義。實際上,他們只是告訴編譯器類型名稱的含義。你實際上並沒有定義變量或函數(它實際上會生成代碼)。 – lijie 2010-12-17 17:57:37
@liljie:我以爲你會認爲我在我的代碼中使用了這些結構。即定義了一些變量,操縱它們,並做各種事情! – Nawaz 2010-12-17 18:07:27