机器的实际价值-“;“细节”;在C中

机器的实际价值-“;“细节”;在C中,c,C,我一直在读这本书,因为所有人都声称,由于C++11,这种语言变得多么有用。这本书可能还可以,但它仍然让我每隔几页就想知道代码到底做了什么。一个结果,我最终只会得到一些东西,这些东西是“特定于机器的”或“实现定义的”,等等 我意识到这意味着什么,以及可移植代码的重要性 但我确实想知道,“普通”64位x86 PC的这些细节的实际值是多少?由于GCC、visualstudio等实际上并不询问在所有这些情况下应该做什么,而只是编译代码(它可以工作!),因此似乎有一些针对桌面的合理默认设置 是否有文档介绍

我一直在读这本书,因为所有人都声称,由于C++11,这种语言变得多么有用。这本书可能还可以,但它仍然让我每隔几页就想知道代码到底做了什么。一个结果,我最终只会得到一些东西,这些东西是“特定于机器的”或“实现定义的”,等等

我意识到这意味着什么,以及可移植代码的重要性

但我确实想知道,“普通”64位x86 PC的这些细节的实际值是多少?由于GCC、visualstudio等实际上并不询问在所有这些情况下应该做什么,而只是编译代码(它可以工作!),因此似乎有一些针对桌面的合理默认设置


是否有文档介绍这些详细信息(以非编译器编写者可以理解的方式,如我链接到的页面)?

大多数Unix或Linux系统都可以登录并发出命令

找到极限


它会找到一些包含文件,列出编译器使用的值的“限制”。Linux内核代码中的许多限制文件都是特定于体系结构的,这是您特别感兴趣的

坦率地说,移植性很难达到100%。我已经编程30年了,除了100%可移植的简单程序外,我从未见过其他任何东西。鉴于个人电脑无处不在,我认为你不应该把便携性放在功能之上。因此,您找到的所有引用都是“实现定义的”

在一个完美的世界里,程序是可移植的。在现实世界中,操作系统制造商添加功能以与其他操作系统制造商甚至自己竞争(Win95、98、2000、XP、7、Vista)(Linux发行版也有不同)。因此,以我的经验来看,可移植性意味着一个你不愿意做的权衡:太慢、太庞大、太多的开发时间、太多的测试等等。如果你寻求可移植性,你需要问为什么,它值得吗。即使您决定这样做,您也会发现自己根据您的环境添加了编译时选项,最终可能会得到特定的、不可移植的整个文件

当我为Atmel MeGA16编写代码时,我不考虑是否要移植那个代码。在这种情况下,你不需要拥有无限的CPU周期和无限的内存来考虑便携式解决方案——我们试图把所有的果汁挤出一点微。 类似地,通常情况下,您需要在assembler中优化例程,以获得更多功能的CPU周期。(就像一个运行DFT的DSP——当你第一次发布它时,它在C中是可以的,但最终你需要将它减少到ASM,以获得一堆CPU周期,以便在明天早上你的老板希望你增加的23个功能。可移植性真糟糕。)


因此,是的,很多都是特定于实现的。在PC世界里,你有一点奢侈,但是如果你在编写与硬件接口的代码,你常常被迫创建不可移植的代码。我可以继续讲下去,但我有一个循环需要优化…

是的,我已经做了。然而,这只会导致更多的问题,因为它部分使用了编译器内部函数(参见第三个链接),并且没有解释对齐等内容。如果你想学习C,为什么要阅读“C++入门”?