碰到或者找到了这两个选项,研究了一下,如下:

gcc 选项 -fomit-frame-pointer 省略框架指针

----------------------------------------
1. 测试程序
----------------------------------------
$ cat hello.c
#include <stdio.h>
void hi(void)
{
    printf("hello\n");
}

int main(int argc, char *argv[])
{
    hi();
    return 0;
}

c 调用框架:
pushl %ebp;
movl %ebp,%esp
...
pop %rbp
ret
是框架

----------------------------------------
2. gcc -o hello hello.c
----------------------------------------
有框架,有堆栈操作。
000000000040052d <hi>:
  40052d:    55                       push   %rbp
  40052e:    48 89 e5                 mov    %rsp,%rbp
  400531:    bf e4 05 40 00           mov    $0x4005e4,%edi
  400536:    e8 d5 fe ff ff           callq  400410 <puts@plt>
  40053b:    5d                       pop    %rbp
  40053c:    c3                       retq

----------------------------------------
3. gcc -fomit-frame-pointer -o hello hello.c
----------------------------------------
省略了框架
000000000040052d <hi>:
  40052d:    48 83 ec 08              sub    $0x8,%rsp
  400531:    bf e4 05 40 00           mov    $0x4005e4,%edi
  400536:    e8 d5 fe ff ff           callq  400410 <puts@plt>
  40053b:    48 83 c4 08              add    $0x8,%rsp
  40053f:    c3                       retq

----------------------------------------
4. gcc -fomit-frame-pointer -O2 -o hello hello.c
加 -O2 优化
----------------------------------------
该函数中没有看到使用堆栈
0000000000400540 <hi>:
  400540:    bf d4 05 40 00           mov    $0x4005d4,%edi
  400545:    e9 c6 fe ff ff           jmpq   400410 <puts@plt>
  40054a:    66 0f 1f 44 00 00        nopw   0x0(%rax,%rax,1)

--------------------------------------------------------------------------------
-fno-dwarf2-cfi-asm 选项
--------------------------------------------------------------------------------
 gcc -march=i386 -m32 -fno-dwarf2-cfi-asm -fno-builtin -c -o string.o string.c -Wa,-alh=string.lst
 加入 -fno-dwarf2-cfi-asm 将使.cfi 指令明显减少,如下为有和没有此选项的对比

CFA: 标准帧地址,调用其他函数时的堆栈指针地址
cfi_def_cfa_offset: 栈地址的改变用这个标识符表示。

memset:
 1035                  .LFB18:
 395:string.h      ****
 396:string.h      **** inline void * memset(void * s,char c,int count)
 397:string.h      **** {
 1036                      .loc 1 397 0
 1037                      .cfi_startproc
 1038 03ec 55               pushl    %ebp
 1039                      .cfi_def_cfa_offset 8
 1040                      .cfi_offset 5, -8
 1041 03ed 89E5             movl    %esp, %ebp
 1042                      .cfi_def_cfa_register 5
 1043 03ef 57               pushl    %edi
 1044 03f0 83EC04           subl    $4, %esp
 1045                      .cfi_offset 7, -12
 1046 03f3 8B450C           movl    12(%ebp), %eax
 1047 03f6 8845F8           movb    %al, -8(%ebp)
 398:string.h      **** __asm__("cld\n\t"
 1048                      .loc 1 398 0
 1049 03f9 8A45F8           movb    -8(%ebp), %al
 1050 03fc 8B5508           movl    8(%ebp), %edx
 1051 03ff 8B4D10           movl    16(%ebp), %ecx
 1052 0402 89D7             movl    %edx, %edi
 1053                  #APP
 1054                  # 398 "string.h" 1
 399 0405 F3               "rep\n\t"
 400 0406 AA               "stosb"
 401                      ::"a" (c),"D" (s),"c" (count)
 402:string.h      ****     );
 403:string.h      **** return s;
 1055                      cld
 1056                      rep
 1057                      stosb
 1058                  # 0 "" 2
 1059                      .loc 1 403 0
 1060                  #NO_APP
 1061 0407 8B4508           movl    8(%ebp), %eax
 404:string.h      **** }
 1062                      .loc 1 404 0
 1063 040a 83C404           addl    $4, %esp
 1064 040d 5F               popl    %edi
 1065                      .cfi_restore 7
 1066 040e 5D               popl    %ebp
 1067                      .cfi_restore 5
 1068                      .cfi_def_cfa 4, 4
 1069 040f C3               ret
 1070                      .cfi_endproc
 1071                  .LFE18:
 1072                      .size    memset, .-memset

--------------------------------------------------------------------------------

937                  memset:
 938                  .LFB18:
 395:string.h      ****
 396:string.h      **** inline void * memset(void * s,char c,int count)
 397:string.h      **** {
 939                      .loc 1 397 0
 940 03ec 55               pushl    %ebp
 941                  .LCFI115:
 942 03ed 89E5             movl    %esp, %ebp
 943                  .LCFI116:
 944 03ef 57               pushl    %edi
 945 03f0 83EC04           subl    $4, %esp
 946                  .LCFI117:
 947 03f3 8B450C           movl    12(%ebp), %eax
 948 03f6 8845F8           movb    %al, -8(%ebp)
 398:string.h      **** __asm__("cld\n\t"
 949                      .loc 1 398 0
 950 03f9 8A45F8           movb    -8(%ebp), %al
 951 03fc 8B5508           movl    8(%ebp), %edx
 952 03ff 8B4D10           movl    16(%ebp), %ecx
 953 0402 89D7             movl    %edx, %edi
 954                  #APP
 955                  # 398 "string.h" 1
 399 0405 F3               "rep\n\t"
 400 0406 AA               "stosb"
 401                      ::"a" (c),"D" (s),"c" (count)
 402:string.h      ****     );
 403:string.h      **** return s;
 956                      cld
 957                      rep
 958                      stosb
 959                  # 0 "" 2
 960                      .loc 1 403 0
 961                  #NO_APP
 962 0407 8B4508           movl    8(%ebp), %eax
 404:string.h      **** }
 963                      .loc 1 404 0
 964 040a 83C404           addl    $4, %esp
 965 040d 5F               popl    %edi
 966                  .LCFI118:
 967 040e 5D               popl    %ebp
 968                  .LCFI119:
 969 040f C3               ret
 970                  .LFE18:
 971                      .size    memset, .-memset

看完此代码,可以感到:
1. C 框架比直接用汇编效率差不少,(受框架限制)
2. 优化对C语言有什么含义? 不优化,有的代码倒來倒去没有意义。
   优化使代码在汇编级更简略,但可能对gdb调试不利,跳来跳去

