結構變量是一個標量,它可以用於其他標量可以使用的任何場合,但把結構體作爲參數傳遞給一個函數要注重效率
例如下面這樣一個結構體:
#define PRODUCT_SIZE 20
typedef struct{
char product[PRODUCT_SIZE];
int quantity;
float unit_price;
float total_amount;
}Transaction;
如果我們需要打印裏面的數據,函數原型爲:
void print_receipt(Transaction trans);
將結構體直接傳遞到函數參數,這樣結果正確,但是效率很低,因爲C語言的參數傳遞調用方式要求把參數的一份拷貝傳遞給函數,我們知道這個結構體佔據32個字節的內存空間,要想把它作爲參數進行傳遞,我們必須把32個字節複製到堆棧中,以後再丟棄,但如果傳遞的是指針:
void print_receipt(Transaction *trans);
傳遞的參數是一個指向結構體的指針,指針比結構體小得多,所以把它壓到堆棧上效率要提高很多,傳遞指針的代價是我們必須在函數中使用間接訪問來訪問結構的成員,結構越大,把它指向它的指針傳遞給函數的效率越高。
向函數傳遞指針的缺陷在於函數現在可以調用程序的結構變量進行修改,如果我們不希望如此,可以在函數調用中使用關鍵字const來防止這類修改。
void print_receipt(Transaction const *trans);
另外,需要對結構體裏面的變量進行修改,傳遞指針也是效率最高的一種:
//效率最低,結構體的一份拷貝作爲參數傳遞給函數並被修改,然後一份修改後的結構拷貝從函數返回,結構體被複制了兩次
Transaction compute_total_Transaction(Transaction trans)
{
trans.total_amount = trans.quantity * trans.unit_price;
return trans;
}
//結構體被複制了一次
float compute_total_Transaction(Transaction trans)
{
return trans.quantity * trans.unit_price;
}
//效率最高,調用程序的結構字段total_amount被直接修改,它並不需要把整個結構作爲參數傳遞給函數,也不需要把整個修改過後的結構作爲返回值返回;
void compute_total_Transaction(Transaction *trans)
{
trans->total_amount = trans->quantity * trans->unit_price;
}