编译器如何在c中评估sizeof运算符

时间:2012-12-18 17:12:02

标签: c++ c compiler-construction sizeof

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

4 个答案:

答案 0 :(得分:8)

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

对于传统的固定大小数组和复杂数据类型(结构和类),它只是将组成原语的大小和帐户相加以进行任何必要的填充。见http://en.wikipedia.org/wiki/Data_structure_alignment

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

答案 1 :(得分:3)

大小信息来自编译器内部的信息。

编译器知道基本类型的大小,例如charintdouble和指针,因为它们是在编译器中设计的。

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

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

答案 2 :(得分:2)

根据定义,

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

原始类型和指针每个都具有编译器知道的固定大小。这些可能因编译器和平台而异。

数组是根据元素类型的大小乘以元素数来计算的。

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

答案 3 :(得分: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()确实计算了它已经知道价值的任何东西。

相关问题