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

2023-11-14

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++编译器对性能、安全等问题的考虑。很多特性看似不太人道,但深究其中,绝对有其中的道理,这些问题在我以后的文章中还会多次提到并举例。

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 基于Lasagne实现限制玻尔兹曼机(RBM)

    RBM理论部分大家看懂这个图片就差不多了 Lasagne写代码首先要确定层与层 RBM 正向反向过程可以分别当作一个层 权值矩阵互为转置即可 代码 coding utf 8 data format is bc01 written by Ph
  • 【Shell编程】Shell中Bash变量-用户自定义变量

    目录 系列文章 Bash变量 用户自定义变量 变量的命名规则 变量分类 本地变量 实例 系列文章 Shell编程 Shell基本概述与脚本执行方式 Shell编程 Shell中Bash基本功能 Bash变量 用户自定义变量 变量的命名规则
  • 前端跨域解决方案

    目录 同源政策 跨域 常见的跨域场景 跨域解决方案 1 JSONP跨域 1 原生JS实现 2 jquery Ajax实现 3 Vue axios实现 后端node js代码 2 跨域资源共享 CORS 1 简单请求 2 非简单请求 3 CO
  • 满载大模型技能干货的AI Day活动全新来袭

    AI大模型时代 创造力才是第一生产力 满载大模型技能干货的AI Day主题活动全新来袭 丰富有趣的Workshop即将空降你的学校 帮助大家掌握前沿技能 拓展技术视野 迈进AIGC的大门 打造属于你的AI应用 满足不同阶段的学习实践需求 无
  • AD10软件打不开,停留在开机界面上

    解决办法 把AD10的缓存文件都删掉 C Users Administrator AppData Roaming Altium下的文件都删掉
  • 二分图最大完美匹配

    嗯 想不通 就是二分之后的点 寻找左边的点和右边的点的保证两条边的顶点不相同的最大边数 匈牙利算法 O mn 左边寻找和右边相邻的边 如果右边还没有和左边进行连线 那么匹配成功 如果右边已经进行连线 那么考虑左边是否能更改连线 换一个右边
  • Qt总结——菜单隐藏

    我们在使用QMenu的时候经常会在其中添加子菜单以及action QMenu中的隐藏禁用的操作是针对action的 所以直接操作action是没有问题的可以想要的效果 但是menu不行 因为不是action类型的 QAction actio
  • 元组:(tuple)

    1 元组 tuple tuple 相比较列表list 元组和列表都是一种有序集合 0 2 3 5 9 第一个元素即是第一个存入的元素 按照存放顺序存储 元组的访问 格式 元组名 下标 tuple4 1 2 3 4 5 print tuple
  • python从视频信息中提取音频,只用了三行代码...

    在做多媒体素材的时候 往往需要从视频中提取音频信息 在python中提供了moviepy这个非标准库 可以很快的帮助我们完成这个操作 算上导入moviepy非标准库的操作只需要三行代码完成 喜欢记得收藏 关注 点赞 1 单文件处理 将mov
  • Java 性能优化的 50 个细节

    前言 在JAVA程序中 性能问题的大部分原因并不在于JAVA语言 而是程序本身 养成良好的编码习惯非常重要 能够显著地提升程序性能 1 尽量在合适的场合使用单例 使用单例可以减轻加载的负担 缩短加载的时间 提高加载的效率 但并不是所有地方都
  • MySQL 表的 添加、更新与删除数据

    添加数据 为表中的所有 部分字段 添加数据 可以添加部分 也可以全部添加 INSERT INTO 表名称 字段名 VALUES 数据类型对应的 值 指定的字段 或 全部字段添加的数据 INSERT INTO 表名称 SET 字段名 值 同时
  • 用python实现时间序列自相关图(acf)、偏自相关图(pacf)

    自相关图是一个平面二维坐标悬垂线图 横坐标表示延迟阶数 纵坐标表示自相关系数 偏自相关图跟自相关图类似 横坐标表示延迟阶数 纵坐标表示偏自相关系数 自相关图与偏自相关图的python代码实现 from statsmodels graphic
  • 一个对象赋予另一个对象

    它的两个对象 n1 和n2 是在 main 里创建的 每个对象中的i 值都赋予了一个不 同的值 随后 将 n2 赋给n1 而且 n1 发生改变 当给n1 i赋值时 n2 i也会随着改变 这是由于无论n1 还是n2 都包含了相同的句柄 它指向
  • stm32cubeide驱动LCD1602显示屏

    STM32驱动LCD1602 硬件连接关系 STM32CUBEIDE设置 代码 项目设置 最后运行 硬件连接关系 LCD1602 STM32 VCC VCC GND GND VO VCC 滑动变阻 RS PB1 RW PB2 BOOT1 E
  • 上海国际区块链赋能传统产业峰会-王伟:道道人才链启动

    上海国际区块链赋能传统产业峰会 王伟 道道人才链启动 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 经信研究 国研智库 国情讲坛 万赢信采编 在当前 区块链成为全球技术发展的前沿阵地 谋定研究 对话中国经济和信息化 区块链将加速 可信
  • QPixmap的尺寸设置

    问题描述 在控件上使用QPixmap时 希望能重新修改图片的分辨率 而不是使用图片的原始分辨率 解决方法 主要有两种方法 设置控件的尺寸 例如QPixmap被传入一个QLabel控件时 可以通过设置QLabel控件的尺寸来对QPixmap进
  • C++11 noexcept 关键字用法学习

    最近学习和写了一个 mint 的板子 其中用到了 noexcept 关键字 对这个关键字不太熟悉 便学习一下刘毅学长的文章 C 98 中的异常规范 Exception Specification 傲芙小说网 https www 3973 i
  • kaggle冠军代码汇总

    https www cnblogs com rw rongwei p 6509146 html
  • linux 查看进程和内存使用情况,深入理解linux下查看进程内存的使用情况

    本篇文章是对linux下查看进程内存的使用情况进行了详细的分析介绍 需要的朋友参考下 动态查看一个进程的内存使用 复制代码 代码如下 1 top命令 top d 1 p pid pid 设置为delay 1s 默认是delay 3s 如果想
  • 为什么C++内置类型的局部变量不能默认初始化

    C 有个人所共知的特性 就是它的内置类型是无法在局部区域内默认初始化的 如下所示 int k int main int m cout lt