Оценивается ли sizeof в C ++ во время компиляции или во время выполнения? - PullRequest
52 голосов
/ 11 апреля 2010

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

sizeof(short int)

Ответы [ 4 ]

57 голосов
/ 11 апреля 2010

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

11 голосов
/ 11 апреля 2010

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

6 голосов
/ 11 апреля 2010

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

5 голосов
/ 16 ноября 2017

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

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

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

...