gcc -fomit-frame-pointer选项,-fno-dwarf2-cfi-asm 选项相关推荐

  1. 框架指针省略(Frame Pointer Omission)(FPO)

    框架指针省略(Frame Pointer Omission)(FPO) FPO是一种优化,它压缩或者省略了在栈上为该函数创建框架指针的过程.这个选项加速了函数调用,因为不需要建立和移除框架指针(ESP ...

  2. mysql启动选项只读_MySQL的启动选项和系统变量该如何配置?

    MySQL的配置信息可以通过两种方式实现,一种是命令行形式,在启动MySQL服务时后边带上相关配置参数,此种方式会在MySQL重启后失效.另外一种是通过写入配置文件,如my.cnf,启动或者重启MyS ...

  3. 在Ajax方式产生的浮动框中,点击选项包含某个关键字的选项

    #!usr/bin/env python #-*- coding:utf-8 -*- """ @author: sleeping_cat @Contact : zwy24 ...

  4. 如何删除选择框的所有选项,然后添加一个选项并使用jQuery选择它?

    本文翻译自:How do you remove all the options of a select box and then add one option and select it with j ...

  5. android 5.1 壁纸路径,Android5.1 壁纸来源选项中有两个“壁纸”选项

    Android5.1 壁纸来源选项中有两个"壁纸"选项 [问题] 系统语言为中文,打开 设置->显示->壁纸->查看显示 可以看到设置菜单中有两个壁纸选项显示 系 ...

  6. 【电脑问题解决】回收站右键,多出来个“找回清空的文件”选项,怎么删除这个选项?

    回收站右键,多出来个"找回清空的文件"选项,怎么删除这个选项? 解决方案: 第一步:在桌面新建记事本 第二步:复制粘贴如下代码: Windows Registry Editor V ...

  7. win7计算机文件夹选项在哪里,文件夹选项在哪里(Win7、Windows 2008 R2)

    在文件夹选项中,可以对文件夹及文件进行相关设置(诸显示.隐藏文件和文件夹,文件扩展名等).从未进行过这方面设置的用户,可能不知道文件夹选项在哪里:不知道也没关系,现在就介绍三种打开文件夹选项的方法. ...

  8. [经验教程]Windows电脑桌面右键菜单的多余选项怎么删除清理右键选项?

    随着Windows电脑下载安装应用软件越来越多,一些软件会在Windows电脑右键增加一些无用多余的选项,而较多的右键选项会造成使用上不必要的麻烦.如何删除清理多余无用的选项成为每个人都需要了解的方法 ...

  9. json格式的数据集中每一条数据5个选项随机去掉一个错误选项,剩余选项重新排序

    json文件中每一条数据5个选项随机去掉一个错误选项,剩余选项重新排序 json格式的数据集中含有5个选项,随机去掉一个错误选项,剩余选项重新排序. 数据集示例: [{"context&qu ...

  10. Win10计算机组织选项在哪里,文件夹选项在哪里,教您Win10文件夹选项在哪

    Win10系统发布以来,就有很多用户都开始纷纷选择升级安装,而win10系统在界面和功能上跟以往的Windows系统有了很大的不同,很多同学找不到以前熟悉的设置选项,比如文件夹选项,下面,小编就来跟大 ...

最新文章

  1. CSS之 :before :after的用法,伪类和伪元素的区别
  2. NYOJ 30 Gone Fishing(贪心)
  3. 平面内两条线段的位置关系(相交)判定与交点求解
  4. java对hashmap迭代_Java:通过HashMap迭代,这样更有效率?
  5. servlet中实现页面跳转return “r:”和return “f:
  6. 数据库建立索引的优缺点及适合建立索引的字段
  7. python给批量图片添加文字_Python之利用PIL批量给图片添加文字
  8. 2021年程序员个人年终工作总结10篇
  9. 机器人操作臂运动学入门一--D-H参数标定
  10. 无人机生成地图_无人机配方向传感器可自行创建地图+规划路线
  11. 腾讯云短信发送php
  12. 学学Gnuplot(常用命令及参数)
  13. 驱动专题:第四章MTD及Flash驱动 3. nandflash 详细硬件特性
  14. .NET 经常被面试官问到的问题
  15. 译《Office商业应用程序入门》
  16. 多传感器数据融合学习笔记
  17. 1 error LNK2019: 无法解析的外部符号 _Direct3DCreate9@4,该符号在函数 void __cdecl InitD3D(struct HWND__ *)
  18. hadoop文件存储位置_hadoop文件存储目录
  19. 北京防灾科技学院计算机怎么样,防灾科技学院
  20. 遭遇使用映像劫持/IFEO 的 Worm.Win32.Avkiller.i/gavuusg.exe /v2

热门文章

  1. PPT转图片/PDF-实用干货
  2. 2021年中国生育保险参保人数及待遇情况分析:广东省参保人数、享受生育保险待遇人次均居全国首位[图]
  3. HTTPS那些事(二)SSL证书
  4. 代码比较工具DiffMerge的下载和使用(转)
  5. 高分三号卫星GF-3极化SAR
  6. 优盘中发现计算机病毒怎么办,u盘插电脑中了病毒怎么办
  7. API接口调用并处理返回的json数据
  8. QT QPainter
  9. addr2line 回复“问号”问题的解决和一些发现
  10. .bat文件和脚本文件