是否有类似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模板参数(并且最终会出现奇怪的编译器错误).
鉴于三个功能:
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在这种情况下,因为你正在做的是取两个值中较大的值.
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |