【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

最近在代码优化的过程中,发现了两个问题。一个是全局变量的问题,一个是编译乱序的问题。因为一开始的时候没有注意到这些问题,所以现在才弄必然要付出更大的精力。为了说明这两个问题,我们可以写了例子说明一下。

// gcc -O2 -S test.c#include <stdio.h>int a;
int b;void fun1()
{a = 1;
}void fun2()
{while(!a);
}void fun3()
{b = a + 1;a = 0;
}int main(int argc, char* argv[]) {return 1;
}

首先可以看fun2这里边的代码,这个全局变量在gcc -O2 -S test.c下情况如何呢?还有就是fun3中的两行代码会不会乱序呢?做到这些也不难,只要打开优化,看看对应的汇编文件就可以了。

 .p2align 4,,15
.globl fun2.type    fun2, @function
fun2:movl   a, %eaxpushl    %ebpmovl    %esp, %ebptestl %eax, %eaxje    .L7popl %ebpret
.L7:jmp .L7.size    fun2, .-fun2.p2align 4,,15
.globl fun3.type    fun3, @function
fun3:movl   a, %eaxpushl    %ebpmovl    %esp, %ebpmovl  $0, aaddl   $1, %eaxmovl    %eax, bpopl %ebpret.size    fun3, .-fun3.p2align 4,,15

看看这段汇编代码,可以发现fun2中的循环其实就进行了一次,判断结束之后就死循环了。至于fun3呢,可以发现a=0其实提前执行了。一般来说,代码乱序没有问题,但是如果执行的是io地址,那就有问题了。唯一的方法就是添加一些变通的手段就可以了。至于效果嘛,大家看看反汇编的效果就可以了。

#include <stdio.h>volatile int a;
int b;#define COMPILE_BARRIER() __asm__ __volatile__ ("":::"memory")void fun1()
{a = 1;
}void fun2()
{while(!a);
}void fun3()
{b = a + 1;COMPILE_BARRIER();a = 0;
}int main(int argc, char* argv[]) {return 1;
}

随想录(代码优化中的两个问题)相关推荐

  1. HTML页面中使两个div并排显示

    在HTML中实现两个div并排显示,方法如下: 方法1:设置float浮动 对需要并排显示的div设置样式:style="float:left;" <div style=&q ...

  2. Java中的两个关键字——super、this

    Java中的两个关键字--super.this 神话丿小王子的博客主页 一.super super 是java中方的一个关键字,用它可以引用父类中的成员: super可用于访问父类中定义的属性 sup ...

  3. java中判断两个字符(或者字符串相等)

    string a,b;//两字符串 在java中判断两个字符(字符串)相等,用a.equals(b); if(a.equals(b)){ //如果相等,返回值为true }else{ //如果不相等, ...

  4. Facebook 田渊栋:NeurIPS 2020 中了两篇,感觉还算不错

    作者 | 田渊栋 编辑 | 陈大鑫 转自 | AI科技评论 做理论需要的基础知识多,困难,周期长,没有直接经济效益,还只能一两个人单打独斗且无法使用大量计算资源,每个因素都和现在的主流发展方向(强调团 ...

  5. 批量插入数据库语句java_java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码)...

    java相关:MyBatis批量插入数据到Oracle数据库中的两种方式(实例代码) 发布于 2020-7-22| 复制链接 本文通过实例代码给大家分享了MyBatis批量插入数据到Oracle数据库 ...

  6. 在一个数组中实现两个堆栈

    本题要求在一个数组中实现两个堆栈. 函数接口定义: Stack CreateStack( int MaxSize ); bool Push( Stack S, ElementType X,int Ta ...

  7. 分布式系统中只有两个难题

    分布式系统抽象 讨论编程语言时,我们使用通用术语并用函数.运算符.类.变量和指针来定义我们的程序.通用的词汇可以帮助我们避免每次都为了描述某些东西而发明新词.我们的定义越精确.越没有歧异,听众也就越容 ...

  8. 如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录

    如何判断数据库中的两个表是否相同(相等)?比较数据库中的两个表是否完全相同,包括字段和每条记录 目录

  9. R语言使用pROC包在同一图中绘制两条ROC曲线并通过假设检验检验ROC曲线的AUC或者偏AUC的差异(输出p值)

    R语言使用pROC包在同一图中绘制两条ROC曲线并通过假设检验检验ROC曲线的AUC或者偏AUC的差异(输出p值) 目录

最新文章

  1. 莫队 ---- 值域分块处理优化字典树上的查询 杭电多校2021第二场1004 i love counting
  2. pagefile.sys巨型文件在windows10下的尺寸调整
  3. html广告条效果,css3炫酷网站banner广告动画特效
  4. STM32之高级定时器互补输出
  5. cmd 出现The system cannot write to the specified device问题时如何解决
  6. apt-get出错,由于出现了太多错误,处理过程被终止
  7. java 输入输出 函数对象构造
  8. gmail api 发送邮件_Node定时自动发邮件功能
  9. iFixit 拆解 2014 款 Mac mini拆机教程, 内存确认不能更换.
  10. StarRocks 极客营 | 王天宜:把 Usability 当产品来开发,愿运维把 StarRocks 用得飘逸
  11. 小米10获取root权限_2020年小米红米Miflash新版刷机救砖恢复去除ROOT权限教程
  12. 有一种友谊可以美的让人心颤——CHANDLER和JOEY 转贴 来自friends论坛
  13. matlab dx dy dt,dx/dt=y,dy/dt=-sinx,求大神帮忙编一个MATL? 爱问知识人
  14. [实战] Android 发短信 - SMS
  15. docker使用docker compose file部署项目时,实现容器卷挂载,并对容器内文件夹赋予权限
  16. 互联网日报 | 6月20日 星期日 | 宁德时代否认强制员工购买特斯拉;小米618支付金额破190亿元;岚图FREE正式上市...
  17. HDU 4544 湫湫系列故事——消灭兔子 (贪心+优先队列)
  18. CSU 1726: 你经历过绝望吗?两次!
  19. 浅谈EditorConfig、Prettier以及Eslint的使用
  20. linux firefox xvfb,持续集成:采用Xvfb+Selenium+Firefox搭建linux服务器下的自动化测试环境...

热门文章

  1. Java经典设计模式-创建型模式-单例模式(Singleton)
  2. Style Lessons in Clarity and Grace (11th Edition)中文翻译
  3. 线程的同步与互斥,死锁
  4. dp - 2016腾讯笔试 A
  5. 0c-38-ARC快速入门
  6. php __FILE__ __DIR__魔术常量的使用【PHP进阶教程】
  7. C++生成随机数:高斯/正态分布(gaussian/normal distribution)
  8. C#网络编程概述 二
  9. Asp.Net Forums研究文章集合(收藏)
  10. pip安装其他包报错