Практически всегда компилируйте время. Но следующие примеры могут представлять интерес для Вас:
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
Отличное доказательство того, что такое нелепые VLA извращения. Яблоко IMHO с явным потреблением переменной длины ('alloca') намного лучше. – valdo
@valdo, я не вижу, что это должно доказать. Кажется нормальным, что 'sizeof' объект, который динамически оценивается во время выполнения, должен оцениваться во время выполнения. И сравнение с другими механизмами, такими как 'alloca' (которые даже не стандартизированы и не имеют области видимости) или' malloc', которые оба не знают ничего о размере создаваемых объектов, не очень помогают. –
@Jens Gustedt: Извините, я имел в виду * пример *, а не * доказательство *. 'alloca' не требует явного освобождения/области. Сгенерированный код (более или менее) идентичен VLA - перемещение указателя стека + исследование памяти стека при пересечении границ страницы. Я лично использую 'sizeof' очень агрессивно в метапрограмме (temapltes и т. Д.), И я бы хотел быть на 100% уверенным, что все, что находится внутри' sizeof', никогда не будет оцениваться во время выполнения. – valdo