c - 使用sizeof、strlen等进行重复计算

标签 c compiler-optimization

假设我有一个大数组,并且我正在执行如下操作:

for (int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i)
    printf("arr[%d]=%d\n", i, arr[i]);

当然,sizeof 的东西不应该每次都计算,所以它应该像这样:

size_t len = sizeof(arr)/sizeof(arr[0]);
for (int i = 0; i < len; ++i)
    printf("arr[%d]=%d\n", i, arr[i]);

我的问题是是否可以假设任何编译器都会自动执行上述优化,因此我使用哪种方法并不重要?或者我应该假设情况并非如此,第二种方法是唯一正确的方法。

最佳答案

没有理由将除法提升到循环条件之外。这甚至不是除法被评估多少次的问题(这是这些情况下通常关心的问题,并且可能需要编译器使用“转义分析”来确定长度值是否可以在迭代之间改变)。简单的事实是 sizeof(arr)/sizeof(arr[0]) 是一个常量表达式,将在编译时计算,并且与在那里硬编码一个数字没有什么不同.

关于c - 使用sizeof、strlen等进行重复计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65976323/

相关文章:

c - MPI 中的属性缓存

c++ - 为什么编译器可以比普通函数更好地优化 lambda?

objective-c - 如何优化对于给定运行始终返回相同值的函数的声明?

c++ - 优化长时间的内存读写

c - 如何获得UDP校验和?

字符串串联和空字符(\0)需要解释

C:程序在完成 for 循环之前崩溃

C:我无法让这个示例税收计划发挥作用

java - Eclipse 的 java 编译器的参数

java - Java中 "if"条件的奇怪优化