C 語言特性

2021-06-17 15:27:27 字數 2085 閱讀 6003

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 是錯誤的...