【问题标题】:Linux Data Model and primitive types sizeLinux 数据模型和原始类型大小
【发布时间】: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


【解决方案1】:

编译器针对特定目标进行编译。一些编译器只有一个目标或一组非常有限的目标。既然您要求 gcc 作为示例,那么查看他们的文档会发现他们的 Machine DescriptionsTarget Files 格式。

Their documentation mentions

默认情况下,GCC 为您使用的同一类型的机器编译代码。但是,它也可以作为交叉编译器安装

所以请务必检查gcc -vgcc -dumpmachine 的输出以查看默认目标是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 2014-04-26
    • 1970-01-01
    • 2021-05-10
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-29
    相关资源
    最近更新 更多