导航:首页 > 源码编译 > 编译o2到底好不好

编译o2到底好不好

发布时间:2023-02-28 00:33:04

Ⅰ 在G++中,优化级别-O3是否危险

在gcc的早期(2.8等)和egcs时代,redhat 2.96 -O3有时是相当多的错误。但这是十年前的事了,-O3与其他级别的优化(在儿童车中)没有太大不同。
但是,由于确实更严格地依赖语言的规则,特别是一些极端情况,它确实倾向于揭示人们依赖未定义行为的情况。
作为个人说明,我使用-O3在金融领域运行生产软件已有很多年了,并且还没有遇到过如果我使用-O2就不会出现的错误。
根据大众需求,这里有一个补充:
-O3尤其是诸如-funroll-loops之类的其他标志(未由-O3启用)有时会导致生成更多机器代码。在某些情况下(例如,在具有非常小的L1指令高速缓存的CPU上),这可能会导致速度变慢,这是因为某些内部循环的所有代码现在不再适合L1I。通常,gcc会尽力避免不生成太多代码,但是由于它通常会优化一般情况,因此可能会发生这种情况。-O3中通常不包括特别容易发生这种情况的选项(例如循环展开),并在手册页中进行了相应标记。因此,通常最好使用-O3来生成快速代码,并且仅在适当的时候(例如,当探查器指示L1I未命中时)回退到-O2或-Os(尝试对代码大小进行优化)。
如果想将优化工作发挥到极致,则可以通过–param调整与某些优化相关的成本。另外请注意,gcc现在可以将属性放在仅控制这些功能的优化设置的功能上,因此,当您发现一个功能中的-O3有问题(或想尝试该功能的特殊标志)时,您无需使用O2编译整个文件甚至整个项目。
在使用-Ofast时,似乎必须小心,它指出:
-Ofast启用所有-O3优化。它还启用了并非对所有符合标准的程序都有效的优化。
这使我得出结论,-O3旨在完全符合标准。

Ⅱ 如何设置NDK的编译选项

1. 概述

首先回顾一下 Android NDK 开发中,Android.mk 和Application.mk 各自的职责。

Android.mk,负责配置如下内容:

(1) 模块名(LOCAL_MODULE)

(2) 需要编译的源文件(LOCAL_SRC_FILES)

(3) 依赖的第三方库(LOCAL_STATIC_LIBRARIES,LOCAL_SHARED_LIBRARIES)

(4) 编译/链接选项(LOCAL_LDLIBS、LOCAL_CFLAGS)

Application.mk,负责配置如下内容:

(1) 目标平台的ABI类型(默认值:armeabi)(APP_ABI)

(2) Toolchains(默认值:GCC 4.8)

(3) C++标准库类型(默认值:system)(APP_STL)

(4) release/debug模式(默认值:release)

由此我们可以看到,本文所涉及的编译选项在Android.mk和Application.mk中均有出现,下面我们将一个个详细介绍。

2. APP_ABI

ABI全称是:Application binary interface,即:应用程序二进制接口,它定义了一套规则,允许编译好的二进制目标代码在所有兼容该ABI的操作系统和硬件平台中无需改动就能运行。(具体的定义请参考网络或者维基网络)

由上述定义可以判断,ABI定义了规则,而具体的实现则是由编译器、CPU、操作系统共同来完成的。不同的CPU芯片(如:ARM、Intel x86、MIPS)支持不同的ABI架构,常见的ABI类型包括:armeabi,armeabi-v7a,x86,x86_64,mips,mips64,arm64-v8a等。

这就是为什么我们编译出来的可以运行于Windows的二进制程序不能运行于Mac OS/linux/Android平台了,因为CPU芯片和操作系统均不相同,支持的ABI类型也不一样,因此无法识别对方的二进制程序。

而我们所说的“交叉编译”的核心原理也跟这些密切相关,交叉编译,就是使用交叉编译工具,在一个平台上编译生成另一个平台上的二进制可执行程序,为什么可以做到?因为交叉编译工具实现了另一个平台所定义的ABI规则。我们在Windows/Linux平台使用Android NDK交叉编译工具来编译出Android平台的库也是这个道理。

这里给出最新 Android NDK 所支持的ABI类型及区别:

下面是我总结的一些常用的CFLAGS编译选项:

(1)通用的编译选项

-O2 编译优化选项,一般选择O2,兼顾了优化程度与目标大小

-Wall 打开所有编译过程中的Warning

-fPIC 编译位置无关的代码,一般用于编译动态库

-shared 编译动态库

-fopenmp 打开多核并行计算,

-Idir 配置头文件搜索路径,如果有多个-I选项,则路径的搜索先后顺序是从左到右的,即在前面的路径会被选搜索

-nostdinc 该选项指示不要标准路径下的搜索头文件,而只搜索-I选项指定的路径和当前路径。

--sysroot=dir 用dir作为头文件和库文件的逻辑根目录,例如,正常情况下,如果编译器在/usr/include搜索头文件,在/usr/lib下搜索库文件,它将用dir/usr/include和dir/usr/lib替代原来的相应路径。

