За исключением одного случая, sizeof
делает это во время компиляции. Во время компиляции компилятор отслеживает тип объекта full [Edit: хорошо, все, что он знает о типе объекта, так или иначе - если тип не завершен, так что t включает размер, попытка использовать sizeof
потерпит неудачу], и sizeof
в основном просто «экспортирует» одну часть этой информации из компилятора в компилируемый код, поэтому она становится по существу постоянной в результирующем коде.
Исключение составляют случаи, когда sizeof
применяется к массиву переменной длины (VLA) 1 . При применении к VLA sizeof
оценивает его операнд (что не делает иначе) и выдает фактический размер VLA. В этом случае результат не является константой.
1. VLA официально стали частью C в C99, но некоторые компиляторы поддерживали их до этого. Хотя это официально не является частью C ++, некоторые компиляторы (например, g ++) также включают VLA как расширение C ++.