我宁愿使用多个32位循环计数器,而不是使用一个64位long
类型变量作为循环计数器。我需要比32位更长的循环,而在我的情况下使用64位速度更慢。
任何想法如何实现这一点,简单?
答案 0 :(得分:1)
如果您想要的循环计数c
可以分为两个因子,它们都适合32位整数,那么下面将使用32位计数器循环m * n = c
次迭代。如果c
是一个素数,例如,这将不起作用。
uint32_t m, n; // initialize according to your needs
for(uint32_t i = 0; i < m; ++i) {
for(uint32_t j = 0; j < n; ++j) {
}
}
这是一个更精细的解决方案,应该适用于任何循环计数。您也不需要手动分解数字。但要注意,如果你的循环计数不是编译时间常数,那么32位计数器获得的任何时间肯定会丢失到64位分区。如果您不相信您的编译器会将n
和r
替换为常量值,那么请手动进行计算。
const uint64_t c = 12000000000ull;
const uint32_t m = std::numeric_limits<uint32_t>::max();
const uint32_t n = c / m;
const uint32_t r = c % m;
for(std::uint32_t i = 0; i < n; ++i) {
for(std::uint32_t j = 0; j < m; ++j) {
do_stuff();
}
}
for(std::uint32_t i = 0; i < r; ++i) {
do_stuff();
}