gpt4 book ai didi

c++ - 如果在cpp中,则使用const进行for循环的最佳实践

转载 作者:行者123 更新时间:2023-12-01 14:42:13 25 4
gpt4 key购买 nike

例如。

  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);
}
}

  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循环的一个很好的论据。它们是一个非常低级的结构,应避免使用替代方法。在这种情况下,使用它们会迫使您在外观简洁的实现(可能存在性能缺陷)和技术上更好的实现(但在样式上次优)之间进行选择。
您可以通过两种通用操作来描述您的两种操作:copytransform。您可以根据它们来编写算法,如下所示:

if (bitwidth == 0) {
using std::copy_n;
copy_n(res_f32, B * H * W * C, p_res);
} else {
transform_n(res_f32, B * H * W * C, p_res, [=](auto const& x){ return x.toint(bitwidth, fracwidth); });
}
不幸的是,没有 std::transform_n,但是 you can make one。另外,更好的是,如果您的 B*H*W*C术语可以以容器的形式存储,则最好直接将其表示为 View 或容器的 begin/end,从而可以使用自动(non- _n) copy/transform代替。
这不仅更具可读性,而且以标准操作的常见术语表达逻辑,为错误留出了更少的空间,并允许更轻松地更改基础容器,操作,潜在的并行性和整体可维护性。

关于c++ - 如果在cpp中,则使用const进行for循环的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63519983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com