-llibrary 查找名为library的库进行链接

-Ldir 增加-l选项指定的库文件的搜索路径,即编译器会到dir路径下搜索-l指定的库文件。

-nostdlib 该选项指示链接的时候不要使用标准路径下的库文件

(2) ARM平台相关的编译选项

-marm -mthumb 二选一,指定编译thumb指令集还是arm指令集

-march=name 指定特定的ARM架构,常用的包括:-march=armv6, -march=armv7-a

-mfpu=name 给出目标平台的浮点运算处理器类型,常用的包括:-mfpu=neon,-mfpu=vfpv3-d16

-mfloat-abi=name 给出目标平台的浮点预算ABI,支持的参数包括:“soft”, “softfp” and “hard”

Ⅲ 什么叫 -O2编译

【-O2编译】编译器提供-O选项,供程序优化使用。其中:
1、-O0表示没有优化;
2、-O1为缺省值,提供基础级别的优化;
3、-O2 提供更加高级的代码优化,会占用更长的编译时间;
4、-O3 提供最高级的代码优化。
【编译器】就是将“一种语言(通常为高级语言)”翻译为“另一种语言(通常为低级语言)”的程序。一个现代编译器的主要工作流程:源代码 (source code) → 预处理器 (preprocessor) → 编译器 (compiler) → 目标代码 (object code) → 链接器(Linker) → 可执行程序 (executables)
高级计算机语言便于人编写,阅读交流,维护。机器语言是计算机能直接解读、运行的。编译器将汇编或高级计算机语言源程序(Source program)作为输入,翻译成目标语言(Target language)机器代码的等价程序。源代码一般为高级语言 (High-level language), 如Pascal、C、C++、java、汉语编程等或汇编语言,而目标则是机器语言的目标代码(Object code),有时也称作机器代码(Machine code)。

Ⅳ 请问noip 的“编译命令(不包含任何优化开关)”是什么意思,望解答

意思就是
Pascal:fpc %s.pas
G++:g++ %s.cpp -o %s.exe
GCC:gcc %s.c -o %s.exe
无视Pascal文件里的开关

有的人编译时喜欢开-o -o2 -o3,速度快点,但是noip不允许这个
而且-o2可以影响程序行为

Ⅳ linux下如何查看一个二进制文件是使用-O0优化还是-O2优化

gcc默认提供了5级优化选项:
-O/-O0:无优化(默认)
-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。该模式在编译大型程序的时候会花费更多的时间和内存。在-O1下:编译会尝试减少代码体积和代码运行时间,但是并不执行会花费大量时间的优化操作。
-O2: 包含-O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化。GCC执行几乎所有支持的操作但不包括空间和速度之间权衡的优化,编译器不执行循环展开以及函数内联。这是推荐的优化等级,除非你有特殊的需求。-O2会比-O1启用多一些标记。与-O1比较该优化-O2将会花费更多的编译时间当然也会生成性能更好的代码。
-Os:专门优化目标文件大小,执行所有的不增加目标文件大小的-O2优化选项。同时-Os还会执行更加优化程序空间的选项。这对于磁盘空间极其紧张或者CPU缓存较小的机器非常有用。但也可能产生些许问题,因此软件树中的大部分ebuild都过滤掉这个等级的优化。使用-Os是不推荐的。
-O3: 打开所有-O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize优化选项。这是最高最危险的优化等级。用这个选项会延长编译代码的时间,并且在使用gcc4.x的系统里不应全局启用。自从3.x版本以来gcc的行为已经有了极大地改变。在3.x,-O3生成的代码也只是比-O2快一点点而已,而gcc4.x中还未必更快。用-O3来编译所有的软件包将产生更大体积更耗内存的二进制文件,大大增加编译失败的机会或不可预知的程序行为(包括错误)。这样做将得不偿失,记住过犹不及。在gcc 4.x.中使用-O3是不推荐的。
————————————————
版权声明:本文为CSDN博主“rongming_lu”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LU_ZHAO/java/article/details/104516291

Ⅵ Linux下gcc编译介绍

Linux系统下的Gcc(GNU C Compiler)是GNU推出的功能强大、性能优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
Gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别,下面我们来介绍gcc所遵循的部分约定规则。
.c为后缀的文件,C语言源代码文件;
.a为后缀的文件,是由目标文件构成的档案库文件;
.C,.cc或.cxx 为后缀的文件,是C++源代码文件;
.h为后缀的文件,是程序所包含的头文件;
.i 为后缀的文件,是已经预处理过的C源代码文件;
.ii为后缀的文件,是已经预处理过的C++源代码文件;
.m为后缀的文件,是Objective-C源代码文件;
.o为后缀的文件,是编译后的目标文件;
.s为后缀的文件,是汇编语言源代码文件;
.S为后缀的文件,是经过预编译的汇编语言源代码文件。
Gcc的执行过程
虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。
命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。

