首页 > 编程语言 >通过反汇编理解GCC优化以及inline函数的功能

通过反汇编理解GCC优化以及inline函数的功能

时间:2023-12-20 11:47:11浏览次数:42  
标签:f1 GCC f2 反汇编 func test inline 优化

在linux环境写下以下C代码:

首先不加优化选项去编译:gcc -g inline_func_test.c -o inline_func_test

之后用objdump -S反汇编

可见:

可见,即使f1是inline函数,还是和f2一样被调用了六次。

之后加入优化选项去编译
gcc -O1 -g inline_func_test.c -o inline_func_test

这一次,f2依然被调用六次

inline函数f1却被优化了

t=f1()+f1()+f1()+f1()+f1()+f1();这句被编译为addl $0x6,0x200b27(%rip)

这个0x200b27(%rip)就是全局变量counter,直接被加6,也没有给局部变量赋值,因为后面t又被赋0

因为涉及全局变量,f2的调用没法被优化成f2()*6

但inline函数,可以直接嵌入调用代码里,就可以被化

 

标签:f1,GCC,f2,反汇编,func,test,inline,优化
From: https://www.cnblogs.com/rixiang/p/17916183.html

相关文章

  • clang VS gcc 的command-line机制: clang 在 MacOS 上要设置 -isysroot $(xcrun --sho
    clangVSgcc的command-line机制:clang在MacOS上作为编译器时要设置-isysroot$(xcrun--show-sdk-path)注意明确指定clang/clang++在MacOS上作为编译器时,一定要设置CFLAGS/CPPFLAGS为"-isysroot$(xcrun--show-sdk-path)${CFLAGS}"CC="/usr/local/bin/clang"C......
  • 如何判断lib和dll是32位还是64位?答案是使用微软的dumpbin工具,后面讲了如何使用gcc生成
    为什么我会考虑这个问题呢?因为我在使用java去调用一个c的lib库的时候,弹出以下警告:D:\work\ideaworkpaces\jdk21Test001\src\main\java\lib\hello.lib:%1不是有效的Win32应用程序。atjava.base/jdk.internal.loader.NativeLibraries.load(NativeMethod)然后我就在想是不是......
  • GCC和gcc
    它是GNUCompilerCollection(就是GNU编译器套件),也可以简单认为是编译器。它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。 gcc其实有两层含义:广义上是指gnu工具集,狭义上指这个gnu工具集里的c++编译器。一般前者用大写,后者用小写做区分。不过只是约定......
  • GCC源码编译安装升级
    gcc官网:​​https://gcc.gnu.org/​​1.安装系统默认gcc(有则忽略)yuminstall-ygccgcc-c++make2.下载高版本gcc源码包下载地址:​​https://ftp.gnu.org/gnu/gcc/​wgethttps://ftp.gnu.org/gnu/gcc/gcc-7.5.0/gcc-7.5.0.tar.gz3.源码编译安装#解压tar-xvfgcc......
  • Termux安装GCC编译器
    cctoolspkgupdatepkginstall-ycoreutilsgnupgcurl-sLo$PREFIX/etc/apt/trusted.gpg.d/cctools.asc--create-dirshttps://cctools.info/public.keyecho"deb[trusted=yes]https://cctools.infotermuxcctools"|tee$PREFIX/etc/apt/sources.list......
  • 交叉编译工具 arm-none-linux-gnueabihf-gcc安装及思考
    1安装步骤A创建目录:/usr/local/armB将交叉编译器(压缩包)复制到该目录,在该目录下进行解压得到“gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf”的文件C打开/etc/profile文件添加环境变量       sudovi/etc/profile  exportPATH=......
  • 5.10 Windows驱动开发:摘除InlineHook内核钩子
    在笔者上一篇文章《内核层InlineHook挂钩函数》中介绍了通过替换函数头部代码的方式实现Hook挂钩,对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能,此类功能的实现一般可在应用层进行,而驱动层只需要保留一个读写字节的函数即可,将复杂的流程放在应用层实现是一个非常明......
  • C++ 内联函数 inline
    宏定义实现和普通函数实现:-宏定义是直接在实现的时候进行代码替换,可能产生结果异常问题。-普通函数实现:调用函数进出函数体的时候时间开销可能过大。1#include<iostream>2usingnamespacestd;3//宏实现4#defineGETMAX(a,b)((a)>(b)?(a):(b))......
  • gcc 在嵌入式软件中一些常见的用法(待补充)
    大多数情况,嵌入式软件工程师并不需要知道gcc编译器是工作的,但是随着调试深入,了解gcc在软件中的一些常见的用法大有裨益。这里列一下遇到的一些嵌入式软件中用到的一些gcc知识。1GCC关闭某函数的优化软件库使用O2/O3优化,有时debug时,需要关闭其中某些函数的优化(即使用此函数使用......
  • Docker|--镜像中既有gcc和.NET运行时, 但是容器启动的时候报错 exec: "dotnet": exec
    基本信息#镜像gcc_for_net7_image是如何产生的,分为3步1.基于gcc的镜像运行起来的一个包含了gcc环境的容器,2.在这个容器里安装了.NET7运行时,3.再将这个包含了gcc环境和.NET7的容器打包为一个镜像"gcc_for_net7_image"总之,这个镜像"gcc_for_net7_image"既包含了gcc......