76

例如,此代码段的结果取决于哪台机器:编译器机器或机器可执行文件工作?

sizeof(short int)
4

5 回答 5

82

sizeof是编译时运算符。

于 2010-04-10T22:16:06.827 回答
16

这取决于执行程序的机器。但是该值在编译时评估。因此编译器(当然)必须知道它正在为哪台机器编译。

于 2010-04-10T22:17:55.457 回答
11

从 C99 开始,当且仅当操作数是可变长度数组(例如 int a[b],其中 b 在编译时未知)时,才会在运行时计算 sizeof。在这种情况下,sizeof(a) 在运行时计算,其结果是整个数组的大小(以字节为单位),即数组中所有元素的大小组合在一起。要获取数组中元素的数量,请使用sizeof(a) / sizeof(b). 来自 C99 标准:

sizeof 运算符产生其操作数的大小(以字节为单位),它可以是表达式或带括号的类型名称。大小由操作数的类型决定。结果是一个整数。如果操作数的类型是变长数组类型,则计算操作数;否则,不计算操作数,结果是一个整数常量。

请注意,所有这些都与您在堆上分配一个数组(例如int* a = new int[b]. 在这种情况下,sizeof(a) 只会为您提供指向 int 的指针的大小,即 4 或 8 个字节,而不管数组中有多少元素。

于 2017-11-16T18:18:16.733 回答
6

sizeof 在编译时进行评估,但如果将可执行文件移动到编译时间和运行时值不同的机器上,则可执行文件将无效。

于 2010-04-10T22:18:16.913 回答
0

Anon 试图解释这一点,但他和其他人仍然没有声明您的编译器有标志来指示您正在编译的处理器。这就是在编译时知道 sizeof short 的方式。

然而,我觉得任何桌面编译器都应该推出与桌面兼容的代码。我认为操作系统为此提供了某些抽象。尽管我听说 Windows 机器与 Macintosh 机器的架构不同。

于 2021-11-02T05:31:16.543 回答