c ++更有效的方法将这两行代码comperison写入一个短行

abr*_*hab 1 c++ optimization

是否有类似short if = (cond) ? true : false语句的东西,但要将条件的结果传递给{ }?或者也许其他一些想法如何写这种代码更优雅?

double t_day = day * 0.15;
if (t_day < 1) { t_day = 1; }
Run Code Online (Sandbox Code Playgroud)

也许是这样的

double t_day = (day * 0.15) ? day * 0.15 : 1;
Run Code Online (Sandbox Code Playgroud)

但没有额外的计算?

Ale*_* C. 16

double t_day = std::max(day * 0.15, 1.);
Run Code Online (Sandbox Code Playgroud)

不要忘记之后的时间段,1因为编译器将无法推断出正确的double模板参数(并且最终会出现奇怪的编译器错误).

  • 或者(到最后)你可以要求特定的专业化:`std :: max <double>(day*0.15,1)` (5认同)

Fle*_*exo 8

鉴于三个功能:

double func1(const double& day) {
  double t_day = day * 0.15;
  if (t_day < 1) { t_day = 1; }
  return t_day;
}

double func2(const double& day) {
  return std::max(day*0.15, 1.);
}

double func3(const double& day) {
  return (day * 0.15 > 1) ? day * 0.15 : 1;
}
Run Code Online (Sandbox Code Playgroud)

我们可以检查编译器的输出(例如g++ -O3 -S):

func1 变为:

_Z5func1RKd:
.LFB368:
        .cfi_startproc
        movsd   .LC1(%rip), %xmm0
        movsd   .LC0(%rip), %xmm1
        mulsd   (%rdi), %xmm0
        maxsd   %xmm0, %xmm1
        movapd  %xmm1, %xmm0
        ret
Run Code Online (Sandbox Code Playgroud)

func2 变为:

_Z5func2RKd:
.LFB370:
        .cfi_startproc
        movsd   .LC1(%rip), %xmm0
        movsd   .LC0(%rip), %xmm1
        mulsd   (%rdi), %xmm0
        maxsd   %xmm0, %xmm1
        movapd  %xmm1, %xmm0
        ret
Run Code Online (Sandbox Code Playgroud)

func3成为:

_Z5func3RKd:
.LFB369:
        .cfi_startproc
        movsd   .LC1(%rip), %xmm0
        mulsd   (%rdi), %xmm0
        maxsd   .LC0(%rip), %xmm0
        ret
Run Code Online (Sandbox Code Playgroud)

其中LC0和LC1是常数1.0和0.15.

作为参考,Clang的中间表示可能更容易阅读:

define double @_Z5func1RKd(double* nocapture %day) nounwind uwtable readonly {
  %1 = load double* %day, align 8, !tbaa !0
  %2 = fmul double %1, 1.500000e-01
  %3 = fcmp olt double %2, 1.000000e+00
  %t_day.0 = select i1 %3, double 1.000000e+00, double %2
  ret double %t_day.0
}

define double @_Z5func2RKd(double* nocapture %day) nounwind uwtable readonly {
  %1 = load double* %day, align 8, !tbaa !0
  %2 = fmul double %1, 1.500000e-01
  %3 = fcmp olt double %2, 1.000000e+00
  %4 = select i1 %3, double 1.000000e+00, double %2
  ret double %4
}

define double @_Z5func3RKd(double* nocapture %day) nounwind uwtable readonly {
  %1 = load double* %day, align 8, !tbaa !0
  %2 = fmul double %1, 1.500000e-01
  %3 = fcmp ogt double %2, 1.000000e+00
  %4 = select i1 %3, double %2, double 1.000000e+00
  ret double %4
}
Run Code Online (Sandbox Code Playgroud)

结论:

他们都成了一个mulsd,maxsd但是你写的.花时间编写最自然,最容易获得正确方法的东西,让编译器担心这样的细节.我会说这是std::max在这种情况下,因为你正在做的是取两个值中较大的值.