首页 > 修改教程 > gg修改器如何加快游戏速度_GG修改器游戏变速
gg修改器如何加快游戏速度_GG修改器游戏变速
  • gg修改器最新版
  • 大小:17.20MB版本:v4.92
  • 语言:简体中文系统:Android
绿色无毒,安全可靠!部分设备误报拦截请通过!

gg修改器如何加快游戏速度_GG修改器游戏变速

作者:佚名 来源:网友分享 日期:2024-04-25 06:28:09

大家好,今天小编为大家分享关于gg修改器如何加快游戏速度_GG修改器游戏变速的内容,赶快来一起来看看吧。

如何分析和提高大型项目(C/C++)的编译速度?

C/C++编译基本原理

对于C/C++代码通常来说整个构建过程分为以下几个主要部分:

·预处理
在此阶段主要完成的工作是将头文件展开、替换宏指令、条件编译展开、消除注释。

·编译
在此阶段主要将预编译好的文件转换成汇编语言(高级语言->LLVM平台无关语言->平台汇编语言)。

·汇编
在此阶段将汇编语言转换为二进制机器语言。

·链接
将编译产物和预编译制品(.o、.a、.so)“拼”成可执行文件,具体一些就是为main编译过程中每一个未定义的符号去编译产物中挨个寻找相应的实现代码,补全符号地址信息。

在编译耗时分析中也就应该对以上几个主要方面分别进行时间维度的评估,逐渐细化分析粒度确定时间瓶颈,直到某个文件、某个函数、某个模板才能有针对性地制定从宏观的构建系统到微观的文件、符号的具体优化方案。

预处理

gcc -E选项可以得到预处理后的结果,扩展名为.i或 .ii。一般来说对预处理阶段的分析尤为重要,因为预处理完了之后的中间文件才是真正编译过程的输入。预处理后文件的体量大小直接影响了后续阶段各个部分的时间消耗水平。由于C/C++编译特点的影响,每个编译单元(源文件),都需要独立解析所有包含的头文件。也就是说如果N个源文件引用到了同一个头文件,则这个头文件需要解析N次。如果头文件中有模板(STL/Boost),则该模板在每个cpp文件中使用时都会做一次实例化,N个源文件中的std::vector会实例化N次。通常来说预处理阶段资源消耗是否合理一般可以通过以下几个具体指标进行查看。

·单个源文件头文件引用总数

·单个头文件被引用总数

编译

gcc -S选项可以得到编译后的汇编代码文件,扩展名为.s。在该阶段中,GCC为了满足用户不同程度的的优化需要,提供了近百种优化选项,用来对编译时间,目标文件长度,执行效率这个三维模型进行不同的取舍和平衡。优化的方法不一而足,总体上将有以下几类:

.精简操作指令。

.尽量满足CPU的流水操作。

.通过对程序行为地猜测,重新调整代码的执行顺序。

.充分使用寄存器。

.对简单的调用进行展开等等。

而使用编译器提供的优化选项有时也可能需要再别的地方做取舍。部分优化选项会精简指令改变代码执行顺序,这会导致程序的可调试性大幅降低。另外一些涉及对寄存器、内存进行优化的指令可能会使程序在内存或者寄存器中结果的正确性得不到保障,这也是偶尔会在涉及到寄存器操作的代码中看到Volatile关键字的原因之一。

为了简化用户操作,GCC也提供了相应的一些预设优化方案例如O0~03

·O0:不做任何优化,这是默认的编译选项。

·O和O1:对程序做部分编译优化,编译器会尝试减小生成代码的尺寸,以及缩短执行时间,但并不执行需要占用大量编译时间的优化。

·O2:是比O1更高级的选项,进行更多的优化。GCC将执行几乎所有的不包含时间和空间折中的优化。当设置O2选项时,编译器并不进行循环展开以及函数内联优化。与O1比较而言,O2优化增加了编译时间的基础上,提高了生成代码的执行效率。

·O3:在O2的基础上进行更多的优化,例如使用伪寄存器网络,普通函数的内联,以及针对循环的更多优化。

·Os:主要是对代码大小的优化,通常各种优化都会打乱程序的结构,让调试工作变得无从着手。并且会打乱执行顺序,依赖内存操作顺序的程序需要做相关处理才能确保程序的正确性。

汇编

gcc -c选项可以得到汇编后的结果文件,扩展名为.o。.o文件,是按照的二进制编码方式生成的文件。在这个阶段中可以做的优化方案并不多,所以暂时只需要了解该阶段的基本作用即可。

链接

简单的讲,链接器的工作就是解析未定义的符号引用,将目标文件中的占位符替换为符号的地址。链接器还要完成程序中各目标文件的地址空间的组织,这可能涉及重定位工作。在C./C++程序的链接过程中主要涉及以下角色:

·静态库:指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了,其后缀名一般为“.a”。

·动态库:在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可执行文件比较小,动态库一般后缀名为“.so”。

·可执行文件:将所有的二进制文件链接起来融合成一个可执行程序,不管这些文件是目标二进制文件还是库二进制文件。

C++编译特性

编译单元

C/C++的编译系统和其他高级语言存在很大的差异,其他高级语言中,编译单元是整个Module,即Module下所有源码,会在同一个编译任务中执行。而在C/C++中,编译单元是以文件为单位。每个.c/.cc/.cxx/.cpp源文件是一个独立的编译单元,导致编译优化时只能基于本文件内容进行优化,很难跨编译单元提供代码优化。

头文件解析

如果N个源文件引用到了同一个头文件,则这个头文件需要解析N次。

如果头文件中有模板(STL/Boost),则该模板在每个cpp文件中使用时都会做一次实例化,N个源文件中的std::vector会实例化N次。

模板函数实例化

在C++ 98语言标准中,对于源代码中出现的每一处模板实例化,编译器都需要去做实例化的工作;而在链接时,链接器还需要移除重复的实例化代码。显然编译器遇到一个模板定义时,每次都去进行重复的实例化工作,进行重复的编译工作。此时,如果能够让编译器避免此类重复的实例化工作,那么可以大大提高编译器的工作效率。在C++ 0x标准中一个新的语言特性–外部模板的引入解决了这个问题。

在C++ 98中,已经有一个叫做显式实例化(Explicit Instantiation)的语言特性,它的目的是指示编译器立即进行模板实例化操作(即强制实例化)。而外部模板语法就是在显式实例化指令的语法基础上进行修改得到的,通过在显式实例化指令前添加前缀extern,从而得到外部模板的语法。

.显式实例化语法:template class vector。

.外部模板语法:extern template class vector。

一旦在一个编译单元中使用了外部模板声明,那么编译器在编译该编译单元时,会跳过与该外部模板声明匹配的模板实例化。

以上就是关于gg修改器如何加快游戏速度_GG修改器游戏变速的全部内容,希望对大家有帮助。

相关文章

热门下载

大家还在搜