原始数据类型的大小

Alo*_*ave 11 c c++ sizeof

原始数据类型的大小究竟int取决于什么?

  • 编译器
  • 处理器
  • 发展环境

或者它是这些或其他因素的组合?
对其原因的解释将非常有帮助.

编辑:对不起混淆..我想询问关于原始数据类型如int而不是关于POD,我确实理解POD可以包括结构和结构它是一个完全不同的球游戏与填充进入图片.我已经更正了Q,这里的编辑说明应该确保关于POD的答案看起来不相关.

Ale*_*x B 8

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

  1. 允许原始类型的大小.
    由C和C++标准规定:类型允许它们必须具有的最小值范围,其隐含地以位为单位设置其大小的下限(例如,long必须至少32位以符合标准).
    标准没有指定字节大小,因为字节的定义取决于实现,例如char是字节,但字节大小(CHAR_BIT宏)可能是16位.

  2. 实现定义的实际大小.
    正如其他答案已经指出的那样,这取决于实现:编译器.反过来,编译器实现受目标体系结构的严重影响.因此,有两个编译器在相同的操作系统和体系结构上运行,但具有不同的大小,这似乎是合理的int.您可以做的唯一假设是标准规定的假设(假设编译器实现它).
    还可能存在额外的ABI要求(例如,固定的枚举大小).


Naw*_*waz 6

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

编译器也提供options.其中很少可能影响尺寸!


编辑:标准说什么,


的大小char,signed char并且unsigned char是由C++标准本身定义!所有其他类型的大小由编译器定义.

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)

C99标准($ 6.5.3.4)本身也定义了大小char,signed char并且unsigned char为1,但是留下了编译器定义的其他类型的大小!


编辑:

我发现这个C++ FAQ章节非常好.整章.这是一个非常小的篇章.:-)

http://www.parashift.com/c++-faq-lite/intrinsic-types.html


另外阅读下面的评论,有一些很好的论点!

  • 严格来说,它只取决于编译器.CPU只会影响哪种布局效率更高,但编译器原则上可以做任何喜欢的事情.它不必遵守CPU的对齐要求,寄存器大小或其他任何内容,只要它生成有效的代码即可. (6认同)
  • @jalf:虽然有些架构在数据对齐方面确实是不可原谅的(例如IA64). (2认同)
  • @jalf:由于编译器是建立在底层架构之上的,所以你不能说它不会影响它的选择!这只是表达的问题,如果你说它只依赖于编译器,那只是意味着如果编译器需要它然后它可以实现sizeof(int)= 128.但它没有,因为它尊重架构!事实上,如果想要发出有效的代码,它必须尊重架构! (2认同)
  • @jalf:我确定主题入门者不想知道现实世界中不存在的东西.我所说的就是,在编程的现实世界中,底层架构确实会对编译器的选择产生影响,就像你的银行平衡会影响你在超市购买的东西一样.:-) (2认同)