虽然已经在这个论坛上提出了几个问题以及其他与 sizeof 运算符相关的问题,但我无法得到任何关于编译器如何评估 sizeof 运算符以找到任何数据类型、变量、指针、数组等的大小的答案。如果可能的话,也请指出我到一些可以帮助我详细理解这一点的链接。任何帮助将不胜感激。谢谢。
4 回答
编译器只知道原始数据类型的大小;这些知识基本上内置于编译器中。
对于传统的固定大小数组和复杂数据类型(结构和类),它只是将组成原语的大小相加并考虑任何必要的填充。见http://en.wikipedia.org/wiki/Data_structure_alignment
在大多数情况下,sizeof()
计算是在编译时完成的。可变长度数组(C99 中的新功能)是个例外,它是在知道元素数量后在运行时计算的。
大小信息来自编译器内部的信息。
编译器知道基本类型(例如char
、int
、double
和指针)的大小,因为它们是在编译器中设计的。
编译器通过将复合结构的所有部分的大小相加来计算复合结构的大小,包括结构中的成员,加上任何用于对齐的填充,以及任何支持语言特性的隐藏部分(例如指向支持多态性的类信息的指针) .
编译器通过将元素数乘以每个元素的大小来计算数组的大小。
char
根据定义,大小为 1。请注意,它不一定是 8 位,但始终是 1 字节。
原始类型和指针都有一个编译器知道的固定大小。这些可能因编译器和平台而异。
数组的计算方法是元素类型的大小乘以元素的数量。
C 中的结构和 C++ 中的类至少与其非静态数据成员的总和一样大。为了正确对齐成员,它们可能更大;在 C++ 中,可能有额外的、不可访问的数据成员来支持多态性。
源代码中声明的变量的大小对于程序来说总是知道的,无论它们是数组、结构还是等。但是大多数数据类型都有固定的大小来定义它们。我们有不同数据类型的原因是因为我们需要不同大小的数据类型。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() 真的不需要计算它已经知道值的任何东西。