变量的初始化与使用C语言程序注释,c - (为什么)使用未初始化的变量未定义行为?...
C标准为编译器提供了很大的优势来执行优化。 如果您假设一个简单的程序模型,其中未初始化的内存被设置为某个随机位模式,并且所有操作都按照它们的写入顺序执行,那么这些优化的后果可能会令人惊讶。
注意:以下示例仅有效,因为x从未使用其地址,因此它是“类似寄存器”。 如果x = - x的类型具有陷阱表示,它们也将有效; 这对于无符号类型来说很少见(它需要“浪费”至少一位存储空间,并且必须记录在案),而-x则不可能。如果x有签名类型,那么实现可以定义不是 - (2n-1-1)和2n-1-1之间的数字作为陷阱表示。 见Jens Gustedt的回答。
编译器尝试将寄存器分配给变量,因为寄存器比内存快。 由于程序可能使用比处理器具有寄存器更多的变量,因此编译器执行寄存器分配,这导致在不同时间使用相同寄存器的不同变量。 考虑程序片段
unsigned x, y, z; /* 0 */
y = 0; /* 1 */
z = 4; /* 2 */
x = - x; /* 3 */
y = y + z; /* 4 */
x = y + 1; /* 5 */
当评估第3行时,x = - x尚未初始化,因此(编译器的原因)第3行必须是由于编译器不够聪明的其他条件而不能发生的某种侥幸。 由于在第4行之后未使用-x,并且在第5行之前未使用x,因此可以对两个变量使用相同的寄存器。 所以这个小程序编译成寄存器上的以下操作:
r1 = 0;
r0 = 4;
r0 = - r0;
r1 += r0;
r0 = r1;
最终值x = - x是最终值-x,最终值x是最终值x.这些值是x = -3和y = -4,而不是5和4,如果x = some_value()已经发生 正确初始化。
有关更详细的示例,请考虑以下代码片段:
unsigned i, x;
for (i = 0; i < 10; i++) {
x = (condition() ? some_value() : -x);
}
假设编译器检测到x = - x没有副作用。 由于-x不修改x,编译器知道第一次循环运行不可能访问x,因为它尚未初始化。 因此,循环体的第一次执行相当于x = some_value(),无需测试条件。 编译器可以编译此代码,就像您编写的那样
unsigned i, x;
i = 0; /* if some_value() uses i */
x = some_value();
for (i = 1; i < 10; i++) {
x = (condition() ? some_value() : -x);
}
这可以在编译器内建模的方式是考虑依赖于x = - x的任何值都具有方便的值,只要-x未初始化即可。 因为未初始化变量未定义时的行为,而不是仅具有未指定值的变量,编译器不需要跟踪任何方便值之间的任何特殊数学关系。 因此编译器可以用这种方式分析上面的代码:
在第一次循环迭代期间,x = - x在评估-x时未初始化。
x = - x具有未定义的行为,因此它的值是任何方便的。
优化规则? 价值:价值适用,所以这段代码可以简化为; 值。
当遇到问题中的代码时,同一个编译器会分析当评估x = - x时,-x的值是方便的。 因此,可以优化分配。
我没有找到一个行为如上所述的编译器的例子,但它是优秀的编译器试图做的优化。 遇到一个我不会感到惊讶。 这是程序崩溃的编译器的一个不太合理的例子。 (如果在某种高级调试模式下编译程序,可能不会令人难以置信。)
这个假设的编译器将每个变量映射到不同的内存页面并设置页面属性,以便从未初始化的变量读取会导致调用调试器的处理器陷阱。 首先对变量赋值,确保其内存页面正常映射。 此编译器不会尝试执行任何高级优化 - 它处于调试模式,旨在轻松定位诸如未初始化变量之类的错误。 当评估x = - x时,右侧会导致陷阱并且调试器将启动。
变量的初始化与使用C语言程序注释,c - (为什么)使用未初始化的变量未定义行为?...相关推荐
- 学C的第一天(初识C语言、VS创建C语言程序、数据类型简单了解、简单了解变量)
========================================================================= 相关代码gitee自取:C语言学习日记: 加油努力 ...
- C语言程序入门之基本数据类型、常量与变量、运算符
目录 一.基本数据类型 1.整型 2.浮点型 3.字符型 二.常量与变量 1.常量 2.变量 三.运算符 1.算术运算符 2.关系运算符 3. 逻辑运算符 4.位运算符 5.自增自减运算符 6.赋值 ...
- c语言程序跟踪调试,VC6断点调试之监视变量
上两讲中,为大家介绍到了VC6编译器的断点调试技巧,教给大家如何设置\取消断点.单步和跟踪一个程序.让大家具备基本的调试一个程序的能力.今天我们将继续深入研究教大家如何更细致.深入的跟踪和分析一个C程 ...
- 歌手比赛系统c语言程序注释,C语言程序课程设计—歌手比赛系统(20页)-原创力文档...
淮南师范学院 课程设计报告 歌手比赛系统 姓 名:胡欢欢 学号: 1008010109 专 业:计算机科学与技术 班 级: 10 级( 1)班 指导教师:彭飞 职称: XXX 2013 年 3 月 7 ...
- 用标准C语言初始化线性表,C语言数据结构-顺序线性表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作...
1.数据结构-顺序线性表的实现-C语言 #define MAXSIZE 100 //结构体定义 typedef struct { int *elem; //基地址 int length; //结构体当 ...
- 简单通讯录c语言程序注释,Objective-C简易通讯录的实现
1.Contact.h #import @interface Contact : NSObject /** * 姓名 */ @property(nonatomic, copy) NSString * ...
- MCS-51单片机C语言程序注释,精通MCS-51单片机C语言编程
领取成功 您已领取成功! 您可以进入Android/iOS/Kindle平台的多看阅读客户端,刷新个人中心的已购列表,即可下载图书,享受精品阅读时光啦! - | 回复不要太快哦~ 回复内容不能为空哦 ...
- php 初始化漏洞,这样做是不是不会引起PHP全局变量未初始化漏洞
业余自学的PHP,想给自己写一个博客. 目前的思路是为每个可在前台显示的文件都要包含global.php文件 global.php文件define(GLOBAL_PHP,true) 每个不能显示的文件 ...
- cmake编译pcl程序时出现‘boost::this_thread::hiden::sleep_until(timespec const)’未定义的引用
CMakeFiles/main.dir/main.cpp.o:在函数'boost::this_thread::sleep(boost::posix_time::ptime const&)'中: ...
最新文章
- python数据分析numpy_Python数据分析之numpy学习
- php程序包括什么,php程序是什么
- 速达财务3000服务器账套维护显示,速达3000财务软件使用常见问题
- python中left是什么意思_Python left
- freemarker文件乱码问题
- java中RandomAccessFile随机文件读写,文件追加和部分读取
- [转载] python的numpy.random详细解析
- 促促促,如何确保系统扛得住 | 《尽在双11》抢鲜预览
- 六级病历对门诊电子病历系统功能要求的初步梳理
- 经纬财富:莆田炒现货白银技巧
- PostgreSQL下载安装
- Html div 打印自动分页,真正好用的网页打印和分页方法:CSS+DIV或元素ID
- python 典型相关分析_Canonical Correlation Analysis 典型相关分析
- 编译原理个人作业--第五章——基于 编译原理 国防工业出版社 第三版
- 你只管善良,剩下交给时间
- 单例模式之懒汉式单例模式
- C语言 | Linux下的静态链接与动态链接
- kettle使用--1.mysql多表关联导入mongoDB
- 基于模板匹配和遗传算法的人眼定位
- GraphSAGE: 算法原理,实现和应用
热门文章
- 常量池在堆还是方法区_第九章_方法区
- apache根据ip分发_腾讯广告进入“IP新融点”时代
- 如何在UE4中创建线程
- __attribute__ 之weak,alias属性
- Ubuntu apt-get 卸载命令
- DOC学习之TrueFFS
- python应声虫程序_Python编程基础
- python安装vtk_python - 安装VTK for Python - SO中文参考 - www.soinside.com
- linux实验三makefile,实验平台上Makefile详细的解释
- 第九节:JWT简介和以JS+WebApi为例基于JWT的安全校验