博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++编译器优化
阅读量:6701 次
发布时间:2019-06-25

本文共 1717 字,大约阅读时间需要 5 分钟。

1、volatile:

易变性:volatile告诉编译器,某个变量是易变的,当编译器遇到这个变量的时候,只能从变量的内存地址中读取这个变量,不可以从缓存、寄存器、或者其它   任何地方读取。顺序性:两个包含volatile变量的指令,编译后不可以乱序。注意是编译后不乱序,但是在执行的过程中还是可能会乱序的,这点需要由其它机制来保证,例如memory- barriers。不可优化性:volatile告诉编译器,不要对这个变量进行各种激进的优化,甚至将变量直接消除,保证代码中的指令一定会被执行。

2、NRV(Named Return Value)优化:

函数返回一个类,例如下:

class X;

X bar()
{

X x1;// 处理 x1..return x1;

}

编译器实现:

// 函数实现
void bar(X& __result) // 加上一个额外参数
{

// 预留x1的内存空间X x1;// 编译器产生的默认构造函数的调用,x1.X::X();// 处理 x1..// 编译器产生的拷贝操作__result.X::X(x1);return;

}

// 函数调用
X x2; // 这里只是预留内存,并未调用初始化函数
bar(x2);

NRV优化后:

void bar(X& __result)
{

// 调用__result的默认构造函数__result.X::X();// 处理__resultreturn;

}

3、循环内变量优化:

void test2(char *s);
void test()
{
int i;
for (i = 0; i < 10; i ++) {

char buf[256];test2(buf); //调用test2是为了让编译器认为buf有用,以免被优化掉

}

}

汇编代码:

movl $10, %ebx
subl $272, %esp #分配272字节栈空间
leal -264(%ebp), %esi #取buf地址
.L2:
movl %esi, (%esp) #buf地址入栈
call test2 #调用test2
subl $1, %ebx
jne .L2 #循环未结束则跳到L2

该函数中,buf不会每次循环都生成,而是循环外生成,循环内不断的使用。

4、算数式优化

a*2被编译成a+a;无符号数a/2被编译成a>>1;有符号数a/2。

5、memset函数优化

memset函数常用来初始化大段内存,但对小数据来说memset能否保持足够高效呢?
看这段程序:

编译成汇编:

movl $0, -24(%ebp) #设置s1
movl $0, -20(%ebp)
movl $0, -16(%ebp)
movl $0, -12(%ebp)
call test2 #调用test2
leal -8216(%ebp), %edx #设置s2
xorl %eax, %eax
movl %edx, %edi
movl $2048, %ecx
rep stosl
movl %edx, (%esp) #调用test2
call test2
movl %ebx, (%esp) #设置s3
movl $8193, 8(%esp)
movl $0, 4(%esp)
call memset
movl %ebx, (%esp) #调用test2
call test2
当数据长度比较小时(如s1是16字节),memset被编译成连续的赋值语句;当数据长度不大于8KB时(如s2),memset用串操作指令来实现;当数据长度大于8KB时(如s3),memset被编译成函数调用。

串操作类指令:在内存一个存储区域连续存放着若干个字节(或字)数据,这样一组数据称为“数据串”(高级语言视为数组)。若每个数据是一个字节,称“字节串”;若是字,则称“字串”。串操作指令可以用来实现内存区域的数据串操作。串操作指令每次只处理数据串中的一个数据,但与重复前缀配合使用(重复前缀+串操作指令),则可使操作重复进行(其执行过程相当于一个循环程序的运行,重复次数由寄存器CX决定)。

转载地址:http://ynwlo.baihongyu.com/

你可能感兴趣的文章
微金时代:小额贷款公司如何做好“小额贷款贷前风险管控”
查看>>
大数据将在今后改变智能手机的应用方式
查看>>
SDN,这一年都经历了什么?
查看>>
财富杂志公布最佳雇主排名 NetApp高居榜首
查看>>
2017云栖大会开源峰会预告
查看>>
CEA开源性能测试工具N2D2 人工智能芯片竞赛开始了
查看>>
红帽公司即将进军OpenStack网络融合工作
查看>>
警告:非智能手机可入侵核电站的物理隔绝设备
查看>>
CTO下午茶:化繁为简,面面俱到
查看>>
游戏安全资讯精选 2017年 第七期:游戏账号窃取日益猖獗,Struts2 REST插件远程执行命令漏洞全面分析,2017世界物联网博览会IoT安全观点...
查看>>
项立刚:FDD牌照发放 难改行业大格局
查看>>
移动广告作弊流量超过30%?你中招了吗
查看>>
CentOS 6.5环境 MongoDB 3.2.8 单实例安装部署
查看>>
基于阿里云MaxCompute实现复杂事件检测
查看>>
一键部署自动感知服务的Docker集群(一)
查看>>
【D3.js 学习总结】17、D3布局-分区图(矩形)
查看>>
《C语言及程序设计》实践项目——数组与指针
查看>>
MySQL中char和varchar有啥区别?优缺点是啥?
查看>>
PostgreSQL的函数安全定义解说
查看>>
pageinspect介绍
查看>>