ZHCUAQ1F july 2015 – april 2023
--no_bad_aliases 选项通知编译器可以对如何在代码中使用别名做出某些假设。这些假设允许编译器改进优化。--no_bad_aliases 选项还指定循环不变计数器的增量和减量是非零值。循环不变是指表达式的值在循环内不会改变。
不要 将 --aliased_variables 选项与 --no_bad_aliases 选项一起使用。如果这样做,--no_bad_aliases 选项会覆盖 --aliased_variables 选项。
{
long l;
char *p = (char *) &l;
p[2] = 5;
}
g(int j)
{
int a[20];
f(&a, &a) /* Bad */
f(&a+42, &a+j) /* Also Bad */
}
f(int *ptr1, int *ptr2)
{
...
}
static int ary[20][20];
int g()
{
return f(5, -4); /* -4 is a negative index */
return f(0, 96); /* 96 exceeds 20 as an index */
return f(4, 16); /* This one is OK */
}
int f(int I, int j)
{
return ary[i][j];
}
在此示例中,ary[5][-4]、ary[0][96] 和 ary[4][16] 访问相同的内存位置。 --no_bad_aliases 选项只接受引用 ary[4][16] -,因为它的两个索引都在边界 (0..19) 内。
如果代码不 包含上述任何别名技术,那么应该使用 --no_bad_aliases 选项来提升代码的优化水平。但是,必须谨慎使用 --no_bad_aliases 选项;如果代码中出现了这些别名技术并且使用了 --no_bad_aliases 选项,则可能会出现意想不到的结果。