C++ >;=,的复杂性<;=vs<>;,==C/C+中的操作+;

C++ >;=,的复杂性<;=vs<>;,==C/C+中的操作+;,c++,c,c++14,C++,C,C++14,在算术运算中,加减运算的复杂度较低,而除法运算的复杂度较高。对于=操作,所有关系操作的复杂性相同还是不同 对于=操作,所有关系操作的复杂性相同还是不同 这些性能(对于内置的积分和浮点类型)不是由C++语言标准决定的,而是特定编译器实现的CPU指令发出,当然这是CPU所提供的限制。您可以研究您感兴趣的编译器(例如,g++-s program.cc将通过汇编生成program.s),然后研究您感兴趣的CPU型号及其性能。对于x86系列处理器,您可以很容易地在线找到指令计时列表(例如),-与大多数CP

在算术运算中,加减运算的复杂度较低,而除法运算的复杂度较高。对于=操作,所有关系操作的复杂性相同还是不同

对于=操作,所有关系操作的复杂性相同还是不同


这些性能(对于内置的积分和浮点类型)不是由C++语言标准决定的,而是特定编译器实现的CPU指令发出,当然这是CPU所提供的限制。您可以研究您感兴趣的编译器(例如,

g++-s program.cc
将通过汇编生成
program.s
),然后研究您感兴趣的CPU型号及其性能。对于x86系列处理器,您可以很容易地在线找到指令计时列表(例如),-与大多数CPU一样,所有比较操作往往需要一个CPU周期。有些更复杂的指令,如条件移动或跳转,可能在某些CPU模型上支持更有限的条件集,这是很有可能的,但对您来说,这不太可能是一个实际问题。

计算复杂性至少在理论和实践两个方面进行了讨论

在理论背景下,程序的输入是一个由n位组成的字符串,我们研究了一台理论计算机需要多长时间才能产生一个作为n的函数的答案。在这样的计算机中,比较两个二进制数字所需的时间是O(n),因为在找到差异之前,可能必须将两个数字的每个位进行比较,直到最后。无论操作是小于、小于或等于、大于、大于或等于、等于或不等于,这都是正确的。一旦您找到两个数字之间差异最大的位,您就可以立即确定这些顺序关系中的任何一个。寻找不同的最高有效位(或确定所有位都相同)需要不同的时间量,即O(n)

在实际环境中,计算机有固定大小的单词,我们关心的是,如果实际程序在这些固定大小的单词的范围内,它们需要多长时间。在当前常见的通用处理器中,比较两个标量数字(用一个字或更少的字表示的数字,例如64位整数或更窄的或64位浮点值)通常具有固定的延迟,通常为单个CPU周期,有时为几个周期。实际上,复杂度是O(1)。有时,对于正常情况,延迟可能是固定的,但对于特殊情况,如亚正常或NAN,则需要更长的时间。对于正在评估的关系,延迟通常没有差异。事实上,许多处理器都有一条通用比较指令,该指令返回所有排序信息,第二条信息用于根据顺序是小于、大于、等于还是无序(非排序)进行分支


如果编译器或库实现了任意大小的数字,例如多精度浮点或大整数,那么它的行为将更像理论问题:数字越多,比较所需的时间就越长。在数字的正常表示中,所有比较都具有相同的复杂性。然而,在一些特殊的表述中,比较可能会有所不同。例如,我们可以通过将其余数存储为选定除数的模来表示整数,而不是存储表示特定大小的位。比较两个这样的整数是否相等很容易(它们的余数都一样吗?),但比较它们的顺序可能很困难(哪一个更大是它们余数的复杂函数)。

什么复杂度?所有这些操作(包括除法)都可以作为一条CPU指令来实现。你是说“优先级”而不是“复杂度”吗?相关/重复:对于
int
double
等基本(内置)类型,通常可以预期它们的速度都是相同的。对于用户定义的类型,它将取决于它们是如何重载的。@斯拉瓦:他没有指定涉及的CPU,但他确实指定了C和C++,这至少限制了CPU。尽管我们都知道加法(例如)使用进位链,所以理论上它应该比按位运算慢,但在基本上所有合理的现代CPU上,加法和减法都是单周期运算。除此之外,这些操作符可以应用于类和结构,这意味着它们的性能并不总是可预测的。