12

sizeofオペレーターの評価時間について混乱しています。
sizeof演算子はいつ評価されますか?

その評価時間(コンパイル時または実行時)は言語(C?C ++?)に依存しますか?

sizeofC ++で実行時に作成されたオブジェクトの場合に使用できますか?

4

4 に答える 4

22

ほとんどの場合、sizeofは静的な型情報に基づいて評価されます(基本的にコンパイル時)。

1つの例外(私が思うに唯一の例外)は、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をサポートしないことを選択するいくつかの理由の1つです。

于 2021-04-05T18:22:36.040 に答える
-2

コンパイル時。コンパイル時にサイズが計算されるためです。「コンパイル時」とは、コードをビルドするとき、つまりコンパイラがソースコードをILに変換するときです。

于 2013-06-18T18:22:03.047 に答える