为什么C++内置类型的局部变量不能默认初始化

C++有个人所共知的特性,就是它的内置类型是无法在局部区域内默认初始化的。如下所示

int k;
int main(){
    int m; 
    cout<<k<<endl;
    cout<<m<<endl;
    return 0;
}

编译器会直接报错

错误 C4700 使用了未初始化的局部变量“m”

c++primer上也说,内置类型的局部变量无法默认初始化,刚学到这里时就对其原理产生好奇,为什么全局变量k可以默认初始化为0,而局部变量m就不行呢?然后我去网上搜索了一下相关的资料,终于得到了结论。

 

c++的变量区,可分为四大区域:栈区,堆区,静态区(全局区),常量区

栈区:由编译器分配和释放,主要用于存放局部变量,函数参数等。

堆区:由程序员分配和释放,主要用于指针的声明,如string *p=new("name"),new关键字会在堆区分配内存空间,并构造初始化相应类型变量,返回指针传递给p;

静态区(全局区):用于存放静态变量和全局变量,其中未初始化的静态变量和全局变量存放在一起,未初始化的静态变量和全局变量存放在一起,程序结束后由系统自动释放。

常量区:用于存放常量,如const int age=24;常量age就存放于常量区,结束后由系统自动释放。

 

之前的代码里,k是全局变量,存于静态区(全局区),m是局部变量,存于栈区,局部变量不能默认初始化m是因为它在栈上,全局变量区可以统一清零,但是栈上若加了清零操作,会使得函数调用等操作变得更加缓慢,因此编译器取消了此功能。

 

其实泛观c++各种特性,大都起因于c++编译器对性能、安全等问题的考虑。很多特性看似不太人道,但深究其中,绝对有其中的道理,这些问题在我以后的文章中还会多次提到并举例。

 

 

 

 

 

 

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值