zoukankan      html  css  js  c++  java
  • 看看编译器是否会对已知结果的运算式做出优化?(老物)

    有时候我们想优化一些语句,例如:

    你会发现,这个(8 * sizeof(uint32_t))不是会每次循环中浪费一次运算的时间吗?
    那么针对这个问题我们可以通过宏定义或者静态常数处理,宏定义不用说大家都直接,直接把运算常数结果定义出来就可以了,但是带来的问题不仅是破坏了原有代码的拓展性和可读性,还带来了调试终止条件困难的结果,如果不是高级的IDE可能要到处查看引用才知道终止常数是多少。
    那么利用静态常数做处理,则代码改成如下:

    你会发现,这不是浪费了一个4字节的静态空间,而且还不是要每次函数进来时进行一次运算才行吗?
    如果这样去想就会发现问题了,同时,本文的正题也就出来了,对于一个已知结果的运算式,编译器是否会做出优化呢?答案自然是肯定的,但是为什么呢?
    因为,静态化变量如果要初始化的要求是赋予常量,反过来说,如果 (8 * sizeof(uint32_t))不是常量肯定不会通过编译,既然编译器知道它是常量,那是不是就意味着它是一个优化的结果?
    毕竟已经帮你提前算出结果并视为常量?所以这是不是意味着我们可以放心的使用一个已知结果的运算式作为一个常量来使用呢?

    附上一个图来说明问题:
    其实可以不用像我写的代码那样把常量存储到变量中,把常量写入一个变量仅仅是为了说明这个问题和方便我调试时看到终止条件值而不是自己推断终止条件(考虑代码可读性)。同时,这样做与宏定义在程序的二进制执行上并没什么区别,因为宏定义只是替换代码内容并没有改变常量的存储方式,但是却带来了上面所说的那么多问题,所以这种情况下,还是不要使用宏定义为好:)。

  • 相关阅读:
    hdu多校4
    hdu多校第三场
    牛客多校4
    bzoj 1477 扩展欧几里德
    bzoj 1485 卡特兰数 + 分解因子
    hdu多校 2
    牛客网暑期多校2
    bzoj 1040 基向内环树dp
    hdu 多校第一场
    SPOJ
  • 原文地址:https://www.cnblogs.com/juwan/p/11448985.html
Copyright © 2011-2022 走看看