C++中的sizeof是在编译时还是运行时评估的?

ogz*_*ylz 54 c++ runtime sizeof compile-time

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

sizeof(short int)
Run Code Online (Sandbox Code Playgroud)

Bil*_*eal 59

sizeof 是一个编译时运算符.

  • @osgx:这是C99的可变长度数组.VLA不在C++中. (4认同)
  • 在这里查看用户325525的答案.他有一个运行时sizeof的例子! (2认同)

Joh*_*itb 12

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


小智 6

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


Tod*_* K. 5

从C99开始,当且仅当操作数是可变长度数组(例如int a [b],其中b在编译时未知)时,才在运行时评估sizeof。在这种情况下,将在运行时对sizeof(a)进行评估,其结果是整个数组的大小(以字节为单位),即数组中所有元素的大小相加。要获取数组中的元素数,请使用sizeof(a) / sizeof(b)。根据C99标准:

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

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

  • 我站得住了。C ++标准确实不允许变长数组。但是,即使在编译C ++时,GCC和LLVM / clang都默认允许它们(您可以使用-pedantic-errors标志禁用它们)。因此,我相信对于C ++程序员来说,重要的是要知道如果声明一个可变长度数组(无意或有意)并在其上调用sizeof会发生什么。 (2认同)