【发布时间】:2018-03-17 07:53:19
【问题描述】:
我知道存在以下数据模型:
- 32 位 *nix : ILP32
- 32 位 Windows:ILP32
- 32 位 OS X:ILP32
- 64 位 *nix : LP64
- 64 位 Windows:LLP64
- 64 位 OSX:LP64
http://www.unix.org/whitepapers/64bit.html
64 位版本的 Linux 内核使用 LP64 数据模型 (http://www.unix.org/version2/whatsnew/lp64_wp.html)。
更新
C++03 标准 $5.3.3/1
sizeof(char)、sizeof(signed char)和sizeof(unsigned char)为1;这 sizeof 应用于任何其他基本类型(3.9.1)的结果是 实现定义。 [注意:特别是 sizeof(bool) 和 sizeof(wchar_t) 是实现定义的。69)
所以真正的问题是: 编译器(例如 gcc)是否考虑了操作系统(例如 linux)选择的数据模型?
【问题讨论】:
-
用于编译操作系统的编译器呢?
-
Ron,两种语言都没有定义原始类型的大小。这个问题是有效的,我知道这是两种不同的语言。这里的重点是在操作系统(选择的数据模型)和编译器之间。
-
@Ron:不! C 和 C++ 的标准都没有定义原始类型的大小! char、float 和 double 除外。
-
“LP64 gcc”是什么意思? x86 上的 gcc 可以针对 ARM 目标进行编译,因此编译器在哪里运行无关紧要,重要的是它如何生成代码(在这种情况下基于
-m32/-m64选项)。 -
@myaunt:好点子!改写并删除了令人困惑的示例。真正的问题可能是 gcc 如何选择原始类型的大小?是否计入数据模型?
标签: c++ linux linux-kernel primitive-types