我一直在阅读优化C++ wikibook.在更快的操作章节中,其中一条建议如下:
整数除以常数
将整数(已知为正或零)除以常量时,将整数转换为无符号.
如果s是有符号整数,则u是无符号整数,C是常数整数表达式(正或负),操作s/C比u/C慢,s%C慢于u%C.当C是2的幂时,最重要的是,但在所有情况下,在分割期间必须考虑符号.
然而,从有符号到无符号的转换是免费的,因为它只是对相同位的重新解释.因此,如果s是有符号整数,您知道它是正数或零,则可以使用以下(等效)表达式加速其除法:(无符号)s/C和(无符号)s%C.
我用gcc测试了这个语句,u / C
表达式似乎始终优于s / c
下面还提供了以下示例:
#include <iostream>
#include <chrono>
#include <cstdlib>
#include <vector>
#include <numeric>
using namespace std;
int main(int argc, char *argv[])
{
constexpr int vsize = 1e6;
std::vector<int> x(vsize);
std::iota(std::begin(x), std::end(x), 0); //0 is the starting number
constexpr int a = 5;
auto start_signed = std::chrono::system_clock::now();
int sum_signed = 0;
for ([[gnu::unused]] auto i : x)
{
// signed is by default
int v …
Run Code Online (Sandbox Code Playgroud)