Gcc的基本用法和选项
在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。Gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。
Gcc最基本的用法是∶gcc [options] [filenames]
其中options就是编译器所需要的参数,filenames给出相关的文件名称。
-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。
-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。
-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶
A)#include
B)#include “myinc.h”
其中,A类使用尖括号(< >),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而对于B类,cpp在当前目录中搜寻头文件,这个选项的作用是告诉cpp,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。在程序设计中,如果我们需要的这种包含文件分别分布在不同的目录中,就需要逐个使用-I选项给出搜索路径。
-Ldirname,将dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在连接过程中使用的参数。在预设状态下,连接程序ld在系统的预设路径中(如/usr/lib)寻找所需要的档案库文件,这个选项告诉连接程序,首先到-L指定的目录中去寻找,然后到系统预设路径中寻找,如果函数库存放在多个目录下,就需要依次使用这个选项,给出相应的存放目录。
-lname,在连接时,装载名字为“libname.a”的函数库,该函数库位于系统预设的目录或者由-L选项确定的目录下。例如,-lm表示连接名为“libm.a”的数学函数库。
上面我们简要介绍了gcc编译器最常用的功能和主要参数选项,更为详尽的资料可以参看Linux系统的联机帮助。
假定我们有一个程序名为test.c的C语言源代码文件,要生成一个可执行文件,最简单的办法就是∶
gcc test.c
这时,预编译、编译连接一次完成,生成一个系统预设的名为a.out的可执行文件,对于稍为复杂的情况,比如有多个源代码文件、需要连接档案库或者有其他比较特别的要求,就要给定适当的调用选项参数。再看一个简单的例子。
整个源代码程序由两个文件testmain.c 和testsub.c组成,程序中使用了系统提供的数学库,同时希望给出的可执行文件为test,这时的编译命令可以是∶
gcc testmain.c testsub.c □lm □o test
其中,-lm表示连接系统的数学库libm.a。

Gcc的错误类型及对策
Gcc编译器如果发现源程序中有错误,就无法继续进行,也无法生成最终的可执行文件。为了便于修改,gcc给出错误资讯,我们必须对这些错误资讯逐个进行分析、处理,并修改相应的语言,才能保证源代码的正确编译连接。gcc给出的错误资讯一般可以分为四大类,下面我们分别讨论其产生的原因和对策。

第一类∶C语法错误
错误资讯∶文件source.c中第n行有语法错误(syntex errror)。这种类型的错误,一般都是C语言的语法错误,应该仔细检查源代码文件中第n行及该行之前的程序,有时也需要对该文件所包含的头文件进行检查。有些情况下,一个很简单的语法错误,gcc会给出一大堆错误,我们最主要的是要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教材。
第二类∶头文件错误
错误资讯∶找不到头文件head.h(Can not find include file head.h)。这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。

第三类∶档案库错误
错误资讯∶连接程序找不到所需的函数库,例如∶
ld: -lm: No such file or directory
这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。
第四类∶未定义符号
错误资讯∶有未定义的符号(Undefined symbol)。这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc连接选项中的-l和-L项。
排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,可以说只是开了个头。这个过程中的错误,只是我们在使用C语言描述一个算法中所产生的错误,是比较容易排除的。我们写一个程序,到编译、连接通过为止,应该说刚刚开始,程序在运行过程中所出现的问题,是算法设计有问题,说得更玄点是对问题的认识和理解不够,还需要更加深入地测试、调试和修改。一个程序,稍为复杂的程序,往往要经过多次的编译、连接和测试、修改。下面我们学习的程序维护、调试工具和版本维护就是在程序调试、测试过程中使用的,用来解决调测阶段所出现的问题。窗体顶端
窗体底端

Ⅶ O2优化扫盲

O2优化实际上是Optimize,2是优化等级。除了O2优化还有O3优化,这是更高等级的优化;还有Ofast、Os等等多种优化等级,对于有些算法题,使用暴力算法+O2优化是可以正常AC的;但是注意并不是所有O2优化都是正优化,有的会是负优化

[gcc官方关于O2优化的说明] ( https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html )

但是实际应用中STL编译的时候,我们会开 优化,开完之后其实速度跟数组模拟的队列差不多快
在算法竞赛中,比赛方一般不会开O2优化,这种情况下STL的栈队列要比数组模拟的栈队列慢一倍左右
O2优化的知识点还是非常重要的!!!

阅读全文

与编译o2到底好不好相关的资料

热点内容
围棋排名算法 浏览:960
zigbee加密算法 浏览:461
柏杨版资治通鉴pdf 浏览:393
事业编程序员下班时间 浏览:8
linux中命令大全 浏览:36
pic单片机学习网站 浏览:163
843除6的算法 浏览:377
arduino编程视频 浏览:744
pdf背景绿色 浏览:612
记事本dos命令 浏览:274
服务器如何搭建多个节点 浏览:326
acx算法 浏览:258
幽冥诡匠漫画全集用什么app可以看 浏览:1003
租用服务器为什么越来越慢 浏览:962
算法创新就业方向 浏览:425
算法最优解作者 浏览:870
通达信红绿宝塔线指标源码 浏览:669
app是什么东西合法吗 浏览:234
怎么锁app视频教程 浏览:843
迅捷pdf注册码生成器 浏览:750