Подтвердить что ты не робот

Является ли sizeof в С++ оцененным во время компиляции или времени выполнения?

Например, результат этого фрагмента кода зависит от того, какой компьютер работает: машина компилятора или исполняемый файл машины?

sizeof(short int)
4b9b3361

Ответ 1

sizeof - оператор времени компиляции.

Ответ 2

Это зависит от машины, выполняющей вашу программу. Но значение оценивается во время компиляции. Таким образом, компилятор (конечно) должен знать, для какой машины он компилируется.

Ответ 3

sizeof оценивается во время компиляции, но если исполняемый файл перемещается на машину, где время компиляции и значения времени выполнения будут разными, исполняемый файл не будет действителен.

Ответ 4

Начиная с C99, sizeof оценивается во время выполнения тогда и только тогда, когда операнд является массивом переменной длины, например. int a [b], где b не известно во время компиляции. В этом случае sizeof (a) оценивается во время выполнения, и его результатом является размер (в байтах) всего массива, т.е. Размер всех элементов в массиве, объединенный. Чтобы получить количество элементов в массиве, используйте sizeof(a) / sizeof(b). Из стандарта C99:

Оператор sizeof дает размер (в байтах) своего операнда, который может быть выражением или заключенным в скобки именем типа. Размер определяется по типу операнда. Результат - целое число. Если тип операнда - тип массива переменной длины, то операнд оценивается; в противном случае операнд не оценивается, и результат целочисленная константа.

Обратите внимание, что все это отличается от того, что вы получите, если вы выделили массив в куче, например. int* a = new int[b]. В этом случае sizeof (a) просто даст вам размер указателя на int, т.е. 4 или 8 байтов, независимо от количества элементов в массиве.