如何避免GCC优化选项对程序带来的干扰?

引言

先从一小段代码说起:

#include <stdio.h>int main()
{int sum = 0;for (int i = 0; i < 100; i++) {sum += i;}printf("sum = %d\n", sum);return 0;
}

将代码以-O2选项编译后,查看目标程序中的汇率指令:

gcc test.c -O2
objdump -d a.out

在这里插入图片描述

发现main函数汇编代码的第二行,是将立即数0x1356(十进制:4950)移入esi寄存器中。也就是说,程序没有按原有的逻辑去执行循环累加,而直接返回了计算结果。相对没有加-O2的汇编代码,精简了许多操作,而这些细微的差异如果不注意,会违背开发者的初衷,甚至影响程序预期结果。

那么-O2到底包含了哪些编译选项?

# gcc选项解释
# -Q:使编译器在编译每个函数时输出函数名, 并在每个编译阶段结束时输出一些统计信息。
#     当出现在--help选项之前时, --help的输出内容会有所改变:
#     不再显示编译选项的通用描述, 而是显示该选项在当前的编译命令中是否开启。
#     对于有具体设置的值的选项, 会显示该选项被设置的具体值。
# --help=optimizers:显示所有的优化编译选项[root@localhost ~]# gcc -Q -O2 --help=optimizers | grep "启用" | wc -l
129
[root@localhost ~]# gcc -Q -O2 --help=optimizers | grep "启用"-faggressive-loop-optimizations       [启用]-falign-labels                        [启用]-fasynchronous-unwind-tables          [启用]-fauto-inc-dec                        [启用]-fbranch-count-reg                    [启用]-fcaller-saves                        [启用]-fcode-hoisting                       [启用]-fcombine-stack-adjustments           [启用]-fcompare-elim                        [启用]-fcprop-registers                     [启用]-fcrossjumping                        [启用]-fcse-follow-jumps                    [启用]-fdce                                 [启用]-fdefer-pop                           [启用]-fdelete-null-pointer-checks          [启用]-fdevirtualize                        [启用]-fdevirtualize-speculatively          [启用]-fdse                                 [启用]-fearly-inlining                      [启用]-fexpensive-optimizations             [启用]-fforward-propagate                   [启用]-ffp-int-builtin-inexact              [启用]-ffunction-cse                        [启用]-fgcse                                [启用]-fgcse-lm                             [启用]-fguess-branch-probability            [启用]-fhoist-adjacent-loads                [启用]-fif-conversion                       [启用]-fif-conversion2                      [启用]-findirect-inlining                   [启用]-finline                              [启用]-finline-atomics                      [启用]-finline-functions-called-once        [启用]-finline-small-functions              [启用]-fipa-bit-cp                          [启用]-fipa-cp                              [启用]-fipa-icf                             [启用]-fipa-icf-functions                   [启用]-fipa-icf-variables                   [启用]-fipa-profile                         [启用]-fipa-pure-const                      [启用]-fipa-ra                              [启用]-fipa-reference                       [启用]-fipa-sra                             [启用]-fipa-vrp                             [启用]-fira-hoist-pressure                  [启用]-fira-share-save-slots                [启用]-fira-share-spill-slots               [启用]-fisolate-erroneous-paths-dereference         [启用]-fivopts                              [启用]-fjump-tables                         [启用]-flifetime-dse                        [启用]-flra-remat                           [启用]-fmath-errno                          [启用]-fmove-loop-invariants                [启用]-fomit-frame-pointer                  [启用]-foptimize-sibling-calls              [启用]-foptimize-strlen                     [启用]-fpartial-inlining                    [启用]-fpeephole                            [启用]-fpeephole2                           [启用]-fplt                                 [启用]-fprefetch-loop-arrays                [启用]-fprintf-return-value                 [启用]-freg-struct-return                   [启用]-frename-registers                    [启用]-freorder-blocks                      [启用]-freorder-blocks-and-partition        [启用]-freorder-functions                   [启用]-frerun-cse-after-loop                [启用]-frtti                                [启用]-fsched-critical-path-heuristic       [启用]-fsched-dep-count-heuristic           [启用]-fsched-group-heuristic               [启用]-fsched-interblock                    [启用]-fsched-last-insn-heuristic           [启用]-fsched-rank-heuristic                [启用]-fsched-spec                          [启用]-fsched-spec-insn-heuristic           [启用]-fsched-stalled-insns-dep             [启用]-fschedule-fusion                     [启用]-fschedule-insns2                     [启用]-fshort-enums                         [启用]-fshrink-wrap                         [启用]-fshrink-wrap-separate                [启用]-fsigned-zeros                        [启用]-fsplit-ivs-in-unroller               [启用]-fsplit-wide-types                    [启用]-fssa-backprop                        [启用]-fssa-phiopt                          [启用]-fstdarg-opt                          [启用]-fstore-merging                       [启用]-fstrict-aliasing                     [启用]-fstrict-volatile-bitfields           [启用]-fthread-jumps                        [启用]-fno-threadsafe-statics               [启用]-ftrapping-math                       [启用]-ftree-bit-ccp                        [启用]-ftree-builtin-call-dce               [启用]-ftree-ccp                            [启用]-ftree-ch                             [启用]-ftree-coalesce-vars                  [启用]-ftree-copy-prop                      [启用]-ftree-cselim                         [启用]-ftree-dce                            [启用]-ftree-dominator-opts                 [启用]-ftree-dse                            [启用]-ftree-forwprop                       [启用]-ftree-fre                            [启用]-ftree-loop-if-convert                [启用]-ftree-loop-im                        [启用]-ftree-loop-ivcanon                   [启用]-ftree-loop-optimize                  [启用]-ftree-phiprop                        [启用]-ftree-pre                            [启用]-ftree-pta                            [启用]-ftree-reassoc                        [启用]-ftree-scev-cprop                     [启用]-ftree-sink                           [启用]-ftree-slsr                           [启用]-ftree-sra                            [启用]-ftree-switch-conversion              [启用]-ftree-tail-merge                     [启用]-ftree-ter                            [启用]-ftree-vrp                            [启用]-funwind-tables                       [启用]-fvar-tracking                        [启用]-fvar-tracking-assignments            [启用]-fweb                                 [启用]

