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

C 实现是否可以将提示视为实际语句?

C 实现是否可以将提示视为实际语句?,c,embedded,language-lawyer,C,Embedded,Language Lawyer,在C语言中,寄存器存储限定符是对实现的一种提示,即应尽可能快地访问此类标识符(例如,存储在CPU寄存器中) §6.7.1 带有存储类说明符寄存器的对象标识符声明表明,对该对象的访问应尽可能快。这些建议的有效程度由执行情况确定 及 §6.7.3限制限定符(如寄存器存储)的预期用途 类)是为了促进优化[…] 然而,我听说过一些实现(特别是在嵌入式系统中),其中register具有更强烈的含义:它是一个命令,编译器应将限定标识符放在寄存器中 那么,是否允许实现遵循该行为并因此被视为符合标准?什么允许这

在C语言中,
寄存器
存储限定符是对实现的一种提示,即应尽可能快地访问此类标识符(例如,存储在CPU寄存器中)

§6.7.1 带有存储类说明符寄存器的对象标识符声明表明,对该对象的访问应尽可能快。这些建议的有效程度由执行情况确定

§6.7.3限制限定符(如寄存器存储)的预期用途 类)是为了促进优化[…]

然而,我听说过一些实现(特别是在嵌入式系统中),其中
register
具有更强烈的含义:它是一个命令,编译器应将限定标识符放在寄存器中

那么,是否允许实现遵循该行为并因此被视为符合标准?什么允许这样做


我之所以提出这个问题,是因为我发现,按照标准的规定,有义务将该对象放入寄存器不再是建议;换句话说,它们是冲突的。

只要不妨碍格式良好的程序编译或以任何方式影响标准中规定的观察行为,就允许这样做


该标准已经禁止使用
寄存器
说明符声明对象的地址或对齐方式,因此该部分不会成为问题。更棘手的情况是,如果使用
register
声明的对象比可用寄存器多。除非实现仍然允许溢出
register
对象(临时将值从寄存器移动到堆栈和返回),那么,在这种情况下,实现将无法编译符合标准的程序。

只要它不会阻止格式良好的程序编译或以任何方式影响标准中规定的观察行为,就可以编译


该标准已经禁止使用
寄存器
说明符声明对象的地址或对齐方式,因此该部分不会成为问题。更棘手的情况是,如果使用
register
声明的对象比可用寄存器多。除非实现仍然允许溢出
寄存器
对象(临时将值从寄存器移到堆栈,然后再移回来),否则这将是一种实现无法编译符合标准的程序的情况。

正如标准所说“此类建议的有效程度取决于实施情况。”

这使得实现可以自由地做任何事情,从忽略建议到移动天堂和地球来实现它。选择接受
寄存器
说明符作为要求使用寄存器的实现肯定不会与标准相矛盾,也不是一个只做自己决定的实现不考虑说明符的寄存器放置


实现不应该做的一件事是拒绝编译程序,因为它需要溢出
寄存器
——至少达到§5.2.4.1翻译限制中规定的限制——但没有任何东西可以阻止编译器发出警告。(没有什么可以阻止编译器发出任何警告;编译器通常会对被认为是危险的完全合法的构造发出警告。)

编辑:重读5.2.4.1,在我看来,一个实现实际上可能会拒绝编译一个它认为有太多
寄存器
说明符的程序,因为limits子句只约束实现能够翻译和执行“一个程序”,其中包括(例如)”511在一个块中声明块作用域的标识符,而不是任何这样做的程序。就我所见,编译器可以坚持认为达到该限制的“至少一个程序”没有任何
寄存器
规范


注意:并非所有CPU都有通用意义上的寄存器,但该标准实际上并没有说明任何关于硬件的内容。它只是说
寄存器
说明符传达了程序员希望“尽可能快地访问对象”的愿望“。此外,编译器试图满足这一愿望实际上并不一定要优化对对象的访问;这并不违反优化尝试失败的标准。

正如您所说,该标准说“这些建议的有效程度由实现定义。”

这使得实现可以自由地做任何事情,从忽略建议到移动天堂和地球来实现它。选择接受
寄存器
说明符作为要求使用寄存器的实现肯定不会与标准相矛盾,也不是一个只做自己决定的实现不考虑说明符的寄存器放置


实现不应该做的一件事是拒绝编译程序,因为它需要溢出
寄存器
——至少达到§5.2.4.1翻译限制中规定的限制——但没有任何东西可以阻止编译器发出警告。(没有什么可以阻止编译器发出任何警告;编译器通常会对被认为是危险的完全合法的构造发出警告。)

编辑:重读5.2.4.1,在我看来,一个实现实际上可能会拒绝编译一个它认为有太多
寄存器
说明符的程序,因为limits子句只约束实现能够翻译和执行“一个程序”