1. 程式人生 > >巨集與函式的比較

巨集與函式的比較

1、巨集的概念
巨集定義是指將一個識別符號定義一個字串,在源程式中該識別符號被字串替換的實現方式。巨集書寫的格式為:#define 巨集名(引數表) 巨集。

2、巨集與函式的區別
這裡寫圖片描述

3、巨集的優缺點
(1)優點:
1)提高程式的可讀性,而且方便修改;
2)巨集只是進行簡單的字串替換,沒有引數的入棧和出棧,提高了程式的執行效率。
(2)缺點:
1)巨集不進行型別檢測,存在安全隱患;
2)因為邊界問題會使程式產生二義性;
3)巨集不支援遞迴;
4)巨集不能訪問類物件的私有成員;
5)巨集在執行的時候不可以進行除錯;

4、巨集與行內函數的區別
(1)行內函數在編譯時展開,巨集在預編譯時展開;
(2)編譯行內函數可以嵌入到目的碼,巨集只是進行簡單的字串替換;
(3)內聯會做型別和語法檢查,而巨集不具有這樣的功能;
(4)inline函式是函式,而巨集不是函式;
(5)巨集定義處理巨集引數時存在邊界問題(一般引數都要用括號括起來),而行內函數定義不會出現這樣的問題。

5、行內函數的優缺點
(1)優點:
1)inline定義的行內函數,函式程式碼被放在符號表中,在使用時進行替換(向巨集一樣展開),效率高。
2)類的行內函數也是函式,編譯器在呼叫一個行內函數時,首先會檢查引數問題,保證型別和語義正確,向對待真正函式一樣消除隱患和侷限性。
(2)缺點
1)如果函式的程式碼較長,使用行內函數將消耗過多記憶體,這種情況編譯器會自動把它作為非行內函數處理。
2)如果函式體內有迴圈,那麼執行函式程式碼時比呼叫開銷大。

6、巨集與函式的選擇
以下情況選擇巨集,其他情況選擇函式:
(1)用巨集代表簡短的表示式時;
(2)在考慮效率的時候,可以考慮用巨集或者行內函數;
(3)在標頭檔案保護(防止重複編譯)的時候,如:條件編譯中的#ifdef、#if defined以及assert的實現。

相關推薦

