虽然已经有几个问题要求在这个论坛&其他与sizeof运算符有关,我无法得到任何答案如何编译器评估sizeof运算符来查找任何数据类型的大小,变量,指针,数组等,如果可能的话,也指向我的一些链接,可以帮助我详细了解这一点。任何帮助将不胜感激。谢谢。编译器如何工作以评估sizeof运算符在c
回答
编译器只是知道原始数据类型的大小;这些知识从根本上建立在编译器之上。
对于传统的固定大小数组和复杂数据类型(结构和类),它只是将任意必要的填充的基本元素和帐户的大小相加。请参见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()确实可以计算任何它已经知道的值。
- 1. sizeof运算符评估在gcc编译的哪个阶段
- 2. sizeof运算符在C中如何工作?
- 3. 编译器能否跳过对逗号运算符左操作数的评估?
- 4. ostream C++运算符的懒惰评估
- 5. C中的评估&&运算符
- 6. 如何评估SQL OR运算符
- 7. 运行(C#)算法评估
- 8. Sizeof运算符实现:它如何在编译时计算大小?
- 9. Java Println如何工作评估特殊符号和算术运算?
- 10. C代码宏评估在编译时
- 11. 编译器评估显式空检查与空合并运算符?
- 12. sizeof运算符编译时或运行时间
- 13. 在C中实现sizeof运算符
- 14. C++,三元运算符的操作数评估规则
- 15. 编译/运行时Java枚举评估
- 16. Javascript:比较运算符在postfix增量运算符之前如何评估?
- 17. 评估包含在字符串中的运算符的操作
- 18. 如何在运行时编译/评估Scala表达式?
- 19. C操作符和评估
- 20. gof对VLA的sizeof运算符进行了不同的评估吗?
- 21. C++编译器如何解释==运算符?
- 22. 可以在编译时评估C#自定义属性吗?
- 23. C++ sizeof运算符如何计算大小?
- 24. 评估顺序和运算符<<
- 25. 比较运算符的评估顺序?
- 26. 后缀增量运算符评估
- 27. 范围解析运算符的评估
- 28. awk如何评估逻辑运算?
- 29. c#编译器如何工作?
- 30. 如何在三元运算符中仅评估一次函数?
C对于VLA有一个动态的'sizeof'运算符。 –
好点。将更新答案。 –