-1

在 java 中,默认包含 java.lang.* [这有原语吗] 它包含 Boolean,Integer,... 包装器,以便编译器在我们说 Integer i 时可以理解我们的定义。

原始数据类型怎么样?

它是怎么知道的?

它是在哪里定义的?

编译器如何知道要分配多少内存?

int x;
double d;

它怎么知道 int 是 4 [2 bytes] , d​​ouble 是 8 bytes?

sizeof 相应地给出大小。它像编译器可用的元数据吗?

4

2 回答 2

2

在 C 和 C++ 中,这些原语就是:原语。它们是在编译器本身中定义的(好吧,在“便携式”编译器中,编译器具有针对不同体系结构的编译选项,人们怀疑有多个文件定义了这些类型)。C 标准(同样适用于 C++)为这些类型定义了一些最小大小,但实际大小取决于编译器。

很可能,这些类型并没有那么特别,只是初始化期间的一些代码设置了类型并定义了这些类型的大小、对齐要求和其他基本标准。当然,如何在这些类型上生成代码来访问和执行所需的内置运算符。

是的,sizeof()通过在编译期间使用有关类型的数据来解决。对于复合类型(structclassunion数组),编译器还将考虑大小对齐。

于 2013-07-02T00:18:17.693 回答
0

除了@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>.

于 2013-07-02T00:32:38.217 回答