C语言关键字之voliate

C语言关键字之voliateC语言关键字之voliatevoliate的作用是作为指令关键字,确保本条指令不会因为编译器的优化而省略,而且要求每次从内存中直接读取值当使用voliate声明变量值时,系统总是重新从它所在的内存读取数据,直接访问变量地址,而编译器对于访问该变量时也不再进行优化voliate关键字影响编译器的结果,用voliate声明的变量表示该变量随时可能发生变化(因为编译器优化时可能将其放入寄存器中),与…

大家好,又见面了,我是你们的朋友全栈君。

C语言关键字之voliate

voliate的作用是作为指令关键字,确保本条指令不会因为编译器的优化而省略,而且要求每次从内存中直接读取值

当使用voliate 声明变量值时,系统总是重新从它所在的内存读取数据,直接访问变量地址,而编译器对于访问该变量时也不再进行优化

voliate关键字影响编译器的结果,用voliate 声明的变量表示该变量随时可能发生变化(因为编译器优化时可能将其放入寄存器中),与该变量有关的运算,不要再进行编译优化以免出错。

寄存器常用的优化方法:1.将内存变量缓存到寄存器中

                                           2.调整指令顺序,充分利用CPU指令流水线,进行指令重新排序读写指令。

下面来看一个程序

int main(){

int i = 0;
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

for (i = 0; i < 12; i++)
{ 
   
 arr[i] = i;
 printf("hehe\n");
}
return 0;

}

结果会是什么?出现了数组越界访问,程序还对吗?

但是在vs2013运行的结果却是死循环,为什么?

而且当我们将调试器换为release时竟然运行出来了12个hehe?!!

  1. 首先我们看看为什么会是循环
    内存的存储中的存储是由高到低的
    而数组则是由低到高的

    C语言关键字之voliate

    当到arr[12]时arr[12]的地址又与i的地址相同了,i又被初始为零

    在vs2013中有两个预留的间隔,而在vc6中只有一个预留的间隔所以编译器不一样结果也不一样

  2. 其次我们看看编译器是怎样优化

         

    编译器  更改了指令的顺序,将i的初始时序放到了数组下面,避免了循环,这个可以在反汇编中查看

所以说编译器的优化结果是可能对程序结果产生影响的
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/138692.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 分布式文件存储——简介

    分布式文件存储——简介1、分布式文件系统种类简介:常见的分布式文件系统有:GlusterFS、GoogleFS、FastDFS、TFS等,各自适用的领域不同,它们都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。现在比较火的并且好用的应该就是OSS了,阿里云对象存储服务(ObjectStorageService,简称OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。OSS具有与…

  • 贴片电阻基本知识_贴片电阻怎么测试

    贴片电阻基本知识_贴片电阻怎么测试点点滴滴皆是学问;”1故事的起因2走近贴片电阻2.1贴片电阻的优点2.2识别贴片电阻3命名规则总结1故事的起因有一天,小张正在焊接电路板,我拿起旁边的一块板子问起来,这个R0…

  • IDEA 常用的快捷键整理合集「建议收藏」

    IDEA 常用的快捷键整理合集「建议收藏」IDEA常用的快捷键整理合集Ctrl+Z:撤销Ctrl+Shift+Z:重做Ctrl+X:剪贴Ctrl+C:复制Ctrl+V:粘贴Ctrl+Y:删除当前行Ctrl+D:复制当前行Ctrl+Shift+J:将选中的行合并成一行Ctrl+N:查找类文件Ctrl+Shift+N:查找文件Ctrl+G:定位到文件某一行Alt+向左箭头:返回上次光标位置Alt+向右箭头:返回至后一次光标位置Ctrl+Shift+Backspace:返回上次编辑位置Ctrl+Shift+反斜杠:返回后一

    2022年10月11日
  • 【18】进大厂必须掌握的面试题-15个Kafka面试

    【18】进大厂必须掌握的面试题-15个Kafka面试

    2020年11月14日
  • SpringBoot2.0.4整合elasticsearch为5.6.10

    网上找了很一些,很多跑不起来,可能是我的环境和介绍的环境不一样,自己搞一个! 环境说明:spring boot 使用2.0.4elasticsearch为5.6.10本地安装ES集群为 6.x版本第一步使用IDEA创建Spring boot web项目,使用spring boot 使用2.0.4版本, elasticsearch为5.6.10 &amp;amp;lt;parent…

  • R 语言的安装(详细教程)「建议收藏」

    R 语言的安装(详细教程)「建议收藏」文章目录前言一、R语言是什么?二、R下载1.官网2.downloadbase3.downloadRtools三、Rstudio下载1.官网2.downloadRstudio四、R安装五、Rtools安装六、Rstudio安装七.java的环境配置八.运行RStudio十.R包安装策略1.配置镜像1.修改配置文件1.修改全局设置2.简单命令3.升级R包4.安装Bioconductor上的R包总结前言我不生产知识,我只是知识的搬运工,以下内容是

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号