[英]how compiler works to evaluate sizeof operator in c
虽然在这个论坛上已经提出了几个问题以及其他与sizeof运算符相关的问题,但我无法得到关于编译器如何评估sizeof运算符以查找任何数据类型,变量,指针,数组等的大小的任何答案。如果可能的话也指向我一些链接可以帮助我详细了解这一点。 任何帮助将不胜感激。 谢谢。
编译器只知道原始数据类型的大小; 这种知识从根本上构建在编译器中。
对于传统的固定大小的数组和复杂的数据类型(结构和类),它只是将组成原语的大小和帐户相加以进行任何必要的填充。 见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()真的有剂量计算它已经知道的价值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.