谁决定了c ++中基本类型的大小,是操作系统还是编译器?

时间:2014-04-12 21:58:46

标签: c++ compiler-construction 64-bit

在有人说这是重复之前,我会阅读有关此主题的大部分问题,但他们似乎无法回答这个问题。

我知道c ++中基本类型的大小是实现定义的,所以理论中的编译器可以自由选择任何大小,只要它符合关于这些基本类型的标准规范:

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

sizeof(short)     * CHAR_BIT >= 16
sizeof(int)       * CHAR_BIT >= 16
sizeof(long)      * CHAR_BIT >= 32

我不明白的是,有人说窗户为64台机器选择LLP64数据模型,而Unix选择LP64(早期版本为ILP64)64 -machines。

这是否意味着每个处理windows / unix的本机编译器都应该坚持使用这个数据模型?如果答案是肯定的,这个限制的原因是什么,它是否与OS API,ABI或其他东西有关?

更新

现在我知道了我的问题的答案,我将尝试解释这里的答案,以便任何与我有同样问题的人都可以找到答案。

谁决定C ++中基本类型的大小,是OS还是编译器?

c ++中基本数据类型的大小是实现定义的,这意味着只要编译器作者不违反c ++标准规范,就可以决定这些数据类型的大小。每种数据类型必须涵盖的范围。

Windows选择LLP64数据模型是什么意思?这是否意味着我不能为windows-64配备不同数据模型的编译器?

  

请注意,编程模型是在每个编译器上做出的选择   基础,几个可以在同一个操作系统上共存。然而   通常选择编程模型作为OS API的主要模型   占主导地位。

Wikipedia: 64-bit data model

因此,您可以在Windows-64上使用与LLP64不同的数据模型编译器,但这将限制您使用Windows OS API,因为此API的实现是使用编译器编译的{ {1}}数据模型,您无法链接使用具有不同数据模型的编译器编译的目标文件。

0 个答案:

没有答案