知道循环将经历的迭代次数允许编译器进行一些优化。例如考虑下面的两个循环:
未知的迭代次数:
static void bitreverse(vbuf_desc * vbuf)
{
unsigned int idx = 0;
unsigned char * img = vbuf->usrptr;
while(idx < vbuf->bytesused) {
img[idx] = bitrev[img[idx]];
idx++;
}
}
已知迭代次数
static void bitreverse(vbuf_desc * vbuf)
{
unsigned int idx = 0;
unsigned char * img = vbuf->usrptr;
while(idx < 1280*400) {
img[idx] = bitrev[img[idx]];
idx++;
}
}
第二个版本将编译为更快的代码,因为它会被展开两次(在 ARM 上至少使用 gcc 4.6.3 和 -O2)。有没有办法对 gcc 在优化时考虑的循环计数进行断言?