首頁  >  文章  >  後端開發  >  C++ 函數預設參數和可變參數的記憶體管理剖析

C++ 函數預設參數和可變參數的記憶體管理剖析

PHPz
PHPz原創
2024-04-19 21:30:02405瀏覽

預設參數和可變參數的記憶體管理:預設參數:在函數堆疊幀中分配內存,大小為其類型的位元組數。可變參數:在堆疊幀的尾部分配內存,大小由可變參數數量決定:sizeof(void ) (傳入參數數量1)

C++ 函数默认参数和可变参数的内存管理剖析

C 函數預設參數和可變參數的記憶體管理剖析

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn