Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 比较有符号整数比无符号整数更快_C++_C_Performance_Gcc - Fatal编程技术网

C++ 比较有符号整数比无符号整数更快

C++ 比较有符号整数比无符号整数更快,c++,c,performance,gcc,C++,C,Performance,Gcc,可能重复: 我在某个地方读到,在x86_64上比较C/C++中的有符号整数比无符号整数要快一点,例如,for(int I…)比for(uint I…) 这是真的吗?为什么是这样?我知道差异非常小,但无论如何。可能在某些情况下,有符号整数迫使编译器对它们进行符号扩展。 如果将整数移动到eax,则rax的高位设置为零(低位为eax)。如果是整数,则需要将高32位设置为低32位的符号。这是一个额外的指示 我不确定在(I=0;I的简单中是否需要此符号扩展。可能在某些情况下,有符号整数迫使编译器对其进行

可能重复:

我在某个地方读到,在
x86_64
上比较
C/C++
中的
有符号整数
无符号整数
要快一点,例如,
for(int I…
)比
for(uint I…)


这是真的吗?为什么是这样?我知道差异非常小,但无论如何。

可能在某些情况下,有符号整数迫使编译器对它们进行符号扩展。
如果将整数移动到
eax
,则
rax
的高位设置为零(低位为
eax
)。如果是整数,则需要将高32位设置为低32位的符号。这是一个额外的指示


我不确定在(I=0;I的简单
中是否需要此符号扩展。可能在某些情况下,有符号整数迫使编译器对其进行符号扩展。
如果将整数移动到
eax
,则
rax
的高位将设置为零(低位是
eax
的位)。如果是整数,则需要将高位32位设置为低位32位的符号。这是一条额外指令


我不确定在一个简单的
中是否需要这个符号扩展(i=0;i好吧,这里没有好的答案。速度差通常很小,你可以通过花时间思考其他事情来获得更好的性能。但也有一些奇怪的情况,因为符号溢出是未定义的。例如,比较这两种情况:

for (int i = 0; condition(); ++i) {
    if (i == 0) {
        computation();
    }
}

for (unsigned i = 0; condition(); ++i) {
    if (i == 0) {
        computation();
    }
}
一致性编译器可以将
计算
移动到使用有符号索引的循环之外,因为它可以假设
i==0
一次且仅一次——因为有符号溢出是未定义的行为(溢出可能终止程序,或缠绕,或使恶魔飞出你的鼻子)。但是,编译器无法将
计算
移出第二个循环,而不需要做更多的工作(无符号整数溢出时总是环绕)

但是,在x86_64上,在使用
int
之前,通常必须对其进行签名扩展。这需要额外的指令


结论:这并不重要。无论谁告诉你一个比另一个快,都会分散你的注意力,使你无法提高工作效率。

好吧,这里没有好的答案。速度的差异通常非常小,以至于你可以通过花时间思考其他事情来获得更好的表现。但是有一个问题e一些奇怪的情况,因为签名溢出未定义。例如,比较以下两种情况:

for (int i = 0; condition(); ++i) {
    if (i == 0) {
        computation();
    }
}

for (unsigned i = 0; condition(); ++i) {
    if (i == 0) {
        computation();
    }
}
一致性编译器可以将
计算
移动到使用有符号索引的循环之外,因为它可以假设
i==0
一次且仅一次——因为有符号溢出是未定义的行为(溢出可能终止程序,或缠绕,或使恶魔飞出你的鼻子)。但是,编译器无法将
计算
移出第二个循环,而不需要做更多的工作(无符号整数溢出时总是环绕)

但是,在x86_64上,在使用
int
之前,通常必须对其进行签名扩展。这需要额外的指令


结论:这其实并不重要。谁告诉你一个比另一个快,就会分散你的注意力,使你无法提高工作效率。

你最好为这样的说法引证一个来源,从表面上看,这是荒谬的

我们谈论的是x86_64,这意味着现代处理器。这些ALU将在一个时钟周期内完成整数加法、减法和/或比较(缓存未命中当然需要更长的时间,但只取决于数据的大小和内存布局,而不取决于符号大小)。使用SIMD协处理器,甚至更少

我更倾向于认为,这两种比较方式之间有轻微的功率差异,但速度差异并没有


现在,对于一个特定的编译器,在针对x86_64平台时,一种数据类型的代码生成可能比另一种更差。但这是一个非常特殊的情况,不可能适用于所有x86_64编译器。而且,我仍然怀疑缓存效应或后台进程会影响性能度量(即使是测量每个进程花费的时间的性能计数器也会受到使缓存无效的上下文切换的影响)。

您最好为这种说法引用一个来源,从表面上看这是荒谬的

我们谈论的是x86_64,这意味着现代处理器。这些ALU将在一个时钟周期内完成整数加法、减法和/或比较(缓存未命中当然需要更长的时间,但只取决于数据的大小和内存布局,而不取决于符号大小)。使用SIMD协处理器,甚至更少

我更倾向于认为,这两种比较方式之间有轻微的功率差异,但速度差异并没有


现在,对于一个特定的编译器,在针对x86_64平台时,一种数据类型的代码生成可能比另一种更差。但这是一个非常特殊的情况,不可能适用于所有x86_64编译器。而且,我仍然怀疑缓存效应或后台进程会影响性能度量(即使是测量每个进程所用时间的性能计数器也会受到使缓存无效的上下文切换的影响)。

测量

平台上的测量一直是回答这类问题的唯一方法(x86_64只是确定平台的起点,可能需要精确的模型)。如今,芯片上进行了优化(看看“超标量无序处理器具有推测性执行”意味着什么)编译器会产生这些差异(假设它们存在,我并不真正用于有符号/无符号比较,