>  기사  >  백엔드 개발  >  C++ 함수의 기본 매개변수와 가변 매개변수의 메모리 관리 분석

C++ 함수의 기본 매개변수와 가변 매개변수의 메모리 관리 분석

PHPz
PHPz원래의
2024-04-19 21:30:02452검색

기본 매개변수 및 가변 매개변수의 메모리 관리: 기본 매개변수: 함수 스택 프레임에 메모리를 할당하며 크기는 해당 유형의 바이트 수입니다. 변수 매개변수: 스택 프레임 끝에 메모리를 할당하며, 크기는 가변 매개변수 수에 따라 결정됩니다. sizeof(void) (전달된 매개변수 수 + 1)

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

C++ 함수 기본 매개변수 및 메모리 관리 분석 변수 매개변수

C++의 함수 매개변수 전달 메커니즘에는 값 복사 또는 참조가 포함되며 이는 메모리 관리에 영향을 미칩니다. 이 기사에서는 기본 매개변수와 변수 매개변수의 메모리 관리 동작에 대한 심층 분석을 제공합니다.

기본 매개변수

기본 매개변수는 함수 정의 시 지정되며 실제 매개변수가 전달되지 않을 때 기본값을 제공하는 데 사용됩니다. 컴파일 타임에 확장되며 메모리 할당은 함수 스택 프레임에서 발생합니다. 예:

void myFunction(int x = 10);

함수 호출 시 x 매개변수가 전달되지 않으면 기본값 10이 사용됩니다. 기본 매개변수의 메모리 할당 크기는 해당 유형의 크기입니다. x 参数,则使用默认值 10。默认参数的内存分配大小为其类型的大小。

可变参数

可变参数允许函数接受不定数量的参数。它们使用 ... 表示,位于参数列表的末尾。可变参数在运行时展开,其内存分配发生在堆栈帧的尾部。例如:

void myFunction(int x, ...);

在处理可变参数时,函数会创建一个可变参数列表对象,该对象存储指向实际参数内存地址的指针数组。可变参数对象的内存分配大小为 sizeof(void *) * (传入参数数量 + 1)

Variadic 매개변수

Variadic 매개변수를 사용하면 함수가 다양한 수의 매개변수를 허용할 수 있습니다. ...를 사용하여 표시되며 매개변수 목록 끝에 위치합니다. 가변 인수는 런타임 시 해제되며 해당 메모리 할당은 스택 프레임 끝에서 발생합니다. 예:

#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;
}

가변 인수를 처리할 때 함수는 실제 인수의 메모리 주소에 대한 포인터 배열을 저장하는 가변 인수 목록 개체를 만듭니다. 가변 매개변수 객체의 메모리 할당 크기는 sizeof(void *) * (전달된 매개변수 수 + 1)입니다. 🎜🎜다음 예에서는 기본 매개변수와 가변 매개변수의 메모리 관리 동작을 보여줍니다. 🎜
x in 'withDefault' is: 10
Sum of all arguments in 'withEllipsis' is: 15
🎜출력: 🎜rrreee

위 내용은 C++ 함수의 기본 매개변수와 가변 매개변수의 메모리 관리 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.