上述命令也可以查看-O3-O1开启的编译选项,默认-O == -O1。 如:

gcc -Q -O1 --help=optimizers | grep "启用"
gcc -Q -O3 --help=optimizers | grep "启用"

关于具体每个编译选项的解释,牵扯到太多的背景知识。可以通过man文档查找说明。也可以查阅GNU在线文档:Option Summary (Using the GNU Compiler Collection (GCC))

如何禁用某个函数的编译优化?

有通过在函数体中添加空的汇编指令的方法(不推荐):

void func()
{// ...asm volatile("");// ...
}

还有通过添加预处理指令的方式:

#pragma GCC optimize ("O0")
void func()
{// ...
}

但我还是更倾向在函数声明时就表示不使用编译优化:

void func() __attribute__((optimize("O0")));void func()
{// ...
}

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

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

相关文章

PHP: 开发入门macOS系统下的安装和配置

安装Homebrew 安装 ~~友情提示&#xff1a;这个命令对网络有要求&#xff0c;可能需要翻墙或者用你的手机热点试试&#xff0c;或者把DNS换成&#xff08;114.114.114.114 和 8.8.8.8&#xff09; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebr…

centos7 部署Tomcat和jpress应用

目录 一、静态、动态、伪静态 二、Web 1.0 和 Web 2.0 三、centos7 部署Tomcat 3.1 安装、配置jdk 3.2 安装 Tomcat 3.3 配置服务启动脚本 3.3.1 创建用户和组 3.3.2 创建tomcat.conf文件 3.3.3 创建服务脚本(tomcat.service) 3.3.4 重新加载守护进程并且测试 四、部…

手机设置全局代理ip步骤

在互联网时代&#xff0c;隐私和安全问题备受关注。使用全局代理能够帮助我们保护个人信息&#xff0c;突破地理限制&#xff0c;并提高网络速度。但是&#xff0c;你是否对全局代理的安全性存有疑虑&#xff1f;而且&#xff0c;如何在手机上设置全局代理呢&#xff1f;今天就…

用LangChain开源框架实现知识机器人

前言 Large Language Models (LLMs)在2020年OpenAI 的 GPT-3 的发布而进入世界舞台 。从那时起&#xff0c;他们稳步增长进入公众视野。 众所周知 OpenAI 的 API 无法联网&#xff0c;所以大家如果想通过它的API实现联网搜索并给出回答、总结 PDF 文档、基于某个 Youtube 视频…

优维低代码实践:Context / State

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

阿里云 MSE + ZadigX ,无门槛实现云原生全链路灰度发布

作者&#xff1a;ZadigX 企业发布现状痛点 目前企业在选择和实施发布策略时面临以下困境&#xff1a; 1. 缺乏云原生能力&#xff1a; 由于从传统部署转变为云原生模式后&#xff0c;技术架构改造需要具备相关能力的人才。这使得企业在发布策略方面难以入手。 2. 缺乏自动化…

U盘删除的文件怎么找回?4个简单方法分享!

“在u盘里不小心删除的文件到底还能不能找回来呀&#xff1f;真的好着急啊&#xff01;这个u盘对我来说真的很重要&#xff0c;怎么恢复里面的数据呢&#xff1f;请各位大佬帮帮我吧&#xff01;” 作为一个便捷的存储工具&#xff0c;u盘逐渐获得大众的青睐。在互联网时代&…

微服务性能分析工具 Pyroscope 初体验

