Первоначально это часть другого вопроса.
Почему sizeof
называется оператором времени компиляции? Разве это не на самом деле оператор во время выполнения? И если это действительно оператор времени компиляции, как он помогает в создании переносимого кода, который выполняется одинаково на разных компьютерах? Пожалуйста, объясните подробно.
sizeof(polymorphic_ptr*)
быть постоянным довольно нелогично и просто глупо. Да, это путь C ++, но тем не менее глупо.Ответы:
sizeof()
дает вам размер типа данных , а не размер конкретного экземпляра этого типа в памяти.Например, если у вас был объект строковых данных, который выделял массив символов переменного размера во время выполнения, его
sizeof()
нельзя было бы использовать для определения размера этого массива символов. Это только даст вам размер указателя.Размер типа данных всегда известен во время компиляции.
источник
sizeof
на массиве, вы будете получить размер массива (то есть раз размера элемента числа элементов). Но если вы используете его для указателя, вы получите только размер указателя. Итак, поскольку в большинстве случаев, когда вы хотите узнать размер массива, у вас есть только указатель, это не так уж и полезно.потому что весь размер "вызова" вычисляется во время компиляции, а все, что находится в скобках, отбрасывается и не выполняется во время выполнения,
результат основан исключительно на статической информации о типе, доступной компилятору
источник
Потому что во время компиляции компилятор вычисляет размер выражения и подставляет это значение постоянной времени компиляции.
Нет. Вы можете даже использовать,
sizeof
чтобы оценить размер выражений, которые вы не можете выполнить на законных основаниях (т. Е. Это может привести к неопределенному поведению), при условии, что компилятор может выяснить, каков тип выражения.Кроме того, даже до C ++ 11
constexpr
вы можете использоватьsizeof
выражения так, как вы не можете использовать выражения во время выполнения.Типы могут различаться по размеру на разных платформах. Использование
sizeof
выражений вместо жестко заданных допущений означает, что ваш код не сломается, когда вы компилируете на другой платформе и ваши типы изменят размер.источник
C ++ на самом деле не хранит метаданные для объектов во время выполнения, поэтому проверка размера должна выполняться во время компиляции. В качестве примера того, как C ++ не проверяет размер, объявите массив
int
произвольного размера и прочитайте его до конца. Если вам повезет, вы получите,segfault
но, скорее всего, просто прочитаете бред, потому что C ++ не отслеживает размер вашего массива.См. Может ли программная ошибка на языке Си / Си ++ читать после конца массива (UNIX)? для примера из SO.
источник