2012-12-18 40 views
3

虽然已经有几个问题要求在这个论坛&其他与sizeof运算符有关,我无法得到任何答案如何编译器评估sizeof运算符来查找任何数据类型的大小,变量,指针,数组等,如果可能的话,也指向我的一些链接,可以帮助我详细了解这一点。任何帮助将不胜感激。谢谢。编译器如何工作以评估sizeof运算符在c

回答

8

编译器只是知道原始数据类型的大小;这些知识从根本上建立在编译器之上。

对于传统的固定大小数组和复杂数据类型(结构和类),它只是将任意必要的填充的基本元素和帐户的大小相加。请参见http://en.wikipedia.org/wiki/Data_structure_alignment

sizeof()计算在大多数情况下在编译时完成。对于变长数组(C99中的新增值)是一个例外,在数组元素已知的情况下,它将在运行时计算出来。

+0

C对于VLA有一个动态的'sizeof'运算符。 –

+0

好点。将更新答案。 –

3

尺寸信息来自编译器内部的信息。

编译器知道基本类型的大小,如char,int,double和指针,因为这些是设计到编译器中的。

编译器通过添加所有部分的大小(包括结构中的成员),以及任何用于对齐的填充以及任何支持语言功能的隐藏部分(例如指向类信息的指针)来计算复合结构的大小以支持多态)。

编译器通过将元素数乘以每个元素的大小来计算数组的大小。

2

char根据定义,其大小为1。请注意,它不一定是8位,但它总是1个字节。

原始类型和指针都有一个编译器知道的固定大小。这些可能在编译器和平台之间有所不同。

数组的大小由元素类型的大小乘以元素的数量来计算。

C中的结构和C++中的类至少与它们的非静态数据成员的总和一样大。他们可能会更大,以便正确对齐成员;而在C++中可能会有额外的无法访问的数据成员来支持多态。

0

在源代码中声明的变量的大小总是知道程序是否是数组,结构体等。但大多数数据类型具有固定的大小来定义它们。我们拥有不同数据类型的原因是因为我们需要不同大小的数据类型。 char是任何可以放入1个字节的字符。为了这个例子,它只能表示数字0-9。因此,假设我们有一个16位长的数字,如果我们只有字符,那么计算机需要16个字节来表示这个数字。知道想象一个8位长的数字(它是一个字节),它的8位数字中只能有2个可能的值(0或1),你只能有64个可能的唯一组合。现在想象一下,如果这64个组合中的每个人都代表了特定的数字您可能很有可能是16位数字的长度不足16字节。这是int数据类型背后的想法。 请注意,我简化了int和chars的解释,以便我可以解释它们而不必深入。现在我知道你的想法是什么?

for (i = 0; array[i] != NULL; i++) {} 

上面的代码基本上是strlen()函数的作用。你有没有想过为什么数组以NULL字符结尾?部分原因是它使得像上面的代码一样容易找到数组的长度。所以要回答你的问题,sizeof()确实可以计算任何它已经知道的值。