如何编写符合ISO-C的代码,同时允许序列点之间有多条指令?

如何编写符合ISO-C的代码,同时允许序列点之间有多条指令?,c,optimization,portability,C,Optimization,Portability,我有一个微妙的问题;我希望编写可移植的代码(这就是为什么我坚持最后三个ISO-C标准定义中的任何一个)和机器独立的代码(因此,汇编程序是不可能的),但允许编译器在一个CPU周期内打包多个(独立的)指令 我原以为使用逗号运算符就可以了,但标准上说每个彗差都是一个序列点,所以它不行 我想利用多个独立赋值、加法等(就像寄存器变量向编译器指示可能的优化和操作的独立性一样) 有人知道吗?让编译器进行优化。 当编译器认识到序列点是独立的且没有交互时,它可以跨序列点进行优化 例如,在代码中: a = x+y;

我有一个微妙的问题;我希望编写可移植的代码(这就是为什么我坚持最后三个ISO-C标准定义中的任何一个)和机器独立的代码(因此,汇编程序是不可能的),但允许编译器在一个CPU周期内打包多个(独立的)指令

我原以为使用逗号运算符就可以了,但标准上说每个彗差都是一个序列点,所以它不行

我想利用多个独立赋值、加法等(就像寄存器变量向编译器指示可能的优化和操作的独立性一样)


有人知道吗?

让编译器进行优化。

当编译器认识到序列点是独立的且没有交互时,它可以跨序列点进行优化

例如,在代码中:

a = x+y;
b = y+z;
编译器可以识别出
A
b
的赋值是完全独立的,并且可以同时完成这两个赋值,尽管序列点不同

一般来说,您的工作不能比编译器做得更好

让编译器完成其创建快速、高效代码的工作,您应该专注于您的工作:
为无缺陷算法编写清晰、明确的指令

让编译器进行优化。

当编译器认识到序列点是独立的且没有交互时,它可以跨序列点进行优化

例如,在代码中:

a = x+y;
b = y+z;
编译器可以识别出
A
b
的赋值是完全独立的,并且可以同时完成这两个赋值,尽管序列点不同

一般来说,您的工作不能比编译器做得更好

让编译器完成其创建快速、高效代码的工作,您应该专注于自己的工作:
为无缺陷算法编写清晰、明确的指令

编译器生成代码。处理器执行它。每个周期由处理器执行一条以上的指令,而现代处理器在这方面非常擅长。如果操作是独立的,处理器将解决它


处理器还将重新排列指令,并经常执行源代码中不在一起的多个指令。在源代码方面,您无法提供任何帮助

编译器生成代码。处理器执行它。每个周期由处理器执行一条以上的指令,而现代处理器在这方面非常擅长。如果操作是独立的,处理器将解决它


处理器还将重新排列指令,并经常执行源代码中不在一起的多个指令。在源代码方面,您无法提供任何帮助

正如其他回答者所指出的,你的问题被严重误导了。(编译器通常会对事情进行重新排序,甚至在事情被序列点分隔的情况下,也会做各种可怕的事情;相反,做两件可能相互“干扰”但没有被序列点分隔的事情是未定义的行为。)然而,你可以用一种有点愚蠢的方式来做你想做的事情

函数调用的不同参数的求值不按顺序排列,因此可以组成如下的伪函数:

void dont_sequence(int, int) {}
dont_sequence(i += 2, j += 4);
然后像这样使用它:

void dont_sequence(int, int) {}
dont_sequence(i += 2, j += 4);

再说一次,我不相信这有任何目的。这对我使用过的任何编译器都没有帮助。编译器不必遵循您的指令;它只需要生成行为类似于遵循您的指令的代码,现代编译器就是这样做的。

正如其他回答者所指出的,您的问题被严重误导了。(编译器通常会对事情进行重新排序,甚至在事情被序列点分隔的情况下,也会做各种可怕的事情;相反,做两件可能相互“干扰”但没有被序列点分隔的事情是未定义的行为。)然而,你可以用一种有点愚蠢的方式来做你想做的事情

函数调用的不同参数的求值不按顺序排列,因此可以组成如下的伪函数:

void dont_sequence(int, int) {}
dont_sequence(i += 2, j += 4);
然后像这样使用它:

void dont_sequence(int, int) {}
dont_sequence(i += 2, j += 4);

再说一次,我不相信这有任何目的。这对我使用过的任何编译器都没有帮助。编译器不必遵循您的指令;它只需要生成行为类似于遵循您的指令的代码,现代编译器就是这样做的。

TL;DR没有这样的把戏。选择不同的语言

1.C语言设计为可移植且独立于机器,但没有明确表示数据流独立性的语言结构或编译器在针对不同并行粒度的处理器时可能使用的其他提示(例如,有关此类结构的讨论,请参阅文章)

2.计算机科学家Donald Knuth将抽象的独立于机器的编译器目标(反映当前的处理器架构)描述为。还有一个GCC编译器可以针对这个处理器。因此,您可以根据此输出检查C代码

3.有关编译器和处理器如何获得其提示(您称之为序列点)的更多详细说明,请参阅例如本书

3.有关明确支持并行的可移植和独立于机器的语言列表,请参见例如


4.有关如何使用C进行并行编程的一些讨论,请参见例如TL;DR没有这样的把戏。选择不同的语言

1.C局域网