如何解决如果在cpp中,则使用const进行for循环的最佳实践
例如。
if (bitwidth == 0) {
for (int bhwc = 0; bhwc < B * H * W * C; ++bhwc) {
p_res[bhwc] = res_f32[bhwc];
}
} else {
for (int bhwc = 0; bhwc < B * H * W * C; ++bhwc) {
p_res[bhwc] = res_f32[bhwc].toint(bitwidth,fracwidth);
}
}
vs
for (int bhwc = 0; bhwc < B * H * W * C; ++bhwc) {
if (bitwidth == 0) {
p_res[bhwc] = res_f32[bhwc];
} else {
p_res[bhwc] = res_f32[bhwc].toint(bitwidth,fracwidth);
}
}
第二个更具可读性和可维护性,但它可能更慢。有没有更好的方法?(如您所见,for循环的外部可能非常复杂,具有4维...
解决方法
对性能的影响微不足道,每个现代编译器都应该能够对其进行优化,以避免在循环中间出现分支。
但是,这显示了一个有趣的问题,并且是反对使用for
循环的一个很好的论据。它们是一个非常低级的结构,应避免使用替代方法。在这种情况下,使用它们会迫使您在外观简洁的实现(具有潜在的性能缺陷)和技术上更好的实现之间进行选择,但在样式上次优。
可以用两个通用操作来描述您的两个操作:copy
和transform
。您可以根据它们来编写算法,如下所示:
if (bitwidth == 0) {
using std::copy_n;
copy_n(res_f32,B * H * W * C,p_res);
} else {
transform_n(res_f32,p_res,[=](auto const& x){ return x.toint(bitwidth,fracwidth); });
}
不幸的是,没有std::transform_n
,但是you can make one。另外,更好的是,如果您的B*H*W*C
术语可以用容器的形式存储,则最好直接将其表示为视图或容器的begin/end
,从而可以使用自动(非{_n
)copy/transform
。
这不仅可读性强,而且以标准操作的常见术语表达逻辑,为错误留出了更少的空间,并允许更轻松地更改基础容器,操作,潜在的并行性和整体可维护性。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。