a1: 總的原因是,加速debug版下編譯鏈結時間.用空間換時間.具體原因為下。
每乙個子程式(函式體)編譯後在**段有一定的長度,為了讓了程式緊湊,所以希望各函式體連線存放,但是在除錯 修改過程中,各函式體體會頻繁的變換長度,所以呼叫函式的個相對位址,就會需要鏈結器反覆修改.為此,各個函式體**區間並不是直接"挨著"存放,而是留出一定的位址空間,以備函式長度一定增長,這個留出空間叫作padding,裡面全用0xcc(int 3)指令填充. 但如果預留空間還是不夠時,這時,編譯器時,將所有call指令,轉到乙個jmp指令處,再由這個jm跳轉到子程式中去.這樣如果被呼叫函式體的位址改變,只改變jmp 即可了.這個處理過程中,就叫 ilt = ncremental link table,在release 版本中,是可以優化掉這個處理的.
q2: typename 關鍵字作用?
a2:有兩種用法
一是定義模板引數,與
關鍵字class,
功能完全相同.(這裡的class和定義類時的class完全是兩回事,c++當時就是為了減少關鍵字)
二是模板中標明「內嵌依賴型別名」
這裡有三個詞,內嵌、依賴、型別名。那麼什麼是「內嵌依賴型別名(nested dependent type name)」?
請看sgi stl裡的乙個例子, 只是stl中count范型演算法的實現:
template
typename iterator_traits<_inputiter>::difference_type
count(_inputiter __first, _inputiter __last, const _tp& __value)
這裡有三個地方用到了typename:返回值、引數、變數定義。分別是:
typename iterator_traits<_inputiter>::difference_type
typename iterator_traits<_inputiter>::value_type
typename iterator_traits<_inputiter>::difference_type __n = 0;
difference_type, value_type就是依賴於_inputiter(模板型別引數)的型別名。原始碼如下:
template
struct iterator_traits ;
內嵌是指定義在類名的定義中的。以上difference_type和value_type都是定義在iterator_traits中的。
依賴是指依賴於乙個模板引數。typename iterator_traits<_inputiter>::difference_type中difference_type依賴於模板引數_inputiter。
型別名是指這裡最終要指出的是個型別名,而不是變數。例如iterator_traits<_inputiter>::difference_type完全有可能是類iterator_traits<_inputiter>類裡的乙個static對
象。而且當我們這樣寫的時候,c++預設就是解釋為乙個變數的。所以,為了和變數區分,必須使用typename告訴編譯器。
那麼是不是所有的t::type_or_variable, 或者tmpl:type_or_variable都需要使用typename呢?不是,有以下兩個例外。
3 例外
(1)類模板定義中的基類列表。
例如template
class derived: public base::***
(2)類模板定義中的初始化列表。
derived(int x) : base::***(x)
為什麼這裡不需要呢?因為編譯器知道這裡需要的是型別還是變數,(1)基類列表裡肯定是型別名,(2)初始化列表裡肯定是成員變數名。
C語言特性BUG
1.關鍵字const並不能把變數變成常量,在乙個符號前加上const限定符只是表明這個符號不能被賦值。也就是說它的值對於這個符號來說是唯讀的,但它並不能防止通過程式的內部的方法來修飾這個值。const最有用之處就是用它來限定函式的形參。這樣該函式將不會修改指標所指的資料。const和 的組合通常只用...
C語言特性 指標
簡單來說,變數的記憶體位址就是該變數的指標 而用於儲存記憶體位址 指標 的變數就是指標變數 定義指標變數的語法格式如下 型別 變數名 關於指標,還有以下兩個最基本的運算子。1.取位址運算子。這是乙個單目運算子,後面通常緊跟乙個變數,該運算子用於讀取該變數所在的記憶體位址。2.取變數運算子。這也是乙個...
C語言的特性
通過如下的一些例子,感知c語言的特性。1 swtich 通常格式為 switch 表示式 注意break的使用,跳出的範圍是哪乙個。如果沒有break,就變成了fall through,這種情況出現不足3 偶爾出現兩條或是多條case語句執行相同內容。2 malloc strlen str 是錯誤的...