it-swarm.com.ru

Оценивается ли sizeof в C ++ во время компиляции или во время выполнения?

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

sizeof(short int)
52
ogzylz

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

57
Billy ONeal

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

11
Johannes Schaub - litb

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

6
anon

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

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

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

5
Todor K.