inline的使用

inline 的作用还是在于和 static 一起使用,让小函数尽可能的减小开销甚至消除函数开销。
restrict 最重要的还是在于编译器的优化上。
有一个很重要的地方,称为指针别名,是阻碍编译器优化代码的最重要的地方
什么是指针别名?

    void tmp_plus(int * a, int * b)
    {
        for(int i = 0; i < b_len;++i)
            *a += b[i];
    }

这段代码中,a, b 是两个被传入的指针,编译器对他们毫无所知,也不知道a是否在b的范围之内,故无法对其做出最大程度上的优化,这会导致什么结果呢?也就是,每依次循环过后,*a的结果都会写回到主存当中去,而不是在寄存器里迅速进行下一次增加!
或者有的聪明的编译器可以将其扩展成if … else的加长版形式来避免写回操作。
但是如果我们增加了restrict

    void tmp_plus(int * restrict a, int * restrict b) 

这就是告诉编译器,这两个指针是完全不相干的,你可以放心的优化,不会出错。

但是在这里有一些小的问题,那就是C++并不支持这个关键字,这会导致什么后果?
你在Visual Studio下编程的时候会发现使用restrict关键字是会产生编译错误的,无论你使用 .c 还是 .cpp,难道说不支持吗?实际上不是,主流的编译器都对这个关键字有自己的实现
Visual Studio(Visual C++) : __restrict
GCC, Clang : __restrict__

volatile,对其的解释就是让编译器不对其进行优化的意思,这里再说清楚一点
假设 volatile int i = 0;
首先它的现象本质就是,确保每次读取 i 的时候,是从它的内存位置读取,每次对它操作完毕后,将结果写回它的内存位置,而不是将其优化保存在寄存器内。
这就让一些编译器的优化无法进行,就像上方所说的。
一般将其用在调试时期,防止编译器的优化对自己的代码逻辑造成混淆。
但是,正如上面所说,这个关键字的作用是每次都进行存取,开销自然就变大了,意味着无法使用缓存来对其进行加速,换句话来说就是,只要是关于它的操作,开销都将变大。
并且,其所能起到的作用大部分体现在 多线程编程中,而且也无法阻止指令重排之类的优化。
对此,有一个需要提及的内容是,可以适当的使用 内存屏障 来替代这种volatile的功能,内存屏障是由操作系统提供的功能,目的是防止由于某些优化,导致的指令重排的效果。
某些编译器也有提供类似的功能,例如 GCC就可以通过内嵌汇编代码的方式实现这个效果

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值