我有一个评估4个以上简单算术比较以返回布尔值的核心函数。 这将在一个非常大的循环中被称为O(N ^ 2)次,并且基于返回的单个条件分支。

如果函数写为:

    return x < y && g < h && m < n && q < r;

它会使用“&”生成3个条件分支,而不是0个吗? 该代码将公开发布,因此可以在具有许多不同编译器实现的许多不同平台上进行编译。

尽管单个实现可能足够聪明以优化短路,但是将这样的东西写到标准中(c ++ 11、14、17或20)吗? 仅使用“&”对性能“安全”吗?

  ask by gmaggiol translate from so

本文未有回复,本站智能推荐:

3回复

C / C ++允许短循环编译器优化

在下面的例子中,是否允许编译器优化掉对foo()和\\或整个if块的调用?
5回复

C / C ++优化器是否可以决定延迟评估仅用于短路评估的值?

我喜欢这样重构复杂的条件: 到这个: 我认为这使代码更容易理解,并且有助于调试,因为您可以看到用于计算最终条件的中间结果。 但是:原代码,由于短路, bar将仅评估foo返回true ,并longMethodName只有当bar返回true 。 假设函数是“纯”的,方
3回复

现代编译器可以优化表达式从函数派生的常量表达式吗?

我的理解是,现代c ++编译器采用以下方式的快捷方式: 但是如下:
7回复

c ++:编译器能否优化此代码段?

对于外循环的每次执行,都检查“常量”的值。 但是,常量永远不会改变,所以浪费了大量的CPU时间来测试条件常数<10? 一遍又一遍地。 人类会在前几次传球后意识到常数永远不变,并且智能地避免一遍又一遍地检查它。 编译器是否注意到这一点并对其进行智能优化,或者重复if循环是否不可避免
2回复

编译器优化:g ++比intel慢

我最近购买了一台带有双启动的计算机,用C ++编写代码。 在Windows上我在linux上使用intel C ++编译器和g ++。 我的程序主要包括计算(具有数值积分的定点迭代算法等)。 我以为我可以在我的linux上接近windows的表演,但到目前为止我还没有:对于完全相同的代码
2回复

如何避免编译器优化某些操作?

如何避免编译器优化某些操作? 例如,如果我实现自己的sprintf2 ,我想比较我的sprintf2和stdlib的sprintf的性能,所以我写了这段代码: 事实证明: 我们知道, sprintf花费时间,而MAXN是如此之大,所以t3-t2不应该是0 。 因为我们
5回复

编译器可以优化可变长度的循环吗?

如果在编译时不知道循环的最后一个索引(以下示例中的a和b ,编译器是否可以优化循环? 未优化: 更优化:(假设a和b很大...)
4回复

优化编译器如何决定展开循环的时间和数量?

当编译器执行循环展开优化时,它如何确定展开循环的因素或是否展开整个循环? 由于这是空间性能权衡,平均而言,这种优化技术在使程序运行得更好方面效率如何? 此外,在什么条件下建议使用这种技术(即某些操作或计算)? 这不必特定于某个编译器。 它可以是任何解释,概述这种技术背后的想法以及在实
8回复

为什么编译器不将浮点* 2优化为指数增量?

我经常注意到gcc将乘法转换为可执行文件中的移位。 当乘以int和float时可能会发生类似的事情。 例如, 2 * f ,可能只是将f的指数递增1,从而节省了一些周期。 编译器,也许是否请求他们这样做(例如通过-ffast-math ),一般来说,这样做吗? 编译器通常是否足够聪明
2回复

大多数编译器是否将%2转换为比特? 真的更快吗?

在编程中,通常需要检查数字是奇数还是偶数。 为此,我们通常使用: 但是,我的理解是'%'运算符实际执行除法并返回其余数; 因此,对于上述情况,简单地检查最后一位会更快。 比方说n = 5; 为了检查数字是奇数还是偶数,我们只需要检查最后一位。 如果是1 ,那么数字是奇数;