美文网首页
CH8.1 编译器自动优化

CH8.1 编译器自动优化

作者: 磊宝万岁 | 来源:发表于2019-05-14 15:32 被阅读0次
编译器能做什么
1. Function inlining

对于一些比较简单的函数,编译器会直接进行inlining, 即使你的代码里并没有声明该函数是inline的。但是为了保险还是把需要inline的函数声明为inline为好。
函数内联的好处是
(1). 节省函数跳转的时间
(2). 有利于code caching
(3). 有利于后续的编译器优化
当然也有坏处,就是如果某函数调用次数过多或者被内联的函数很长的情况下会使得代码变得过大.

2. 简单的常数计算

编译器会在编译阶段把你代码里的一些常数计算的结果给算出来.
比如

double a, b;
a = b + 2.0/3.0;

编译完成会变成这样:

double a, b;
a = b + 0.666666666666666667;

注意:有时候你需要做一些显式的的指示,比如 b2.0/3.0 编译器会认为计算是从左往右计算的(事实也是这样,为了保证不丢精度),这样就不会进行提前计算,所以如果你想再编译阶段进行计算的话你需要显示的加括号:b(2.0/3.0)。这样就不会有上述问题了。
一些简单的函数编译器会直接inline进去的,像sqrt、pow这样的,但是一些比较麻烦的像sin函数就不会inline进去。

3. Pointer elimination

如果Pointer 或者reference指向的内容是已知的话,编译器可能会把指针给消除掉,其实就是相当于inline了函数。

void Plus2(int *p){
    *p = *p + 2;
}
int a;
Plus2(&a);

编译器会优化成:

a += 2;
4. 多次相同运算只算一次
int a, b, c;
b = (a+1) * (a+1);
c = (a+1) * 4;

可以优化成如下:

int a, b, c, temp;
tmp = 1 + a;
b = tmp * tmp;
c = tmp * 4;
5. 寄存器变量

一般来说32位系统中有6个整数寄存器8个浮点数寄存器,在64位系统中有14个整数寄存器16个浮点数寄存器。不包括XMM、YMM、ZMM这些向量寄存器。

  • 如果一个变量被引用了的话(不论是通过pointer还是reference)那么这个变量就不可能被放到寄存器里。所以说如果你想让让某个变量放到寄存器来加速程序的话就不要使用它的引用或者指针。

相关文章

  • CH8.1 编译器自动优化

    编译器能做什么 1. Function inlining 对于一些比较简单的函数,编译器会直接进行inlining...

  • 内联函数(Inline Function)

    场景:如果开启了编译器优化(Release模式默认会开启优化),编译器自动将某些函数变成内联函数 调用方式如下: ...

  • @inline inout

    内联函数 如果开启了编译器优化(Release模式默认会开启优化),编译器会自动将某些函数变成内联函数.即将函数调...

  • Swift 内联函数窥探

    内联函数(Inline Function): 如果开启了编译器优化,编译器会自动将某些函数变成内联函数(将函数调用...

  • LLVM

    一、编译器 性能优化:启动优化、界面优化、架构优化 编译型语言:OC(编译器是clang)、C(编译器可以直接执行...

  • Linux 下如何绕过编译器优化

    本文首次发表在 Linux 下如何绕过编译器优化 有同学在群里聊到编译器优化的事情,很多时候期望编译器默认做优化,...

  • 苹果是如何实现autoreleasepool的?

    arc下编译器会优化成 向一个结构AutoreleasePoolPage,中写入需要自动释放的对象,类似一种标记,...

  • java类型提升、语法糖、编译器优化的一点见解

    猜一下上面这段代码的结果是什么? 上面这段代码涉及到了自动装箱拆箱、自身优化、编译器优化、类型提升。先来看下从cl...

  • JMM造成指令重排的原因

    1、编译器优化 2、Processor 优化(流水线) 3、MESI缓存优化

  • 十一、ARC下的retain和release

    ARC下,我们虽然不能再显式调用retain和release了(这些工作编译器自动优化了),但弄懂引用计数对于内存...

网友评论

      本文标题:CH8.1 编译器自动优化

      本文链接:https://www.haomeiwen.com/subject/bansaqtx.html