Является ли sizeof в С++ оцененным во время компиляции или времени выполнения?
Например, результат этого фрагмента кода зависит от того, какой компьютер работает: машина компилятора или исполняемый файл машины?
sizeof(short int)
Ответ 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 байтов, независимо от количества элементов в массиве.