巨集通常被應用於執行簡單的運算。
巨集的優點:
1)巨集比函式在程式的規模和速度方面更勝一籌。巨集是插入到程式中直接執行的,而函式還要建立棧幀和銷毀棧幀,這些工作所耗費的時間可能比函式內部的指令的執行所耗費的時間還要多。
2)巨集是型別無關的。函式的引數必須宣告為特定的型別,所以函式只能在型別合適的表示式上使用。反之巨集,只要對引數的操作是合法的,就可以用於任何引數型別。
巨集的缺點:
1)增加程式的長度。
2)巨集沒辦法除錯。
3)與型別無關,編譯時不能做型別檢查。
4)巨集可能會帶來運算子優先順序的問題,表示式的求值結果不容易**。
5)帶***的巨集引數多次使用時,會導致不可**的後果。
對比巨集和函式:屬性巨集
函式**長度
巨集的**是直接插入到程式中的,會大幅度增加**的長度
函式在記憶體空間中只有乙份,每次使用時都去呼叫這乙份**
執行速度
快呼叫和銷毀函式會耗費時間
引數型別
只要對引數的操作是合法的,就可以使用任意型別引數
函式定義時有特定的引數型別,只能呼叫相應型別的引數
操作符優先順序
巨集**插入程式中,要結合上下文環境運算,如果巨集沒有加括號,可能會帶來預想不到的後果
函式是在函式內部進行求值運算,再將結果返回,表示式求值更直觀
引數求值
帶有***的巨集引數求值可能會產生不可預料的後果
引數只在函式被呼叫前求值一次
帶有***的巨集引數求值:
#include
#define max(a,b) ((a)>(b)?(a):(b))
int main(int argc, char** argv)
巨集展開:int z = ((x++)>(y++)?(x++):(y++));
較大的那個數會被呼叫兩次++,但這並不是我們的初衷
執行結果:
x=6,y=10,z=9
x=5和y=8比較大小後,x=6,y=9,y在剛剛的比較中勝出,又因為是後置++,因此將y的值賦給z,y+1之後y=10
內聯函式結合了巨集和函式的優點:
1)快。內聯函式在編譯時將函式直接嵌入呼叫程式的主體,省去呼叫和返回指令。
2)型別檢查。編譯器會對內聯函式的引數型別做安全檢查或者自動型別轉換。
3)可除錯。內聯函式在執行時是可以除錯的。
內聯函式只適用於:
1)較短的**
2)函式體內不出現迴圈和遞迴
內聯函式比巨集更安全。
1)引用必須初始化,並且不能更改為引用其他變數,而指標是可變的。
2)引用必須指向有效的變數,指標可以為空。
3)sizeof引用時,求的是引用變數的大小,sizeof指標時,求的是指向變數位址的大小。
4)引用++時,只加1,指標++時,加的是型別的大小。
5)引用比指標更安全。
引用內部實現和指標一樣,將**進行反彙編,會發現兩者的**相同。
swap_by_reference(x,y);
0x0000000000401594 <+34>: lea rdx,[rbp-0x8]
0x0000000000401598 <+38>: lea rax,[rbp-0x4]
0x000000000040159c <+42>: mov rcx,rax
0x000000000040159f <+45>: call 0x401530 int&)>
swap_by_point(&x,&y);
0x00000000004015a4 <+50>: lea rdx,[rbp-0x8]
0x00000000004015a8 <+54>: lea rax,[rbp-0x4]
0x00000000004015ac <+58>: mov rcx,rax
0x00000000004015af <+61>: call 0x401564 int*)>
兩者傳參都是先將y的位址賦值給rdx,再將x的位址傳給rax。
進入函式內部使用引用時,都會進行解引用取值進行運算。
1)malloc/free是c/c++標準庫的函式,new/delete是c++操作符。
2)malloc/free只是動態分配記憶體空間/釋放空間,而new/delete除了分配空間還會呼叫建構函式和析構函式進行初始化和清理。
3)malloc/free需要手動計算型別大小,返回值是void*,new/delete可自己計算型別大小,返回對應型別的指標。
4)malloc失敗了返回0,new失敗了會丟擲異常。
embed的名詞 常見名詞解釋
名詞列表 英文解釋 中文解釋 備註ap 應用軟體程式 acalternating current 交流電acpi advanced configuration and power management in 高階配置和電源管理介面 a vaudio video abmacer backup mana...
常見演算法名詞
mathematical induction 數學歸納法 pseudocode 偽 arithmetic add,subtract,multiply,divide,remainder,floor,ceiling 算術指令 加,減,乘,除,求餘,向下取整,向上取整 data movement load...
金融常見名詞解析
掛單maker是指先 的一方掛出的委託單,即先設定乙個委託單掛出,限定其 和數量,等待其他使用者與之成交。如果市場上暫時沒有相匹配的訂單,那麼這個委託單將會一直掛在交易所的盤口上,為整個市場提供 吃單taker,是指主動與已掛出的委託單成交,即根據交易所盤口上已有的委託單 下達一定數量的委託單,和盤...