12

sizeof我对运营商的评估时间感到困惑。
sizeof 运算符何时被评估?

它的评估时间(编译时或运行时)是否取决于语言(C?C++?)?

我们可以sizeof在 C++ 运行时创建的对象的情况下使用吗?

4

4 回答 4

22

在几乎所有情况下,sizeof都基于静态类型信息(基本上在编译时)进行评估。

一个例外(我认为是唯一一个)是 C99 的可变长度数组 (VLA)。

于 2012-06-24T17:25:10.493 回答
13

几乎总是编译时间。但是您可能会对以下示例感兴趣:

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
于 2012-06-24T17:31:55.703 回答
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 的几个原因之一。

于 2021-04-05T18:22:36.040 回答
-2

编译时间,因为它是在编译时计算大小。“编译时间”是您构建代码的时间 - 编译器将您的源代码转换为 IL 的时间。

于 2013-06-18T18:22:03.047 回答