C++ 在数组中循环时,是否有方法避免对每个循环进行比较?

C++ 在数组中循环时,是否有方法避免对每个循环进行比较?,c++,loops,for-loop,while-loop,iteration,C++,Loops,For Loop,While Loop,Iteration,假设一个循环总是通过某个序列一次迭代一个循环,我想知道是否有某种巧妙的循环结构或技巧,可以避免在每次迭代时检查数组的结尾 for (int i=0; i<length; i++) { //something } for(int i=0;i可以展开循环: int length = 20 ; int i=0; while (i+3<length) { //something i++; //something i++; //som

假设一个循环总是通过某个序列一次迭代一个循环,我想知道是否有某种巧妙的循环结构或技巧,可以避免在每次迭代时检查数组的结尾

for (int i=0; i<length; i++) { 
    //something 
}

for(int i=0;i可以展开循环:

int length = 20 ;
int i=0;
while (i+3<length) { 
    //something 
    i++;
    //something 
    i++;
    //something 
    i++;
    //something 
    i++;
}

//handle any remaining cases
while (i<length) { 
    //something 
    i++ ;
}
int-length=20;
int i=0;

当(i+3时,您可以展开循环:

int length = 20 ;
int i=0;
while (i+3<length) { 
    //something 
    i++;
    //something 
    i++;
    //something 
    i++;
    //something 
    i++;
}

//handle any remaining cases
while (i<length) { 
    //something 
    i++ ;
}
int-length=20;
int i=0;

当(i+3时,您可以展开循环:

int length = 20 ;
int i=0;
while (i+3<length) { 
    //something 
    i++;
    //something 
    i++;
    //something 
    i++;
    //something 
    i++;
}

//handle any remaining cases
while (i<length) { 
    //something 
    i++ ;
}
int-length=20;
int i=0;

当(i+3时,您可以展开循环:

int length = 20 ;
int i=0;
while (i+3<length) { 
    //something 
    i++;
    //something 
    i++;
    //something 
    i++;
    //something 
    i++;
}

//handle any remaining cases
while (i<length) { 
    //something 
    i++ ;
}
int-length=20;
int i=0;

当(i+3是时,您可以像这样展开循环:

int i;
for (i = 0; i < length - 3; i += 4) { // 4x unrolled loop
    //something(i)
    //something(i+1)
    //something(i+2)
    //something(i+3)
}
for ( ; i < length; i++) {           // clean up loop for residual 0..3 iterations
    //something(i)
}
inti;
对于(i=0;i
是的,您可以像这样展开循环:

int i;
for (i = 0; i < length - 3; i += 4) { // 4x unrolled loop
    //something(i)
    //something(i+1)
    //something(i+2)
    //something(i+3)
}
for ( ; i < length; i++) {           // clean up loop for residual 0..3 iterations
    //something(i)
}
inti;
对于(i=0;i
是的,您可以像这样展开循环:

int i;
for (i = 0; i < length - 3; i += 4) { // 4x unrolled loop
    //something(i)
    //something(i+1)
    //something(i+2)
    //something(i+3)
}
for ( ; i < length; i++) {           // clean up loop for residual 0..3 iterations
    //something(i)
}
inti;
对于(i=0;i
是的,您可以像这样展开循环:

int i;
for (i = 0; i < length - 3; i += 4) { // 4x unrolled loop
    //something(i)
    //something(i+1)
    //something(i+2)
    //something(i+3)
}
for ( ; i < length; i++) {           // clean up loop for residual 0..3 iterations
    //something(i)
}
inti;
对于(i=0;i
我想知道是否有一些巧妙的循环结构或技巧,可以避免对数组末尾的每次迭代进行检查

将i设置为长度,然后在循环的每次迭代中减小i

int i = length;
while ( i-- >= 0) {
  // do something
}
我想知道是否有一些巧妙的循环结构或技巧,可以避免对数组末尾的每次迭代进行检查

将i设置为长度,然后在循环的每次迭代中减小i

int i = length;
while ( i-- >= 0) {
  // do something
}
我想知道是否有一些巧妙的循环结构或技巧,可以避免对数组末尾的每次迭代进行检查

将i设置为长度,然后在循环的每次迭代中减小i

int i = length;
while ( i-- >= 0) {
  // do something
}
我想知道是否有一些巧妙的循环结构或技巧,可以避免对数组末尾的每次迭代进行检查

将i设置为长度,然后在循环的每次迭代中减小i

int i = length;
while ( i-- >= 0) {
  // do something
}

当然,它被调用,许多编译器为(;){/*something*/}
自动执行
,当然=DSure,它被调用,许多编译器为(;){/*something*/}
自动执行
,当然=DSure,它被调用,许多编译器为(;){/*something*/}自动执行
,当然=DSure,它被调用,许多编译器自动为(;;){/*something*/}
,当然=d你在这个问题的措辞中发现了一个漏洞,但不是出于它的精神,你是说对0的检查在某种程度上比对非零整数的检查在内部要快吗“避免对数组末尾的每次迭代进行检查。”您在问题的措辞中发现了一个漏洞,但不是出于它的精神。您是否说对0的检查在某种程度上比对非零整数的检查在内部更快?它做到了这一点“避免对数组末尾的每次迭代进行检查”。“你在这个问题的措辞中发现了一个漏洞,但不是在它的精神上。你是说对0的检查在某种程度上比对非零整数的检查在内部要快吗?它做到了这一点“避免了对数组末尾的每次迭代进行检查。”你在这个问题的措辞中发现了一个漏洞,但它的精神并非如此。你是说对0的检查在某种程度上比对非零整数的检查在内部要快?它做到了这一点“避免了对数组末尾的每次迭代进行检查。”手动展开循环将使编译器更难自己完成(可能更优化)展开,对吗?@sgarza62:如果你知道自己在做什么,那么手动展开有时比让编译器来做更有效,但这种事情通常是最后的手段,除非你确定循环是一个瓶颈,否则通常不应该手动完成。你还需要对展开的循环进行基准测试,并确保它是一个瓶颈ion比编译器的更好。手动展开循环将使编译器更难自己完成(可能更优化)展开,对吗?@sgarza62:如果你知道自己在做什么,那么手动展开有时比让编译器来做更有效,但这种事情通常是最后的手段,除非你确定循环是一个瓶颈,否则通常不应该手动完成。你还需要对展开的循环进行基准测试,并确保它是一个瓶颈ion比编译器的更好。手动展开循环将使编译器更难自己完成(可能更优化)展开,对吗?@sgarza62:如果你知道自己在做什么,那么手动展开有时比让编译器来做更有效,但这种事情通常是最后的手段,除非你确定循环是一个瓶颈,否则通常不应该手动完成。你还需要对展开的循环进行基准测试,并确保它是一个瓶颈ion比编译器的更好。手动展开循环会使编译器更难进行自己的(可能更优化)展开,对吗?@sgarza62:如果你知道自己在做什么,那么手动展开有时会更有效