在 java 中,默认包含 java.lang.* [这有原语吗] 它包含 Boolean,Integer,... 包装器,以便编译器在我们说 Integer i 时可以理解我们的定义。
原始数据类型怎么样?
它是怎么知道的?
它是在哪里定义的?
编译器如何知道要分配多少内存?
int x;
double d;
它怎么知道 int 是 4 [2 bytes] , double 是 8 bytes?
sizeof 相应地给出大小。它像编译器可用的元数据吗?
在 C 和 C++ 中,这些原语就是:原语。它们是在编译器本身中定义的(好吧,在“便携式”编译器中,编译器具有针对不同体系结构的编译选项,人们怀疑有多个文件定义了这些类型)。C 标准(同样适用于 C++)为这些类型定义了一些最小大小,但实际大小取决于编译器。
很可能,这些类型并没有那么特别,只是初始化期间的一些代码设置了类型并定义了这些类型的大小、对齐要求和其他基本标准。当然,如何在这些类型上生成代码来访问和执行所需的内置运算符。
是的,sizeof()
通过在编译期间使用有关类型的数据来解决。对于复合类型(struct
、class
和union
数组),编译器还将考虑大小对齐。
除了@Mats Petersson 的回答:
How does the compiler know how much memory to be alloted?
要分配的内存取决于平台。每个基本类型的大小都有一个保证的最小范围。内存量至少是那个大小。
例如,无符号字符的范围为 0 到 255,即 8 位。编译器必须至少分配 8 位;但它可以分配 12、16 或 32。
一般来说,anunsigned int
的大小是平台的原生字长,只要处理器字长可以支持标准规定的最小范围。
不能保证 aint
是 4 个字节或 adouble
是 8 个字节。一些浮点处理器支持超过 80 位。
Where's it defined?
范围规范在 C++ 语言标准中说明,编译器的定义存储在系统文件<limits>
或<climits>
.