今天碰到一个gcc优化相关的问题,为了让一个页变成脏页(页表中dirty位被置上),需要执行下面这段代码:

1 uint32_t *page;
2 // ...
3 page[0] = page[0];

最后一行代码很有可能被gcc优化掉,因为这段代码看起来没有任何实际的作用。那么如何防止gcc对这段代码做优化呢?

设置gcc编译时优化级别为-O0肯定是不合适的,这样对程序性能影响会比较大。stackoverflow上的Dietrich Epp给出了一个强制类型转换的方案:

1 ((unsigned char volatile *)page)[0] = page[0];

通过volatile关键字禁止gcc的优化,和我之前采用的方法类似。

Plow同学给出了另一个利用gcc 4.4特性的方法:

1 #pragma GCC push_options
2 #pragma GCC optimize ("O0")
3  
4 your code
5  
6 #pragma GCC pop_options

这里用到了gcc 4.4的特性Function Specific Option Pragmas,在特定代码前保存当前的编译选项,然后对特定的代码使用O0优化级别,最后再恢复之前保存的编译选项。

俺觉得这个特性有些场合下挺好用的,在这里分享下,虽然因为编译器版本问题最后我还是用了前面一种方法。

给指定函数选择优化等级可以使用   __attribute__((optimize("O0")));   //指定优化等级

例如: void test(int a)  __attribute__((optimize("O0")));

转载链接:链接

gcc中设置特定代码块的优化级别相关推荐

  1. android指定日期闹钟,如何在android中设置特定日期的闹钟?

    嗨我需要使用时间选择器来设置特定日期的闹钟.当我给出静态输入时,闹钟设置不正确并响铃. 例如:我给静态输入(与日期,月份和年份),但它不振铃.这是我的代码.如何在android中设置特定日期的闹钟? ...

  2. java构造块_java中的静态代码块、构造代码块、构造方法详解

    运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...

  3. CSDN博客中删除空白代码块

    在我们编写CSDN博客的时候,有时候我们创建了一些代码块然后删去时,会出现在博客中还有空白代码块出现的情况,比如我自己写的这个博客: 而我们在编辑模式修改时是看不到这个空白代码块的: 那我们应该如何删 ...

  4. react方法返回html_#react# 在页面中显示html代码块

    在页面中显示html代码块 在网上查了下,说有一下方法可以把html代码直接在页面中输出. textarea 不让编辑 去边框 去滚动条 直接把代码用ps做成图片上传到网页 用转换符号 在jsx中前面 ...

  5. MarkDown中插入的代码块无法自动识别换行

    MarkDown中插入的代码块无法自动识别换行 1.插入代码块的两种方式 单行的代码,就一个 ` 多行的代码块就三个```补充说明,可根据自己编写代码块的语言,设定对应的标签(比如Java-java, ...

  6. 有没有办法折叠Eclipse中的所有代码块?

    Eclipse在左侧有"+/-"来展开和折叠代码块. 我已经有成千上万的线要经过,并且真的想要崩溃一切,并选择性地扩展块以查看它们. #1楼 如果您在Eclipse中使用PyDev ...

  7. iOS中得block代码块的定义及使用

    现在的无论是框架还是项目中,越来越多的使用block代码块. 个人觉得:第一可以使代码看起来更简单明了,第二可以取代以前的delegate使代码的逻辑看起来更清晰. 借一张图表达基本定义: (1)最基 ...

  8. Gradle项目中gradle.build文件中的buildScript代码块

    感谢原作者的劳动 在编写Gradle脚本的时候,在build.gradle文件中经常看到这样的代码: buildScript {repositories {mavenCentral()} }repos ...

  9. Gradle中的buildScript代码块

    在编写Gradle脚本的时候,在build.gradle文件中经常看到这样的代码: build.gradle 1 2 3 4 5 6 7 8 9 buildScript { repositories ...

  10. Java中构造函数,静态代码块,构造代码块的执行顺序

    静态代码块:用static声明,jvm加载类的时候执行,只执行一次. 构造代码块:由{}定义,每一次创建对象的时候执行. 构造函数:对象一建立就调用相应的构造函数. 静态代码块 1.它是随着类的加载而 ...

最新文章

  1. JS Array.reduce 实现 Array.map 和 Array.filter
  2. 关于谷歌浏览器 点击元素便签出现外边框的情况解决办法
  3. python的进程模块
  4. AREngine概述AREngine开发教程
  5. spoj SUBLEX (Lexicographical Substring Search) RE的欢迎来看看
  6. oracle linux hugepage,LInux下为什么配置HugePages及配置步骤
  7. Android中文乱码彻底解决
  8. 数据结构笔记(十四)-- 串的模式匹配算法
  9. Linux_free(buffer与cache区别)
  10. catkin_make和cmake
  11. ZOJ 1111 Poker Hands
  12. 线控转向——Carsim与simulink联合仿真模型 包含转向电机模型,转向执行机构模型,齿轮齿条模型
  13. 后端开发面试自我介绍_java工程师面试自我介绍范文
  14. java文本反垃圾_java毕业设计_springboot框架的反垃圾邮件管理分析系统
  15. Quora Question Pairs 思路记录
  16. (6) IFC构件与空间的关系 (Industry Foundation Class)
  17. 计算机网络存在的漏洞,常见的计算机网络安全漏洞有哪些
  18. 【Java程序设计】GUI的JTable的一些应用
  19. 河南大学计算机科学与技术排名,2021年河南省高校最新排名:信息工程大学进入榜单,河南大学第3...
  20. android实现棱形效果

热门文章

  1. (转)常用英语100句
  2. java开启注解扫描,详解Spring框架注解扫描开启之配置细节
  3. 企业研发效能月刊:告别996,走向“211”!
  4. spring cloud微服务分布式云架构 - Spring Cloud集成项目简介( java ssm spring boot b2b2c o2o 多租户电子...
  5. [ NOI 2005 ] 聪聪与可可
  6. [20180801]insert导致死锁.txt
  7. javascript的模块开发方法;
  8. centos 6.4 使用sendmail发送邮件(cacti)
  9. 愚人节的礼物 栈
  10. golang使用go-sql-driver实现mysql增删改操作