Ответ 1
Почти во всех случаях sizeof
оценивается на основе информации о статическом типе (во время компиляции, в основном).
Одно исключение (единственное, что я думаю) относится к массивам переменной длины C99 (VLAs).
Я смущен насчет времени оценки оператора sizeof
.
Когда вычисляется оператор sizeof?
Зависит ли время его оценки [ compile-time or run-time
] от языка [C? C++?
]?
Можно ли использовать sizeof
в случае объектов, созданных во время выполнения [in C++
]?
Почти во всех случаях sizeof
оценивается на основе информации о статическом типе (во время компиляции, в основном).
Одно исключение (единственное, что я думаю) относится к массивам переменной длины C99 (VLAs).
Почти всегда время компиляции. Но следующие примеры могут вас заинтересовать:
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
Время компиляции, потому что оно вычисляет размер во время компиляции. "Время компиляции" - это когда вы создаете свой код - когда компилятор преобразует ваш исходный код в IL.