C++ 基本数据类型的大小

C++ 基本数据类型的大小,c++,c,sizeof,C++,C,Sizeof,像int这样的基本数据类型的大小究竟取决于什么 编译程序 处理机 开发环境 还是这些因素或其他因素的组合? 解释一下同样的原因会很有帮助 编辑:很抱歉造成混淆。我的意思是询问诸如int之类的原始数据类型,而不是关于pod,我确实理解pod可以包括结构,而对于结构,这是一个完全不同的球类游戏,图片中有填充。 我已经更正了问题,这里的编辑说明应该确保关于POD的答案看起来不无关。首先,这取决于编译器。编译器通常依次依赖于体系结构、处理器、开发环境等,因为它考虑了它们。所以你可以说这是所有因素的结

int
这样的基本数据类型的大小究竟取决于什么

  • 编译程序
  • 处理机
  • 开发环境
还是这些因素或其他因素的组合?
解释一下同样的原因会很有帮助

编辑:很抱歉造成混淆。我的意思是询问诸如int之类的原始数据类型,而不是关于pod,我确实理解pod可以包括结构,而对于结构,这是一个完全不同的球类游戏,图片中有填充。
我已经更正了问题,这里的编辑说明应该确保关于POD的答案看起来不无关。

首先,这取决于编译器。编译器通常依次依赖于体系结构、处理器、开发环境等,因为它考虑了它们。所以你可以说这是所有因素的结合但我不会这么说。我会说,编译器,因为在同一台机器上,如果使用不同的编译器,可能会有不同大小的POD和内置类型。还要注意的是,源代码是编译器的输入,因此编译器决定POD和内置类型的大小。然而,这一决定也确实受到目标机器底层架构的影响。毕竟,真正有用的编译器必须发出有效的代码,最终在目标机器上运行

编译器也提供了
选项
。很少有人会影响尺寸


编辑:标准是怎么说的,

<>代码大小> char < />代码>代码>签名char < />代码>代码>未签名char <代码>是由C++标准本身定义的!所有其他类型的大小由编译器定义

C++03标准$5.3.3/1表示

sizeof(字符)、sizeof(签名字符)和 sizeof(无符号字符)为1;这个 应用于任何其他 基本类型(3.9.1)为 实现定义。[注:在 特别是sizeof(bool)和 sizeof(wchar\t)是 实施(第69段)

C99标准($6.5.3.4)本身也将
char
signed char
unsigned char
的大小定义为1,但将其他类型的大小留给编译器定义


编辑:

我发现这个C++ FAQ章节真的很好。整个章节。虽然篇章很小。-——< /P>



也请阅读下面的评论,这里有一些很好的参数!

这取决于实现(编译器)


表示未指定的行为,其中每个实现都记录了如何做出选择。

如果您询问诸如
int
之类的基本类型的大小,我会说这取决于您引用的因素

编译器/环境耦合(环境通常指操作系统)肯定是其中的一部分,因为编译器可以映射各种“敏感的”由于各种原因,内置类型的大小会以不同的方式变化:例如,x86_64 Windows上的编译器通常有32位
和64位
,以避免破坏普通x86的代码;相反,在x86_64 Linux上,
通常是64位,因为它更“自然”为Linux开发的选择和应用程序通常与体系结构无关(因为Linux运行在更多种类的体系结构上)

处理器在决策中肯定很重要:
int
应该是“自然大小”处理器的长度,通常是处理器通用寄存器的大小。这意味着它是在当前体系结构上工作更快的类型。
long
通常被认为是一种以性能换取扩展范围的类型(在普通PC上很少如此,但在微控制器上是正常的)


相反,如果你说的是
struct
s&co(如果他们遵守一些规则,那就是
POD
),编译器和处理器同样会影响它们的大小,因为它们由内置类型和编译器选择的适当填充组成,以在目标体系结构上实现最佳性能。

A
struct
也可以是POD,在这种情况下,您可以使用
pragma明确控制成员之间的潜在填充在一些编译器上打包。

我认为这个问题有两个部分:

  • 基本类型允许的大小。
    这是:类型允许其必须具有的最小值范围,这隐含地将其大小的下限设置为位(例如,
    long
    必须至少为32位才能符合标准)。
    标准没有以字节为单位指定大小,因为大小取决于实现,例如
    char
    是字节,但字节大小(
    char\u BIT
    宏)可能是16位

  • 由实现定义的实际大小。
    正如其他答案已经指出的那样,这取决于实现:编译器。而编译器实现反过来又受到目标体系结构的严重影响。因此,让两个编译器运行在相同的操作系统和体系结构上是合理的,但大小不同的
    int
    ke是标准中规定的(假定编译器实现了它)。
    还可能存在其他ABI要求(例如,固定大小的枚举)


  • 正如我在@Nawaz的回答中所评论的,它在技术上完全取决于编译器

    <>编译器只需要使用有效的C++代码,输出有效的机器代码(或它所用的任何语言)。 <> P> > C++编译器可以决定使<代码> INT/COD>有15的大小,要求它在5字节边界上对齐,并且可以决定在POD中的变量之间插入任意填充。标准中没有任何禁止,它仍然可以生成工作代码。 <