GCC学习笔记

2023-11-06

学习GCC编译器的推荐图书是:An Introduction to GCC(有中文版和英文版 可下载)和Using GCC (gcc的官方手册)
  • gcc默认是用GNU C的标准编译程序的,如果要指定用ANSI标准时:gcc -ansi 指定用c99或者其他版本的标准:gcc -std=c99
  • C的标准:ANSI C标准或者叫做ISO C或ANSI/ISO C 有--C89(1989年),C90(1990年),C99(1999年) 最近好像颁布了C11(2011年)
  • gcc 的预编译器cpp中预先定义了很多宏可用命令:cpp -dM /dev/null查看,有时代码预编译时可以用事先定义好的宏开关来控制是否编译(条件编译):
#if TEST
    printf("TEST is defined!");
#endif
--编译时如果是:gcc -DTEST (默认值为1)则以上代码被编译,否则将不会编译上面的代码。也可以赋值:gcc -DTEST=value
  • gcc -c -Wall -save-temps hello.c会产生hello.c外还会把编译过程的临时文件保存下来(如hello.i,hello.s)
  • gcc -g -Wall hello.c会加入调试信息在可执行文件中(a.out),便于调试--gdb a.out。如果程序出错OS会产生一个core dump文件“core.pid”(如core.2027),但是为了避免程序错误而产生大量core dump文件占满硬盘空间OS(如Linux)默认不让产生,可用"ulimit -c"命令查看(结果是0)但可以用"ulimit -c unlimited"解除(具体可man ulimit)。用gdb分析调试:gdb a.out core.2027 来分析。(学习gdb的用法!)
  • 编译优化:加快执行速度,减小代码尺寸。源码优化(source-level Optimization)+机器码的优化  
    " time ./a.out" --计算a.out运行时间
源码优化:  1.子表达式消除(common subexpression elimination--CES)
                     例:m=cos(a) + sin(b/2) + (1 + cos(a) +sin(b/2))//多次调用相同表达式
                        ==>t=cos(a); n=sin(b/2); m=t+n+(1+t-n);
                     2.函数内连(function inlining--FL)多次调用一些小函数增加了程序的调用时间(用 inline关键字)
                     例:double sq(double x)
     {
 return(x*x);                        
                        }
        sum=0;
           for(i=0;i<10000;i++)
                     {
                         sum +=sq(i+0.5);
                     }//函数的不断调用增加开销,而函数执行的时间却很少
          ==>    inline  double sq(double x)
                             {
                                  return(x*x);
                             }
                             sum=0;
                         for(i=0;i<10000;i++)
                         {
            sum +=sq(i+0.5);
                         }
                    空间换时间--增加代码的尺寸来加快程序的执行速度
  • Debug:建议在debug时关闭优化选项 gcc -Wall -g -O0 test.c 打开优化时可能还会发现一些未打开优化时的warning
         例:void sign(int x)
             {
                 int n;
       if(x>0) n=1;
                else if(x<0) n=-1;
             }//未考虑到x=0的情况,不优化时不会发现错误,但打开优化时会发现错误
  • 编译器的工作原理(How the compiler works)
1.预处理preprocessing(to expand macros)-- CPP
2.编译Compilation(from source code to assembly--汇编 language)-- GCC
3.汇编Assembly(from assembly language to machine code)-- AS
4.链接(to creat the final executable)-- LD
  • 辅助命令:file--可查看.o文件或者可执行文件的属性
ELF~Executable and Linking Format可执行文件
LSB~小端存储 X86(AMD Intel)
MSB~大端存储 motorola 68K
not stripped~未去除符号表(调试信息)可用strip命令去除" strip a.out",用nm查看符号表" nm a.out" ,查看a.out需要的运行时库:" ldd a.out"
  • 编译器相关工具(compiler-related tools)
  1. gprof  可以分析程序的性能便于对相关函数进行优化:gcc -Wall -pg cov.c  ./a.out(此时会产生gmon.out文件);gprof a.out(读取gmon.out+a.out来分析性能)
  2. gcov 覆盖度分析:"gcc -Wall -fprofile-arcs -ftest-coverage cov.c"(会产生cov.gcno);“./a.out”(会此时cov.gcda) ; "gcov cov.c"(gcov的是源程序!此时产生cov.c.gcov文件)cov.c.gcov中行前有"#####"表示语句从未执行过




