数据类型的大小依赖于硬件体系结构还是依赖于编译器?
我想知道决定数据类型大小的真正影响因素是什么?
发布于 2009-11-06 12:26:39
编译器(更确切地说是“实现”)可以自由选择大小,但要遵守C标准中的限制(例如int必须至少为16位)。编译器可以选择遵守其他标准,比如POSIX,这可以添加更多的约束。例如,我认为POSIX说所有的数据指针都是相同的大小,而C标准完全适用于sizeof(int*) != sizeof(char*)
。
在实践中,编译器-编写者的决策强烈地受到体系结构的影响,因为除非有强有力的理由,否则他们希望实现是有效的和可互操作的。处理器制造商或OS供应商通常发布一种称为“ABI”的东西,它告诉您(在其他事情中)类型有多大以及它们是如何存储在内存中的。编译器的体系结构永远不会遵循标准ABI,而且CPU通常有多个公共ABI,但是要从一个编译器的代码直接调用到另一个编译器的代码,两个编译器必须使用相同的ABI。因此,如果您的C编译器不使用Windows上的Windows ABI,那么您将需要额外的包装器来调用Windows dll。如果您的编译器支持多个平台,那么它很可能在不同的平台上使用不同的ABI。
您经常会看到缩写用来表示使用了几个ABI中的哪一个。例如,当64位平台上的编译器说它是LP64时,这意味着long
和指针是64位的,省略的是int
是32位的。如果显示为ILP64,则意味着int
也是64位的。
最后,这更像是一个编译器-编写者从一个合理的选项菜单中进行选择的情况,而不是随意地从空中挑选数字。但是实现总是可以自由地做它喜欢做的任何事情。如果您想要为x86编写一个编译器来模拟具有9位字节和3字节字的机器,那么C标准允许这样做。但就操作系统而言,你只能靠自己了。
发布于 2009-11-06 10:27:30
大小最终由编译器决定。例如,Java有一组固定的大小(8,16,32,64),而C为其各种类型提供的大小集在一定程度上取决于它运行的硬件;即编译器做出选择,但(除了像Java这样数据类型明确独立于底层硬件的情况外)受到硬件提供的强烈影响。
发布于 2009-11-06 10:31:55
不同数据类型的大小是编译器的,它的配置依赖于(不同的编译器,或者不同的开关到同一个编译器,在某些机器上可以有不同的大小)。
通常编译器与安装它的硬件相匹配...所以你可以说类型的大小也依赖于硬件。让编译器在48位的机器上发出16位指针会适得其反。
但是可以使用计算机上的编译器来创建一个程序,该程序将在具有不同大小的不同计算机上运行。
https://stackoverflow.com/questions/1686655
复制