【发布时间】:2011-10-21 18:17:06
【问题描述】:
我知道 C 和 C++ 标准保留了语言实现的许多方面,只是因为如果存在具有其他特征的架构,那么为它编写符合标准的编译器将非常困难或不可能。
我知道 40 年前,任何计算机都有自己独特的规格。但是,我不知道今天使用的任何架构:
CHAR_BIT != 8-
signed不是二进制补码(我听说 Java 对此有问题)。 - 浮点不符合 IEEE 754(编辑:我的意思是“不在 IEEE 754 二进制编码中”)。
我问的原因是,我经常向人们解释说,C++ 不强制要求任何其他低级方面(如固定大小的类型)是件好事†。这很好,因为与“其他语言”不同,它使您的代码在正确使用时可移植(编辑:因为它可以移植到更多架构而无需模拟机器的低级方面,例如符号+幅度架构上的二进制补码算法) .但是我很难自己指出任何具体的架构。
所以问题是:哪些架构具有上述特性?
†uint*_ts 是可选的。
【问题讨论】:
-
我认为你有它倒退。如果 C++ 强制要求对有符号整数使用二进制补码,那么它将使 C++ 代码更便携而不是更少。为什么 C++ 标准委员会不强制要求这样做是另一回事。尤其是,尽管你说,为非标准架构编写编译器并不是不可能,你总是可以模拟 8 位字符或二进制补码算法,即使你的平台没有直接支持。
-
@john:那么这将是不切实际的,因此不符合标准的编译器将生成比符合标准的更快的代码。而且我仍然看不到它如何使您的代码更具可移植性。
-
我确信标准如此的真正原因并不是因为它是一些理想的解决方案。但这是因为在编写标准时已经存在许多 C 和 C++ 编译器,标准委员会不想拒绝现有的编译器。
-
@john :我怀疑“让编译器编写者更容易”是创建 C++ 标准时的优先事项(如果是,他们会做得很糟糕,因为 C++ 是最难的之一要解析的语言,并且该语言的其他方面也不完全使编译器编写者变得容易)。不过,性能、广泛的平台支持和向后兼容性非常重要。如果将您提到的限制添加到标准中,所有这三个都会受到影响。
-
不是编译器而是硬件。 C++ 保留了一些未指定的内容以允许直接使用硬件功能。无论如何,您的手机应用程序都不会在大型机上运行,因此无论代码是否一致,都没有可移植性。
标签: c++ c architecture