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

时间:2010-04-10 22:15:29

标签: c++ runtime sizeof compile-time

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

sizeof(short int)

4 个答案:

答案 0 :(得分:57)

sizeof是编译时运算符。

答案 1 :(得分:11)

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

答案 2 :(得分:6)

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

答案 3 :(得分:5)

从C99开始,当且仅当操作数是可变长度数组时,才在运行时评估sizeof,例如, int a [b],其中b在编译时是未知的。在这种情况下,sizeof(a)在运行时进行评估,其结果是整个数组的大小(以字节为单位),即组合中所有元素的大小。要获取数组中元素的数量,请使用Object.prototype.own = function () { return new Proxy(this, { has: function (target, propertyName) { return target.hasOwnProperty(propertyName); } }); }; var intersection = function(obj1, obj2) { var result = []; for (var k in obj1.own()) if (k in obj2.own()) result.push(k); return result; }; document.writeln(intersection({ a: 1, b: 2, c: 3 }, { b: 2, c: 3, d: 4}));。从C99标准:

  

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

请注意,所有这些都与您在堆上分配数组时所获得的不同,例如: sizeof(a) / sizeof(b)。在这种情况下,sizeof(a)只会给你一个指向int的指针的大小,即4或8个字节,无论数组中有多少个元素。