gcc中设置特定代码块的优化级别
今天碰到一个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中设置特定代码块的优化级别相关推荐
- android指定日期闹钟,如何在android中设置特定日期的闹钟?
嗨我需要使用时间选择器来设置特定日期的闹钟.当我给出静态输入时,闹钟设置不正确并响铃. 例如:我给静态输入(与日期,月份和年份),但它不振铃.这是我的代码.如何在android中设置特定日期的闹钟? ...
- java构造块_java中的静态代码块、构造代码块、构造方法详解
运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...
- CSDN博客中删除空白代码块
在我们编写CSDN博客的时候,有时候我们创建了一些代码块然后删去时,会出现在博客中还有空白代码块出现的情况,比如我自己写的这个博客: 而我们在编辑模式修改时是看不到这个空白代码块的: 那我们应该如何删 ...
- react方法返回html_#react# 在页面中显示html代码块
在页面中显示html代码块 在网上查了下,说有一下方法可以把html代码直接在页面中输出. textarea 不让编辑 去边框 去滚动条 直接把代码用ps做成图片上传到网页 用转换符号 在jsx中前面 ...
- MarkDown中插入的代码块无法自动识别换行
MarkDown中插入的代码块无法自动识别换行 1.插入代码块的两种方式 单行的代码,就一个 ` 多行的代码块就三个```补充说明,可根据自己编写代码块的语言,设定对应的标签(比如Java-java, ...
- 有没有办法折叠Eclipse中的所有代码块?
Eclipse在左侧有"+/-"来展开和折叠代码块. 我已经有成千上万的线要经过,并且真的想要崩溃一切,并选择性地扩展块以查看它们. #1楼 如果您在Eclipse中使用PyDev ...
- iOS中得block代码块的定义及使用
现在的无论是框架还是项目中,越来越多的使用block代码块. 个人觉得:第一可以使代码看起来更简单明了,第二可以取代以前的delegate使代码的逻辑看起来更清晰. 借一张图表达基本定义: (1)最基 ...
- Gradle项目中gradle.build文件中的buildScript代码块
感谢原作者的劳动 在编写Gradle脚本的时候,在build.gradle文件中经常看到这样的代码: buildScript {repositories {mavenCentral()} }repos ...
- Gradle中的buildScript代码块
在编写Gradle脚本的时候,在build.gradle文件中经常看到这样的代码: build.gradle 1 2 3 4 5 6 7 8 9 buildScript { repositories ...
- Java中构造函数,静态代码块,构造代码块的执行顺序
静态代码块:用static声明,jvm加载类的时候执行,只执行一次. 构造代码块:由{}定义,每一次创建对象的时候执行. 构造函数:对象一建立就调用相应的构造函数. 静态代码块 1.它是随着类的加载而 ...
最新文章
- JS Array.reduce 实现 Array.map 和 Array.filter
- 关于谷歌浏览器 点击元素便签出现外边框的情况解决办法
- python的进程模块
- AREngine概述AREngine开发教程
- spoj SUBLEX (Lexicographical Substring Search) RE的欢迎来看看
- oracle linux hugepage,LInux下为什么配置HugePages及配置步骤
- Android中文乱码彻底解决
- 数据结构笔记(十四)-- 串的模式匹配算法
- Linux_free(buffer与cache区别)
- catkin_make和cmake
- ZOJ 1111 Poker Hands
- 线控转向——Carsim与simulink联合仿真模型 包含转向电机模型,转向执行机构模型,齿轮齿条模型
- 后端开发面试自我介绍_java工程师面试自我介绍范文
- java文本反垃圾_java毕业设计_springboot框架的反垃圾邮件管理分析系统
- Quora Question Pairs 思路记录
- (6) IFC构件与空间的关系 (Industry Foundation Class)
- 计算机网络存在的漏洞,常见的计算机网络安全漏洞有哪些
- 【Java程序设计】GUI的JTable的一些应用
- 河南大学计算机科学与技术排名,2021年河南省高校最新排名:信息工程大学进入榜单,河南大学第3...
- android实现棱形效果
热门文章
- (转)常用英语100句
- java开启注解扫描,详解Spring框架注解扫描开启之配置细节
- 企业研发效能月刊:告别996,走向“211”!
- spring cloud微服务分布式云架构 - Spring Cloud集成项目简介( java ssm spring boot b2b2c o2o 多租户电子...
- [ NOI 2005 ] 聪聪与可可
- [20180801]insert导致死锁.txt
- javascript的模块开发方法;
- centos 6.4 使用sendmail发送邮件(cacti)
- 愚人节的礼物 栈
- golang使用go-sql-driver实现mysql增删改操作