对于一个应用程序,我所处的情况是相同的信息以多种形式存在:Base64 字符串、十六进制字符串和 char[]
。
现在,为了提高效率,我没有为每个函数煞费苦心地声明和初始化一个变量,而是仅在上述形式之间的明显转换点应用它。之所以如此,是因为有些地方不需要将变量转换为另一种形式来进行条件比较等操作。
从我读到的内容来看,编译器的效率似乎令人难以置信,而且一天比一天高;然而,当我尝试阅读更深入的分析和描述时,我常常会越过我的经验极限,我的大脑堆满了东西。
如果一个函数重复调用一个变量以将其更改为另一种形式,比如从 Base64 字符串到十六进制字符串,每次都产生相同的结果,编译器是否会优化这些调用,以便为整个范围是不必要的?
在我的例子中,我一直在使用 -Ofast
,直到出现更好的东西。
最佳答案
编译器可以优化掉哪些内容实际上取决于代码的编写方式;然而,依赖过于聪明的编译器通常是不明智的。编译器擅长优化寄存器分配和各种低级的东西,但是如果你的程序中有一些你知道的不变量可以让代码更有效地编写,不要假设编译器理解整个程序.
对于您提到的这个特定示例,如果您将数据包装在一个实现各种格式转换运算符的类中并缓存转换结果,这将是比依赖编译器不重做更好的方法同样的计算。但是,如果您将这些转换运算符标记为“const”,则编译器有可能(假设没有执行交错的非常量操作)重用先前调用“const”方法的结果。但是,我建议除了缓存结果之外还这样做,而不是依赖这种优化。
此外,当涉及到这些优化时,唯一可以确定的方法是使用特定的编译器实际编译代码并检查程序集输出以确定它是否应用了该优化。
关于c++ - gcc 是否会优化对同一变量的重复函数调用,每次调用都具有相同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24522446/