FROM:  http://blog.chinaunix.net/uid-25365622-id-3062068.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GCC学习笔记 的相关文章

  • 深度学习源码小项目汇总-代码全

    demo仓库和视频演示 到此一游7758258的个人空间 哔哩哔哩 bilibili 卷积网路CNN分类的模型一般使用包括alexnet DenseNet DLA GoogleNet Mobilenet ResNet ResNeXt Shu
  • 财报解读:毛利持续改善,金山云正在“弯道超车”?

    一季度 云巨头们的表现持续稳健 依旧稳坐前排 而作为中小云代表的金山云也在5月23日发布了2023年一季度财报 盈利能力持续改善成为通篇最亮眼的一笔 随着AI大模型打开了新的 潘多拉魔盒 云市场也在发生着巨变 但AI能否成为云厂商打开盈利大
  • JavaScript实现经典消方块游戏

    操作方式 在游戏区域中任意位置滑动手势 点击屏幕下方的按钮 键盘WASD和 都可以操作 游戏动作 操作 方块向左移动 左划 按下蓝色键 左一 A 方块向右移动 右划 按下橙色键 右一 D 强制方块下落 下划 按下粉色键 左二 S 改变方块方
  • Learncpp___CH1

    You have to write a program once to know how you should have written it the first time Short answer You don t C is one p
  • HTML详解连载(3)

    HTML详解连载 3 专栏链接 link http t csdn cn xF0H3 下面进行专栏介绍 开始喽 表单 作用 使用场景 input标签基本使用 示例 type属性值以及说明 input标签占位文本 示例 注意 单选框 radio
  • 报错django.db.utils.DataError: (1406, "Data too long for column 'gender' at row 1")的解决办法

    参考解决方案 Traceback most recent call last File C Users rHotD AppData Local Programs Python Python35 lib site packages djang
  • 【华为机试真题 JAVA】非严格递增连续数字序列-100

    编程题目 100分 非严格递增连续数字序列 2022 Q1 Q2 考试题 时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 本题可使用本地IDE编码 不
  • react+antd mobile实现 H5底部tab页面

    1 引入底部tab页所需组件 第二步 创建tabs负责放入底部的页面路由 第三步在return里面对tab进行配置以及引用所需的页面组件内 其中 activekey 是切换tab的key值当他切换等于对应的路由是就展示对应的页面