Go 自带接口性能分析工具 pprof&#xff0c;较为常用的有以下 4 种分析&#xff1a; CPU Profiling: CPU 分析&#xff0c;按照一定的频率采集所监听的应用程序 CPU&#xff08;含寄存器&#xff09;的使用情况&#xff0c;可确定应用程序在主动消耗 CPU 周期时花费时间的位置…

计算机毕设 深度学习手势识别 - yolo python opencv cnn 机器视觉

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

Doccano工具安装教程/文本标注工具/文本标注自己的项目/NLP分词器工具/自然语言处理必备工具/如何使用文本标注工具

这篇文章是专门的安装教程&#xff0c;后续的项目创建&#xff0c;如何使用&#xff0c;以及代码部分可以参考这篇文章&#xff1a; NER实战&#xff1a;(NLP实战/命名实体识别/文本标注/Doccano工具使用/关键信息抽取/Token分类/源码解读/代码逐行解读)_会害羞的杨卓越的博客-…

【LeetCode每日一题】——1572.矩阵对角线元素的和

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 简单 三【题目编号】 1572.矩阵对角线元素的和 四【题目描述】 给你一…

交换机VLAN技术和实验(eNSP)

目录 一&#xff0c;交换机的演变 1.1&#xff0c;最小网络单元 1.2&#xff0c;中继器&#xff08;物理层&#xff09; 1.3&#xff0c;集线器&#xff08;物理层&#xff09; 1.4&#xff0c;网桥&#xff08;数据链路层&#xff09; 二&#xff0c;交换机的工作行为 2.…

【计算机视觉中的 GAN 】如何稳定GAN训练(3)

一、说明 在上一篇文章中&#xff0c;我们达到了理解未配对图像到图像翻译的地步。尽管如此&#xff0c;在实现自己的超酷深度GAN模型之前&#xff0c;您必须了解一些非常重要的概念。如本文所提的GAN模型新成员的引入&#xff1a;Wasserstein distance&#xff0c;boundary eq…

AI 绘画Stable Diffusion 研究(一)sd整合包v4.2 版本安装说明

部署包作者:秋葉aaaki 免责声明: 本安装包及启动器免费提供 无任何盈利目的 大家好&#xff0c;我是风雨无阻。众所周知&#xff0c;StableDiffusion 是非常强大的AI绘图工具&#xff0c;需要详细了解StableDiffusion的朋友&#xff0c;可查看我之前的这篇文章&#xff1a; 最…

【机器学习】Feature scaling and Learning Rate (Multi-variable)

Feature scaling and Learning Rate 1、数据集2、学习率2.1 α \alpha α 9.9e-72.2 α \alpha α 9e-72.3 α \alpha α 1e-7 3、特征缩放3.1 特征缩放的原因3.2 Z-score 归一化3.3 预测3.4 损失等值线 导入所需的库 import numpy as np np.set_printoptions(precision…

sqlserver 使用SQLOLEDB 远程数据库同步数据

exec sp_addlinkedserver remote_server, , SQLOLEDB, ip exec sp_addlinkedsrvlogin remote_server, false,null, 账号, 密码 --查询方式 select * from remote_server.数据库名.dbo.表名 --不再使用时删除链接服务器 exec sp_dropserver remote_server, droplogins…

Oracle免费在线编程:Oracle APEX

前提&#xff1a; 注意&#xff1a;你要有个梯子才能更稳定的访问。 不需要安装Oracle&#xff0c;但是需要注册。&#xff08;还算方便的&#xff09; 注册&登录过程 进入Oracle APEX官网&#xff0c;我们选择免费的APEX工作区即可&#xff0c;点击“免费注册”。在注册…

DASCTF 2023 0X401七月暑期挑战赛web复现

目录 <1> Web (1) EzFlask(python原型链污染&flask-pin) (2) MyPicDisk(xpath注入&文件名注入) (3) ez_cms(pearcmd文件包含) (4) ez_py(django框架 session处pickle反序列化) <1> Web (1) EzFlask(python原型链污染&flask-pin) 进入题目 得到源…

软件设计师(五)软件工程基础知识

一、软件工程概述 软件开发和维护过程中所遇到的各种问题称为“软件危机”。 软件工程是指应用计算机科学、数学及管理科学等原理&#xff0c;以工程化的原则和方法来解决软件问题的工程&#xff0c;其目的是提高软件生产率、提高软件质量、降低软件成本。 #mermaid-svg-h3j6K…

基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程

基于JenkinsPythonUbuntuDocker的接口/UI自动化测试环境部署详细过程 1 Jenkins是什么&#xff1f;2 Jenkins目标是什么&#xff1f;3 什么是CI/CD?3.1 CI持续集成3.2 CD持续部署3.3 CD持续交付 4 Ubuntu环境4.1 环境需求4.2 实现思路 5 Ubuntu下安装Docker6 安装Jenkins6.1 拉…