Answers:
sizeof()
给您数据类型的大小,而不是内存中该类型的特定实例的大小。
例如,如果您有一个字符串数据对象,该对象在运行时分配了一个可变大小的字符数组,则sizeof()
不能用于确定该字符数组的大小。它只会给你指针的大小。
数据类型的大小在编译时总是已知的。
sizeof
在数组上使用,则将获得数组的大小(即元素大小乘以元素数)。但是,如果在指针上使用它,则只会得到指针的大小。因此,由于在大多数情况下您想知道数组的大小,所以只有一个指针,所以它并不是那么有用。
为什么将sizeof称为编译时运算符?
因为在编译时,编译器会计算表达式的大小并替换该编译时常量值。
它实际上不是运行时运算符吗?
不会。您甚至可以使用它sizeof
来评估无法合法执行的表达式的大小(即,这将导致未定义的行为),只要编译器可以弄清楚表达式的类型是什么即可。
同样,即使在C ++ 11之前constexpr
,您也可以使用sizeof
无法使用运行时表达式的方式来使用表达式。
如果确实是一个编译时运算符,它如何有助于产生可移植的代码...
在不同平台上,类型的大小可能有所不同。使用sizeof
表达式而不是硬编码的假设意味着在其他平台上进行编译并且类型更改大小时,代码不会中断。
C ++实际上不在运行时存储对象的元数据,因此大小检查必须在编译时进行。有关C ++如何不验证大小的示例,请声明一个int
任意大小的数组,然后读取其末尾。如果幸运的话,您会得到一个segfault
但更可能的原因,只是阅读乱码,因为C ++不会跟踪数组的大小。
请参阅C / C ++程序段错误是否可以读取数组末尾(UNIX)?以SO为例。