随机推荐

  • 【Java】将文本转化成语音

    1 需要的jar包 2 把dll文件放在 JAVA HOME bin下 注意系统是32位还是64位 也可以放在C Windows System32下 如果是64位应该放在C Windows SysWOW64 下 3 java代码 impor
  • CA2W格式化多个时需要加强制转换,CDuiString格式化也需强转

    CString str str Format L s CM2W ss data str Format L s s LPCTSTR CM2W ss data LPCTSTR CM2W asdfg str Format L s LPCTSTR
  • 基于Zynq FPGA对雷龙SD NAND的测试

    文章目录 一 SD NAND特征 1 1 SD卡简介 1 2 SD卡Block图 二 SD卡样片 三 Zynq测试平台搭建 3 1 测试流程 3 2 SOC搭建 四 软件搭建 五 测试结果 六 总结 一 SD NAND特征 1 1 SD卡简
  • webpack5学习进阶:多页面应用、Tree Shaking、PWA、Shimming

    文章目录 一 多页面应用 1 entry 配置 1 1 将两个本地文件打包在一起 1 2 还可以打包第三方库文件 1 3 多页面打包 2 index html 模板配置 3 多页面环境搭建 二 Tree Shaking 摇树优化 1 配置
  • rocketMQ系列(一): 消息中间件及rocketMQ简介

    一 消息中间件介绍 消息中间件是基于队列与消息传递技术 在网络环境中为应用系统提供同步或异步 可靠的消息传输的支撑性软件系统 消息中间件利用高效可靠的消息传递机制进行平台无关的数据交流 并基于数据通信来进行分布式系统的集成 通过提供消息传递
  • 什么是弱网测试?为什么要进行弱网测试?怎么进行弱网测试?

    什么是弱网测试 由于处在移动互联网盛行的时代 网络形态除了有线连接外 还有2G 3G 4G Wifi 5G等多种手机网络连接方式 首先额外补充一些5G的知识 2分钟了解什么是5G 在前不久结束的 MWC 2018 上 5G 成了全球的一个热
  • caffe-python lmdb 读写(转)

    lmdb write import lmdb import numpy as np import cv2 import caffe from caffe proto import caffe pb2 basic setting 这个设置用来
  • ORA-01186/ORA-01122/ORA-01110/ORA-01206

    author skate time 2011 12 14 在前几天检查一套DG库的时候 当read only打开stanby库的时候 在alert log里发现错误log如下 Wed Dec 14 15 45 19 2011 Complet
  • vb excel编程实例_有VB的基础,如何学习VBA

    VBA的全称Visual Basic for Applications 在Office等许多软件中 看到的宏 便是VBA 基于我的理解 VB基础指什么 这里的VB基础指能够看得懂简单的VB代码 对if结构 for结构有一定的认识 理解变量有
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • Spring Data 查询方法的规则定义(五)

    有句话这样说 欲练神功 挥刀自宫 请亲们先回到第一个 从Spring data 介绍 开始看 搭好环境 跟着步伐一块走 Spring Data 的方法必须严格按照它的规范进行编写 如果写错了就不行 下面是网上找的一张图 仔细看 咱们先拿几个
  • Mutimap用法

    Multimap 1 创建 Multimap
  • 牛客网&&华为机试&&坐标移动

    牛客网 华为机试 坐标移动 代码实现 include
  • 分库分表实战之从根上带你吃透MySQL的索引

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 问题分析 为什么查询变慢呢 接上期 我们知道了MySQL查询的全过程 也知道了整个过程的瓶颈在于磁盘IO 那怎么降低磁盘IO次数呢 答案就是索引 正确的使用索引 我们
  • css3网格布局

    网格布局是flex的升级版 父级属性display grid 即可把这个div变成网格 父级属性grid template columns 20 20 20 20 设置有多少列 每列有多宽 auto自动填 1fr 2fr 设置比例倍数 父级
  • 如何使用命令行编译以及运行java文件

    要想编译和运行java文件 很简单 只需要两个命令 1 javac 作用 编译java文件 使用方法 javac Hello java 如果不出错的话 在与Hello java 同一目录下会生成一个Hello class文件 这个class
  • 26-LeetCode刷题之删除有序数组中的重复项

    个人主页 你帅你先说 欢迎点赞 关注 收藏 既选择了远方 便只顾风雨兼程 欢迎大家有问题随时私信我 版权 本文由 你帅你先说 原创 CSDN首发 侵权必究 为您导航 题目 解题思路 代码实现 题目 26 删除有序数组中的重复项 解题思路 思
  • android的RecyclerView使用

    Android中的RecyclerView是一个可复用的列表控件 它比ListView更加灵活和强大 RecyclerView可以用来展示大量的数据 并且支持多种布局方式 包括线性布局 网格布局 瀑布流布局等 下面是使用RecyclerVi
  • Unity 3D协程

    Unity3D 是单线程的 StartCoroutine 开启协程 Coroutine StartCoroutine IEnumerator routine Coroutine StartCoroutine string methodNam
  • GCC学习笔记

    学习GCC编译器的推荐图书是 An Introduction to GCC 有中文版和英文版 可下载 和Using GCC gcc的官方手册 gcc默认是用GNU C的标准编译程序的 如果要指定用ANSI标准时 gcc ansi 指定用c9