在有人说这是重复之前,我会阅读有关此主题的大部分问题,但他们似乎无法回答这个问题。
我知道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的主要模型 占主导地位。
因此,您可以在Windows-64上使用与LLP64
不同的数据模型编译器,但这将限制您使用Windows OS API,因为此API的实现是使用编译器编译的{ {1}}数据模型,您无法链接使用具有不同数据模型的编译器编译的目标文件。