【c語言】巨集(#define、#和##)函式比較

#define -定義識別符號 ef:#define在預處理階段替代所有的Max #define Max 100 int main() { printf("%d\n", Max); system("pause"); return 0

巨集函式比較

1、巨集的概念 巨集定義是指將一個識別符號定義一個字串,在源程式中該識別符號被字串替換的實現方式。巨集書寫的格式為:#define 巨集名(引數表) 巨集。 2、巨集與函式的區別 3、巨集的優缺點 (1)優點: 1)提高程式的可讀性,而且方便修改;

C++中巨集函式的區別

巨集在編譯時就被替換成它內部的語句了,而函式是執行時呼叫的 所以如果是簡單的東西就寫成巨集,這樣沒有呼叫函式的開銷,效率會高一些。相反,由於巨集每被呼叫一次,就相當於把程式碼複製一份,所以如果比較複雜的巨集被多次呼叫的話,會增加程式碼的體積。因此,太複雜的運算就寫成函式比較好了。 另外,要注意在巨集

含引數的巨集函式、行內函數的區別

含引數的巨集與函式的區別 1、巨集替換不佔執行時間,只佔編譯時間;而函式呼叫則佔執行時間(分配單元、保留現場、值傳遞、返回),每次執行都要載入,所以執行起來比較慢一些。 2、 定義巨集的時候不要在巨集及其引數之間鍵入空格,因為巨集替換的時候會把你不經意打的空格當作巨集的一部分進去

c學習筆記--3關鍵字 巨集函式定義

好久之前的了,學習c語言的筆記。 依舊是老套路,從基礎的變數型別,到函式定義一步步學起 #include <stdio.h> #include <string.h> //函式定義 與關鍵字 //define用於巨集定義 程式中不能更

含引數的巨集函式的區別

? 巨集替換不佔執行時間,只佔編譯時間;而函式呼叫則佔執行時間(分配單元、保留現場、值傳遞、返回),所以每次執行都要載入所以執行起來比較慢一些。。 ? 定義巨集的時候不要在巨集及其引數之間鍵入空格,因為巨集替換的時候會把你不經意打的空格當作巨集的一部分進去。 ? 在巨

論述含引數的巨集函式的優缺點。

1.函式呼叫時,先求出實參表示式的值,然後帶入形參。而使用帶參的巨集只是進行簡單的字元替換。 2.函式呼叫是在程式執行時處理的,分配臨時的記憶體單元;而巨集展開則是在編譯時進行的,在展開時並不分配記憶體單元,不進行值的傳遞處理,也沒有“返回值”的概念。 3.對函式中的實參和形參都要定義型別,二者的型

含引數的巨集函式有什麼區別?

含引數的巨集有時完成的是函式實現的功能,但是並非所有的函式都可以被含引數的巨集所替代,各自特點如下:函式呼叫時,首先求出實參表示式的值,然後帶入形參。而使用帶參的巨集只是進行簡單的字元替換。函式呼叫是在

論述帶引數的巨集函式的區別

1函式呼叫時,先進性實參表示式的值,然後帶入形參,而使用巨集只是進行簡單的字元替換. 2函式呼叫是在程式執行時處理的 ,分配臨時的記憶體單元;而巨集展開則是在編譯時進行的,在展開時並不分配記憶體單元,不進行值得傳遞處理,也沒有 "返回值"的概念. 3對函式中的實參與形參都要定

linux核心 訊號量自旋鎖、延時函式比較

       在驅動程式中,當多個執行緒同時訪問相同的資源時(驅動程式中的全域性變數是一種典型的共享資源),可能會引發"競態",因此我們必須對共享資源進行併發控制。Linux核心中解決併發控制的最常用方法是自旋鎖與訊號量(絕大多數時候作為互斥鎖使用)。   自

【C語言】typedef(自定義資料型別)#define(巨集定義)用法比較

  不管是在C語言還是在C++中,typedef這個詞都不少見,當然出現頻率較高的還是在C程式碼中。typedef和#define有些相似,但更多的是不同,特別是在一些複雜的用法上,就完全不同了。      1.巨集定義(#define)      巨集定義又稱為巨集代換

Verilog中函式任務比較

http://blog.163.com/taofenfang_05/blog/static/64214093201181692057682/ 任務和函式只能實現組合邏輯,而對時序邏輯無能為力。 1  任務     任務就是一段封裝在“task-endtask”之間的程式

【C/C++】inline函式和static函式巨集定義的比較

inline行內函數 1.行內函數的定義:行內函數是指用inline關鍵字修飾的函式。如果行內函數在類體內定義,不用inline關鍵字宣告,預設為行內函數。 2.行內函數在函式呼叫點展開,沒有棧幀的開闢和回退。行內函數函式是在編譯時直接插入函式程式碼的,會增加程式碼大小,

【讀書1】【2017】MATLAB深度學習——代價函式比較(2)

如果你覺得很難趕上學習進度,不要氣餒。 If you had a hard time catching on, don’tbe discouraged. 事實上,在研究深度學習時,理解反向傳播演算法並不是一個至關重要的因素。 Actually, understa

關於DB2ORACLE相關常用函式比較分析

ORACLE DB2 Driver oracle.jdbc.driver.OracleDriver com.ibm.db2.jcc.DB2Driver 驅動包 聚合函式

解決巨集定義函式名衝突的問題

畢竟典型的一個問題是<windows.h>裡面的max和min的巨集定義與 std::numeric_limits<std::streamsize>::max()和std::numeric_li

函式指標、函式物件、仿函式比較入門

#include<iostream> using namespace std; typedef void (*func)(int ); void print(int value) { printf("%d ", value); } void

C語言巨集定義、巨集函式、內建巨集常用巨集

前言: 在C語言中,變數型別、迴圈控制、基礎語法等與其他高階語言基本無異;而C語言(C++)特有的兩把雙刃劍指標和巨集定義/巨集函式使得C語言在底層開發中披荊斬棘、無所不能。這兩個概念涉及範圍比較廣,其分支點也比較多,可謂星羅棋佈,但這每顆星都足以照亮C語言因其

C++虛擬函式JAVA中抽象函式比較 介面抽象類比較

C++虛擬函式與Java中抽象函式比較 1:java中沒有虛擬函式的概念,但是有抽象函式的概念,用abstract關鍵字表示,java中抽象函式必須在抽象類中,而且抽象 函式不能有函式體,抽象類不能被例項化,只能由其子類實現抽象函式,如果某個抽象類的子類仍是抽象類,那麼該子

巨集定義函式普通函式的區別

#define MAX(a,b) ((a)>(b)?(a):(b)) int MAX1(int a,int b) { return a>b?a:b; } 1)巨集定義函式沒有引數型別也不做