C/C++代码优化方法

目录

  • 优化概述
  • _O0优化
  • _O1优化
  • _O2优化
  • _O3优化
  • volatile关键字避免优化

优化概述

如果将未经优化的C语言程序直接运行会发现运行效率较低,并且产生的代码较大,而通过优化可以较好地解决这些问题。

优化的作用是对循环进行化简,重新组织表达式和声明,将变量直接分配到寄存器中。

通过优化可以提高程序运行效率,缩小程序编码数量。

C/C++编译器提供了不同的优化选择,通过修改cl55命令行中的-on选择就可以方便地选择不同的优化等级,n代表优化等级,包括0、1、2和3。下面给出不同优化等级的功能。

_O0优化

1、 简化控制流图
2、把变量分配到寄存器
3、分析循环的各种情况,只保留一个退出循环的分支
4、删除未用的代码
5、简化表达式和声明
6、把用inline声明的函数变为调用关系

_O1优化

除了O0的各种优化功能外,还有如下功能:
1、在分配变量时,将数值直接赋给变量而不是给出变量的索引值
2、去掉没有用的分配变量和表达式
3、去掉本地通用表达式

_O2优化

除了O1的各种优化功能外,还有如下功能:
1、完成循环优化
2、去掉全局通用的子表达式
3、去掉全局没有用的分配变量和表达式
4、完成循环的化解
5、当只用-O选项时优化器自动进行-O2优化

_O3优化

除了O2的各种优化功能外,还有如下功能:
1、去掉未调用的函数
2、简化返回值未使用的函数
3、将小函数进行内嵌调用
4、对被调用的函数声明进行重新排序,以便被优化的调用方能够找到该函数
5、完成文件级优化

volatile关键字避免优化

优化器分析数据流时将尽量减少对内存的访问,如果这个数据必须从内存中得到,则该数据必须用volatile关键字定义,这样可以使编译器不对该变量进行优化。
例如声明一个指针

unsigned int *ctrl; 

当在循环中有如下语句时

while (*ctrl != 0xFF);

优化器将只在进入循环的初始化中进行一次内存读,而在循环当中不在更新该变量的内容,如果该变量被中断或其他程序改变,由于循环中的ctrl的值没有更新,将会使程序不能按照正确的方式执行,这里应当用如下方法声明ctrl:

volatile unsigned int *ctrl;

特别当该变量在中断函数中被赋值,而该变量在主函数的循环中被用到时,必须用volatile声明该变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大学生应当趁早谋划未来(二)--给表弟的建议

背景表弟,大四,湖北某二本院校,计算机相关专业。大学期间,对Java等编程没有兴趣,几乎没怎么学习。平时,课程比较多,每天6节左右。课外,自己去挣点生活费,父亲生病了。困境最近在找工…

UVa 490 - Rotating Sentences

把输入的字符顺时针旋转90度。 1 #include<stdio.h>2 #include<string.h>3 4 int main()5 {6 int i, j, max, n, m;7 char s[105][105];8 max0;9 memset(s, \0, sizeof(s)); 10 for (i0; gets(s[i]); i) 11 { 12 nstrlen(s[i]); 1…

node 大写_大写Node.js模块

node 大写Today, lets see a third party module that helps us in working with upper-case letters without necessarily typing them in upper-case in our source code. 今天&#xff0c;让我们看一个第三方模块&#xff0c;它可以帮助我们处理大写字母&#xff0c;而不必在…

1704:baoge的洗漱难题[黄]

baoge的洗漱难题[黄] Time Limit: 5000 ms Memory Limit: 65536 KB Total Submit: 79 Accepted: 21 Description众所周知&#xff0c;地大19楼的盥洗室非常小&#xff0c;所以经常会非常拥挤&#xff0c;很多时候去洗漱的时候不得不排很长的队。有时候baoge会排上半小时…

HDU嵌入式实验课程大作业分析报告

目录作业要求设计原理与思路扩展任务说明课程感受友情链接工程链接作业要求 体能测试记录仪设计 基于课程发放的实验板&#xff0c;设计一个带有计时和数据采集功能的体能测试记录仪。 基本设计内容 功能1&#xff1a;对应1000米体测场景&#xff0c;使用充电宝供电&#x…

COJ 1030 素数槽

http://acm.csu.edu.cn/OnlineJudge/problem.php?id1030 用线性筛素数果然快多了。 #include<cstdio> #include<cstring> #include<cstdlib> #define MAXN 1300000 bool is_p[MAXN];void calc() {for( int i 1; i < MAXN; i )is_p[i] true;is_p[1] fa…

html注释引用公共头部_HTML注释和引用

