C++ 确定给定数集中的任何一个数是否为零的最有效方法是什么?

C++ 确定给定数集中的任何一个数是否为零的最有效方法是什么?,c++,c,C++,C,在我的项目中,只有当特定集合中的一个或多个数字为零时,我才能执行某些操作。我希望此检查是有效的,不希望执行多个and操作 e、 g.如果有10个元素,在得到最终答案之前,我需要执行以下操作 var_and= A1 && A2; var_and=var_and && A3;.. . . var_and=var_and && A10; 这就是汇编代码的样子(?) 有没有更好的解决办法 首先要指出的是,“效率最高”的人是旁观者。你是说最快的?最小代码空

在我的项目中,只有当特定集合中的一个或多个数字为零时,我才能执行某些操作。我希望此检查是有效的,不希望执行多个and操作

e、 g.如果有10个元素,在得到最终答案之前,我需要执行以下操作

var_and= A1 && A2;
var_and=var_and && A3;..
.
.
var_and=var_and && A10;
这就是汇编代码的样子(?)


有没有更好的解决办法

首先要指出的是,“效率最高”的人是旁观者。你是说最快的?最小代码空间?最容易维护

如果你的编译器和硬件支持向量运算,我会说取集合的乘积,如果它等于零,你知道至少有一个元素是零

所以,也许我遗漏了一些东西——下面的内容似乎太简单了——但这是你想要的吗

bool has_a_zero(int *values, int n) {
  while (n--) {
    if (!*values++) return true;
  }
  return false;
}
如果这还不够快,您可以做一些技巧,比如展开循环,一次执行N个测试块(例如)。或者,如果您的值集具有带外值,则可以使用该值来终止循环,而不是操作额外的寄存器


但是,事实上,你需要进一步解释一下“最有效”是什么意思。

首先要指出的是,“最有效”在旁观者的眼中。你是说最快的?最小代码空间?最容易维护

如果你的编译器和硬件支持向量运算,我会说取集合的乘积,如果它等于零,你知道至少有一个元素是零

所以,也许我遗漏了一些东西——下面的内容似乎太简单了——但这是你想要的吗

bool has_a_zero(int *values, int n) {
  while (n--) {
    if (!*values++) return true;
  }
  return false;
}
如果这还不够快,您可以做一些技巧,比如展开循环,一次执行N个测试块(例如)。或者,如果您的值集具有带外值,则可以使用该值来终止循环,而不是操作额外的寄存器


但是,事实上,你需要更多地解释一下“最有效”是什么意思。

最有效的方法是最明确的

std::any_of(v.begin(),v.end(),[](int x) { return x==0; });
有些编译器甚至可以将其矢量化,因此很难进一步优化它

但这里最重要的是,您节省了可能浪费在计算汇编指令(这几乎毫无意义)和潜在代码读者的时间上的时间

完成整个程序后,您可以对其进行分析并确定瓶颈。在不太可能的情况下,这一行是其中之一,您必须弄清楚到底发生了什么-缓存未命中、IO、错误的分支预测-并修复该特定问题

另一个关闭选项是

std::find(v.begin(),v.end(),0)!=v.end(); 

最有效的方法是最明确地

std::any_of(v.begin(),v.end(),[](int x) { return x==0; });
有些编译器甚至可以将其矢量化,因此很难进一步优化它

但这里最重要的是,您节省了可能浪费在计算汇编指令(这几乎毫无意义)和潜在代码读者的时间上的时间

完成整个程序后,您可以对其进行分析并确定瓶颈。在不太可能的情况下,这一行是其中之一,您必须弄清楚到底发生了什么-缓存未命中、IO、错误的分支预测-并修复该特定问题

另一个关闭选项是

std::find(v.begin(),v.end(),0)!=v.end(); 


谁负责提出这些价值观?也许在那里使用一个标志并跳过检查部分?有一个零计数器。在集合中添加/删除/变异数字的例程需要更新零计数器。这不是答案,但您确定您没有过早优化或优化代码中不正确的部分吗bottleneck@lax不可避免地总会有最后一个元素use
std::any\u of
。谁负责输入值?也许在那里使用一个标志并跳过检查部分?有一个零计数器。在集合中添加/删除/变异数字的例程需要更新零计数器。这不是答案,但您确定您没有过早优化或优化代码中不正确的部分吗bottleneck@lax不可避免地总会有最后一个元素使用
std::any_of
。我所说的高效是指用更少的机器指令。指令越少不一定意味着速度越快?指令总数越少?还是最少的死刑?如果是后者,在一般情况下还是最坏情况下?考虑到在第一个零点发现停止对最坏的情况没有帮助,但可能产生更多的代码。展开循环通常更快,但产生的指令总数更多。所谓高效,我指的是在机器指令数量较少的情况下最快。指令数量较少并不一定意味着更快?指令总数最少?还是最少的死刑?如果是后者,在一般情况下还是最坏情况下?考虑到在第一个零点发现停止对最坏的情况没有帮助,但可能产生更多的代码。展开循环通常更快,但生成的指令总数更多。我没有像你这样现代化的编译器——你能分析一下你的答案与中给出的答案并发布结果吗?我已经准备好给大家留下深刻印象了…@fearless\u fool幸好我们有编译器:)正如你所见,MSVC(CL 19)产生了几乎相同的代码,其他人(GCC、Clang、ICC)设法用
std::进行了一些循环展开,
的任何一个都可能有所帮助,这取决于具体情况。我的本地测量结果显示,在计时方面几乎没有差异,我想这也是我的观点:d godbolt.org网站是一个很棒的工具:在这种情况下,你的any_of()方法在内部循环中发出5条指令,“老式纯C”代码发出7条指令。想想我的印象吧,谢谢你的启迪!老实说,没有一个编译器对它进行了矢量化(我在看你),所以有