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

<p>например, результат этого фрагмента кода зависит от того, на какой машине работает компилятор или исполняемый файл машины?</p><pre><code>sizeof(short int) </code></pre>

<p><code>sizeof</code> - оператор времени компиляции.</p>

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

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

<p>начиная с c99, sizeof оценивается во время выполнения тогда и только тогда, когда операндом является массив переменной длины, например, int a [b], где b не известно во время компиляции. в этом случае sizeof (a) вычисляется во время выполнения, и его результатом является размер (в байтах) всего массива, то есть размер всех элементов в массиве, вместе взятых. чтобы получить количество элементов в массиве, используйте <code>sizeof(a) / sizeof(b)</code>. из стандарта c99:</p><blockquote> <p>оператор sizeof возвращает размер (в байтах) своего операнда, который может быть выражением или именем типа в скобках. размер определяется по типу операнда. результатом является целое число. если тип операнда является типом массива переменной длины, операнд оценивается; в противном случае, операнд не оценивается, а результатом является целочисленная константа.</p> </blockquote><p>обратите внимание, что все это отличается от того, что вы получите, если выделите массив в куче, например, <code>int* a = new int[b]</code>. в этом случае sizeof (a) просто даст вам размер указателя на int, то есть 4 или 8 байт, независимо от того, сколько элементов в массиве.</p>