编译器如何计算 c 中的 sizeof 运算符

问题描述 投票:0回答:4

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

c++ c sizeof
4个回答
8
投票

编译器只是知道原始数据类型的大小;这些知识基本上内置于编译器中。

对于传统的固定大小数组和复杂数据类型(结构和类),它只是将组成基元的大小相加并考虑任何必要的填充。请参阅 http://en.wikipedia.org/wiki/Data_struction_alignment

在大多数情况下,

sizeof()
计算是在编译时完成的。变长数组是个例外(C99 中的新增功能),一旦元素数量已知,就会在运行时计算。


3
投票

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

编译器知道基本类型(例如

char
int
double
)和指针的大小,因为这些是编译器中设计的。

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

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


2
投票
根据定义,

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

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

数组的计算方法是元素类型的大小乘以元素的数量。

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


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() 确实不需要计算它已经知道值的任何内容。

© www.soinside.com 2019 - 2024. All rights reserved.