預設參數和可變參數的記憶體管理:預設參數:在函數堆疊幀中分配內存,大小為其類型的位元組數。可變參數:在堆疊幀的尾部分配內存,大小由可變參數數量決定:sizeof(void ) (傳入參數數量1)
C 中的函數參數傳遞機制涉及值拷貝或引用,這會影響記憶體管理。本文將深入剖析預設參數和可變參數的記憶體管理行為。
預設參數在函數定義時指定,用於在沒有傳遞實際參數時提供預設值。它們在編譯時展開,其記憶體分配發生在函數堆疊幀中。例如:
void myFunction(int x = 10);
在函數呼叫時,如果未傳遞 x
參數,則使用預設值 10
。預設參數的記憶體分配大小為其類型的大小。
可變參數允許函數接受不定數量的參數。它們使用 ...
表示,位於參數清單的末端。可變參數在運行時展開,其記憶體分配發生在堆疊幀的尾部。例如:
void myFunction(int x, ...);
在處理可變參數時,函數會建立一個可變參數列表對象,該對象儲存指向實際參數記憶體位址的指標數組。可變參數物件的記憶體分配大小為 sizeof(void *) * (傳入參數數 1)
。
以下範例展示了預設參數和可變參數的記憶體管理行為:
#include <iostream> void withDefault(int x = 10) { std::cout << "x in 'withDefault' is: " << x << std::endl; } void withEllipsis(int x, ...) { std::va_list args; va_start(args, x); int sum = x; int arg; while (va_arg(args, int) != NULL) { // 获取可变参数并累加 arg = va_arg(args, int); sum += arg; } va_end(args); std::cout << "Sum of all arguments in 'withEllipsis' is: " << sum << std::endl; } int main() { withDefault(); withEllipsis(1, 2, 3, 4, 5, NULL); return 0; }
輸出:
x in 'withDefault' is: 10 Sum of all arguments in 'withEllipsis' is: 15
以上是C++ 函數預設參數和可變參數的記憶體管理剖析的詳細內容。更多資訊請關注PHP中文網其他相關文章!