html注释引用公共头部HTML注释 (HTML Comments) To insert a comment in an HTML document, the comment tags are used. The comments are used to provide some information that could be useful for anyone who views the code of the webpage. The comments can be insert…

java连接oracle数据库 -- jdbc连接

a. 倒入oracle的jar包 b. 编写java文件 package com.sp; import java.sql.*; //使用jdbc连接oracle public class MyOra2 {/*** param args*/public static void main(String[] args) {// TODO Auto-generated method stubtry {Class.forName("oracle.jdbc.dri…

HDB3码的编码

编码规则 1、源码是1时&#xff0c;暂时不变&#xff1b; 2、连0不超过3个时不变&#xff0c;有4个或以上连0时把每4个0换为取代节&#xff0c;即B00V&#xff1b; 3、确定B是0还是1&#xff1a;第一个B一般取0&#xff0c;若两个取代节之间1的个数为偶&#xff0c;易推得后者…

地图加载(安全沙箱问题及解决方案)

基于Flash开发的软件浏览器插件会受到应用沙盒限制&#xff0c;譬如说在本机发布了地图服务&#xff0c;在flex中使用localhost获取地图时一切正常&#xff0c;但改成IP地址后就会报安全沙箱错误。 Flash Player对访问外部资源有比较严格的限制&#xff0c;因此如果需要访问…

批量去除文件空格

import osfilepath r"G:\picture" # 文件目录名 allfilepath os.listdir(filepath)for file in allfilepath: # 改目录下的文件名oldpath filepath \\ filenewname file.replace( , ) # 在原先文件名中去除空格&#xff0c;也就是用null替代空格newpath fil…

python 初始化 元组_在Python中重新初始化元组

python 初始化 元组Python | 重新初始化元组 (Python | Reinitializing tuple) In this tutorial, we will learn how can we reinitialize a tuple with a new set of elements/objects? 在本教程中&#xff0c;我们将学习如何使用一组新的元素/对象重新初始化元组&#xff1…

【DSP复习主要知识点】(大概)

目录第一章1、数字系统对比模拟系统2、冯诺依曼、哈佛架构3、CISC、RISC4、DSP特点5、cpu流水线作用6、DSP芯片优点第二章&#xff1a;DSP芯片结构原理1、ALU&#xff08;算数逻辑运算单元&#xff09;2、累加器A和B3、桶形移位器的功能4、乘法/加法单元5、CPU状态与控制寄存器…

PHP CURL POST无法获取响应内容的问题

现象&#xff1a; 使用PHP的CURL相关函数进行POST&#xff0c;当要POST的参数内容长度超过1024时&#xff0c;将无法获得response的数据。 即&#xff1a; [php] view plaincopyprint?curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS,…

每天自动给自己发天气预报的脚本

需求&#xff1a; 每天早上起来可以看看天气预报&#xff0c;然后顺便当个闹钟使 思路是这样的&#xff1a; 模块一&#xff1a;采用yahoo weather api获取北京的天气 模块二&#xff1a;通过网页版飞信&#xff0c;模拟飞信登陆&#xff0c;给自己发短信 模块三&#xff1a;发…

YYSSW的完整格式是什么?

YYSSW&#xff1a;是的&#xff0c;肯定的&#xff0c;无论如何 (YYSSW: Yeah Yeah Sure Sure Whatever) YYSSW is an abbreviation of "Yeah Yeah Sure Sure Whatever". YYSSW的缩写是“ Yeah Yeah Sure Sure Whatever” 。 It is an expression, which is commonl…

Json转二值图像

Json文件通过labelme进行标识 image路径 G:\PyCharm\workspace\unet_42-master\datasets\label_bz\test\image label路径 G:\PyCharm\workspace\unet_42-master\datasets\label_bz\test\label 待转换路径 G:\PyCharm\workspace\unet_42-master\datasets\label_bz\test\mask …

矩形波傅里叶变换对以及三角波傅里叶变换

时域矩形波->频域sinc 时域三角波->频域sinc^2:

关于苹果IPhone/Ipad(IOS)开发者证书申请及安装、真机调试、发布的参考文章

这是我在申请、安装IOS开发者证书&#xff0c;真机调试时候参考的文章&#xff0c;非常有用。 1、开发证书与发布证书申请和安装步骤 http://blog.csdn.net/zougangx/article/details/6074313 2、申请IDP/真机调试/GameCenter 指南/OpenFeint指南&#xff1a; http://xiaomingh…

scrollTop

chrome 不支持 document.documentElement.scrollTopfirefox 不支持 document.body.scrollTop 解决办法var sTopdocument.body.scrollTopdocument.documentElement.scrollTop; var nowScrollTop document.body.scrollTopdocument.documentElement.scrollTop; document.body.scr…