Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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_Low Level - Fatal编程技术网

C 在运行时,操作执行的优先级和顺序是否存在差异?

C 在运行时,操作执行的优先级和顺序是否存在差异?,c,low-level,C,Low Level,我想知道CPU在运行时是否以相同的顺序执行操作指令,是否遵守用于计算表达式值的优先规则。有几件事需要澄清。C源代码由编译器翻译成机器代码。C代码/指令和机器代码/指令之间从来没有1对1的关系 在编译代码时,唯一重要的是。只要保留程序的可观察行为,编译器就可以按任何顺序生成指令 此外,在硬件级别上,CPU有自己的机制来检测指令依赖性,并且自身可以无序或并行地执行指令,例如,单个内核有1个以上的和 因此,对于正确的C程序,程序的可观察行为将被保留。指令可以重新排序,部分代码可以完全跳过,甚至算法也可

我想知道CPU在运行时是否以相同的顺序执行操作指令,是否遵守用于计算表达式值的优先规则。

有几件事需要澄清。C源代码由编译器翻译成机器代码。C代码/指令和机器代码/指令之间从来没有1对1的关系

在编译代码时,唯一重要的是。只要保留程序的可观察行为,编译器就可以按任何顺序生成指令

此外,在硬件级别上,CPU有自己的机制来检测指令依赖性,并且自身可以无序或并行地执行指令,例如,单个内核有1个以上的和


因此,对于正确的C程序,程序的可观察行为将被保留。指令可以重新排序,部分代码可以完全跳过,甚至算法也可以完全改变。例如,现代编译器可以使用循环结构将递归函数转换为非递归函数。但是程序的可观察行为不会改变。

有几件事需要澄清。C源代码由编译器翻译成机器代码。C代码/指令和机器代码/指令之间从来没有1对1的关系

在编译代码时,唯一重要的是。只要保留程序的可观察行为,编译器就可以按任何顺序生成指令

此外,在硬件级别上,CPU有自己的机制来检测指令依赖性,并且自身可以无序或并行地执行指令,例如,单个内核有1个以上的和



因此,对于正确的C程序,程序的可观察行为将被保留。指令可以重新排序,部分代码可以完全跳过,甚至算法也可以完全改变。例如,现代编译器可以使用循环结构将递归函数转换为非递归函数。但是程序的可观察行为不会改变。

CPU没有这个概念——它是一种语言结构。CPU连续执行指令。@WeatherVane这是否意味着优先级规则可能会因机器、编译器实现和优化设置的不同而被打破?CPU的操作和编译器为其准备指令的方式有很大的不同。CPU不关心是哪种语言编写了代码。有趣的是,如果重要的话,编译器将确保机器代码遵循优先规则。@klutt没有人天生伟大:d CPU没有这个概念-它是一种语言构造。CPU连续执行指令。@WeatherVane这是否意味着优先级规则可能会因机器、编译器实现和优化设置的不同而被打破?CPU的操作和编译器为其准备指令的方式有很大的不同。CPU不关心是哪种语言编写了代码。如果编译器有问题,编译器会确保机器代码遵循优先规则。@ KLUTT没有人天生就好:评价顺序与操作符优先级无关,给编译器更多的自由。C++没有这个问题,没有C++的标签。执行指令顺序混乱…在保留串行执行的假象/外观的同时(至少对于单个线程),硬件版本的“仿佛”规则。通常这是不言而喻的,但在这里也许值得一提。请参阅答案中的链接,特别是关于OoO超标量执行基础的链接。这在实践中永远不会发生,但原则上,编译器可以自由地将冒泡排序更改为快速排序,前提是它可以保证可观察到的行为是等效的。@klutt:其他类型的模式识别确实会发生。clang识别sumi=0..n循环,并使用乘法将其编译为高斯闭合形式。有些编译器还能够识别位计数循环,编译成POCPNT指令,或者X>>N×X,也可以使评价顺序与操作符优先无关,给编译器带来更多自由。C++与C++无关,而不按顺序执行指令。在保留串行执行的假象/外观的同时(至少对于单个线程),硬件版本的“仿佛”规则。通常这是不言而喻的,但在这里也许值得一提。请参阅答案中的链接,特别是关于OoO超标量执行基础的链接。这在实践中永远不会发生,但原则上,编译器可以自由地将冒泡排序更改为快速排序,前提是它可以保证可观察到的行为是等效的。@klutt:其他类型的模式识别确实会发生。叮当声 sumi=0..n循环并使用乘法将其编译为高斯闭合形式。一些编译器还能够识别位计数循环并编译为popcnt指令,或x>>n|x