c++自动对象

转自:

https://www.cnblogs.com/geloutingyu/p/8034904.html

1、自动对象
默认情况下,局部变量的生命期局限于所在函数的每次执行期间。只有当定义它的函数被调用时才存在的对象称为自动对象。自动对象在每次调用函数时创建和撤销。该类型局部变量存储在栈上,在动态存储区。
局部变量所对应的自动对象在函数控制经过变量定义语句时创建。如果在定义时提供了初始化,那么每次创建对象时,对象都会被赋予指定的初值。对于未初始化的内置类型局部变量,其初值不确定。当函数调用时结束,自动对象就会被撤销。
形参也是自动对象,其所占存储空间在函数调用时被创建,在函数结束时撤销。

参照c语言来理解一下为什么形参也是自动对象。

test.c
void fun(int i)
{
    i = 20;
}

int main()
{
    int i = 10;
    fun(i);
    return 0;
}

test.s
fun:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $16, %esp
    movl    $20, -4(%ebp)
    leave
    ret

main:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $20, %esp
    movl    $10, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    call    fun
    movl    $0, %eax
    leave
    ret
test.c
void fun(int i)
{
    int x = i;
}

int main()
{
    int i = 10;

    fun(i);
//    printf("%d\n", i);

    return 0;
}

test.s
fun:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $16, %esp
    movl    8(%ebp), %eax
    movl    %eax, -4(%ebp)
    leave
    ret
main:
    pushl    %ebp
    movl    %esp, %ebp
    subl    $20, %esp
    movl    $10, -4(%ebp)
    movl    -4(%ebp), %eax
    movl    %eax, (%esp)
    call    fun
    movl    $0, %eax
    leave
    ret

反正是跟之前的 i 没啥关系了。


2、静态局部对象
用static关键字修饰的局部变量。静态局部变量存储在静态存储区,生命期贯穿整个程序运行期间。作用域同自动局部变量。静态局部对象在所处模块初次运行时进行初始化工作,且只初始化一次。如果不初始化,编译器会自动为其赋初始值为0或空字符。

猜你喜欢

转载自www.cnblogs.com/rivsidn/p/9315491.html