2012-06-24 2 views
10

Я смущен насчет времени оценки sizeof оператора.
Когда вычисляется оператор sizeof?sizeof время компиляции оператора или время выполнения

Выполняет ли его время оценки [compile-time or run-time] в зависимости от языка [C? C++?]?

Можем ли мы использовать sizeof в случае создания объектов во время выполнения [in C++]?

ответ

19

Практически во всех случаях sizeof оценивается на основе информации о статическом типе (во время компиляции, в основном).

Одно исключение (единственное, что я думаю) относится к массивам переменной длины (VLA) C99.

+0

Отличное доказательство того, что такое нелепые VLA извращения. Яблоко IMHO с явным потреблением переменной длины ('alloca') намного лучше. – valdo

+3

@valdo, я не вижу, что это должно доказать. Кажется нормальным, что 'sizeof' объект, который динамически оценивается во время выполнения, должен оцениваться во время выполнения. И сравнение с другими механизмами, такими как 'alloca' (которые даже не стандартизированы и не имеют области видимости) или' malloc', которые оба не знают ничего о размере создаваемых объектов, не очень помогают. –

+0

@Jens Gustedt: Извините, я имел в виду * пример *, а не * доказательство *. 'alloca' не требует явного освобождения/области. Сгенерированный код (более или менее) идентичен VLA - перемещение указателя стека + исследование памяти стека при пересечении границ страницы. Я лично использую 'sizeof' очень агрессивно в метапрограмме (temapltes и т. Д.), И я бы хотел быть на 100% уверенным, что все, что находится внутри' sizeof', никогда не будет оцениваться во время выполнения. – valdo

11

Практически всегда компилируйте время. Но следующие примеры могут представлять интерес для Вас:

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 
+0

Возможно, «void foo (char [100] x)» должно быть «void foo (char x [100])»? –

0

времени компиляции, потому что рассчитать размер во время компиляции «Compile времени», когда вы строите свой код - когда компилятор преобразует исходный код в IL..

Смежные вопросы