我对sizeof
运营商的评估时间感到困惑
什么时候对sizeof运算符进行求值?
评估时间[compile-time or run-time
]是否取决于语言[C? C++?
]?
如果在运行时创建对象[sizeof
],我们可以使用in C++
吗?
答案 0 :(得分:20)
在几乎所有情况下,sizeof
都是基于静态类型信息进行评估的(基本上是在编译时)。
一个例外(我认为唯一的例外)就是C99的可变长度数组(VLA)。
答案 1 :(得分:12)
几乎总是编译时间。但您可能会对以下示例感兴趣:
char c[100];
sizeof(c); // 100
char* d = malloc(100);
sizeof(d); //probably 4 or 8. tells you the size of the pointer!
BaseClass* b = new DerivedClass();
sizeof(b); //probably 4 or 8 as above.
void foo(char[100] x) {
sizeof(x); //probably 4 or 8. I hate this. Don't use this style for this reason.
}
struct Foo {
char a[100];
char b[200];
};
sizeof(struct Foo); //probably 300. Technically architecture dependent but it will be
//the # of bytes the compiler needs to make a Foo.
struct Foo foo;
sizeof(foo); //same as sizeof(struct Foo)
struct Foo* fooP;
sizeof(fooP); //probably 4 or 8
class ForwardDeclaredClass;
ForwardDeclaredClass* p;
sizeof(p); //4 or 8
ForwardDeclaredClass fdc; //compile time error. Compiler
//doesn't know how many bytes to allocate
sizeof(ForwardDeclaredClass); //compile time error, same reason
答案 2 :(得分:0)
编译时间,因为它在编译时计算大小。“编译时间”是指构建代码时 - 编译器将源代码转换为IL时。
答案 3 :(得分:0)
在 C 中,它并不总是编译时操作,如以下代码所示:
#include <stdio.h>
#include <stdint.h>
int main(void) {
int x;
scanf("%d", &x); // Value X is not known until run-time
uint16_t data[x]; // VLA: has flexible size depending on input
printf("Value x is: %d\nSize is: %zu\n", x, sizeof(data));
// sizeof produces proper results at runtime
return 0;
}
数组 data
的大小直到运行时才知道,并且 sizeof 运算符仍然可以正常工作。
这是 C++ 选择不支持 VLA 的几个原因之一。