【发布时间】:2013-06-27 10:57:13
【问题描述】:
在modulo function 和timespec normalization 中,内核代码通过循环计算模数,并阻止编译器将循环优化为模运算符。
为什么需要这样做?
我希望如果这种优化不好,编译器就不会那样做。除了,可能存在这种优化更快的架构。为什么所有架构都需要这段代码?
【问题讨论】:
标签: c assembly linux-kernel
在modulo function 和timespec normalization 中,内核代码通过循环计算模数,并阻止编译器将循环优化为模运算符。
为什么需要这样做?
我希望如果这种优化不好,编译器就不会那样做。除了,可能存在这种优化更快的架构。为什么所有架构都需要这段代码?
【问题讨论】:
标签: c assembly linux-kernel
如果程序员知道被除数只比除数大一点(因此迭代版本只会循环一次或两次),就会这样做。不能指望编译器解决这个问题。 div64.c 中的这条评论解释了这一点:
/*
* Iterative div/mod for use when dividend is not expected to be much
* bigger than divisor.
*/
您指向的模函数是iter_div_u64_rem(),在需要时显式使用;对于常规模数版本,有div_u64_rem()。
【讨论】:
% 运算符需要来自 C 运行时库的辅助函数,而内核中没有这些函数。