繁体   English   中英

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

[英]how compiler works to evaluate sizeof operator in c

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

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

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

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

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

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

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

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

根据定义, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM