编程语言漫谈之「初始化与赋值」——以C++和汇编语言为示例

编程语言漫谈之「初始化与赋值」——以C++和汇编语言为示例

1. 赋值时汇编做了什么

当我们在C++中写下如下代码:

int main() {
    int a = 10;
    return 0;
}

这是一个简单的整数类型变量a的初始化赋值. 我们知道, 如果只定义了一个变量,而没有进行初始化, 后面取这个值时,可能会取出一串奇怪的数字.
那么回到最基本的汇编语言, 赋值操作做了什么?

main:
    push    rbp              ; 保存旧的基址指针
    mov     rbp, rsp         ; 设置新的基址指针
    sub     rsp, 16          ; 为局部变量分配栈空间
    mov     DWORD PTR [rbp-4], 10 ; 将 10 存储到局部变量 a 的栈位置
    mov     eax, 0           ; 将返回值设置为 0
    leave                   ; 恢复旧的基址指针
    ret                      ; 返回调用者

2. 在变量定义时做初始化, 与在使用时才进行初始化, 有区别吗?

在static 修饰局部变量时, 是有区别的
例如,

#include <iostream>

void func() {
    static int a = 10; // 定义时直接初始化
    std::cout << "a: " << a << std::endl;
    a++;
}

int main() {
    func(); // 第一次调用,a 被初始化为 10,然后自增为 11
    func(); // 第二次调用,a 保持其上次的值 11,然后自增为 12
    func(); // 第三次调用,a 保持其上次的值 12,然后自增为 13
    return 0;
}

而如果在使用时才进行初始化:

#include <iostream>

void func() {
    static int a; // 只声明但未显式初始化
    a = 10; // 每次调用函数时都将 a 赋值为 10
    a++; // 自增
    std::cout << "a: " << a << std::endl;
}

int main() {
    func(); // 第一次调用, 11
    func(); // 第二次调用, 11
    func(); // 第三次调用, 11
    return 0;
}


  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

steptoward

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值