为何编译器优化仅在main函数外的函数中生效?
关于C语言编译器优化在独立函数与main函数中表现差异的问题
我编写了如下C函数unsigned_short_mult_test,用于将两个unsigned short类型数值相乘,结果存入unsigned int类型变量,并打印结果的最高位是否被置位:
void unsigned_short_mult_test(unsigned short a, unsigned short b) { unsigned int x = a * b; if (x >= 0x80000000) printf("%u >= %u", x, 0x80000000); else printf("%u < %u", x, 0x80000000); }
测试时,我在main()中传入a和b的值均为65535:
int main() { unsigned short a = 65535; unsigned short b = 65535; unsigned_short_mult_test(a, b); return 0; }
开启编译器优化(-O1及以上)后,程序始终输出错误结果:4294836225 < 2147483648。
我理解这是因为编译器将a和b提升为int类型进行乘法运算,再将结果转为unsigned int存入x,优化时假设两个int的乘积不会超过int最大值,因此移除了if语句的真分支。但将相同代码放入main函数中时,该优化不会生效:
int main() { unsigned short a = 65535; unsigned short b = 65535; // The same code as unsigned_short_mult_test unsigned int x = a * b; if (x >= 0x80000000) printf("%u >= %u", x, 0x80000000); else printf("%u < %u", x, 0x80000000); return 0; }
此时程序输出正确结果:4294836225 >= 2147483648。
请问为何该编译器优化仅在独立函数中出现,而在main函数中不生效?
内容的提问来源于stack exchange,提问作者Mason Ticehurst
相关产品推荐
相关产品推荐

