каков механизм sizeof () в C/C++?

Еще лучше, когда вы устанавливаете cygwin, выбирайте пакеты openssh, perl и emacs. Затем установите демон ssh, используя ssh-host-config -y, и следуйте инструкциям . Теперь вы можете подключиться к своей машине с Windows из своего Linux-бокса, с радостью использовать vi или emacs и разрабатывать на Perl, запускать свой код perl или любую другую командную строку Windows exe, Java или Python и т. Д., Если они являются консольными приложениями. (против графического).

8
задан Kevin Panko 18 December 2009 в 17:41
поделиться

9 ответов

Знаете, есть причина, по которой существуют стандартных документов (3,8 МБ PDF) ; C99, раздел 6.5.3.4, §2:

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


В ответ на комментарий ibread, вот пример для случая массива переменной длины C99:

#include <stdio.h>

size_t sizeof_int_vla(size_t count)
{
    int foo[count];
    return sizeof foo;
}

int main(void)
{
    printf("%u", (unsigned)sizeof_int_vla(3));
}

Размер foo больше не известен во время компиляции и должен быть определяется во время выполнения. Сгенерированная сборка выглядит довольно странно, поэтому не спрашивайте меня о деталях реализации ...

34
ответ дан 5 December 2019 в 04:30
поделиться

Он заменяется константой (4 в вашем случае) во время компиляции. Потому что для хранения int на вашей платформе требуется 4 байта.

И ваш код не будет компилироваться, вместо того, чтобы давать вам какой-либо вывод ;-) Из-за sizoef ; -)

2
ответ дан 5 December 2019 в 04:30
поделиться

Размер возвращаемого типа вычисляется во время компиляции, нет дополнительных затрат времени выполнения

1
ответ дан 5 December 2019 в 04:30
поделиться

sizeof - это оператор, а не функция.

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

В вашем примере вычисляется sizeof (int) , который, конечно, известен во время компиляции, поэтому код заменяется константой и, следовательно, ++ не выполняет ' t существуют во время выполнения для выполнения.

int i=0;
cout << sizeof(++i) << endl;
cout << i << endl;

Также стоит отметить, что, поскольку это оператор, его можно использовать без скобок для значений:

int myVal;
cout << sizeof myVal << endl;
cout << sizeof(myVal) << endl;

Эквивалентны.

16
ответ дан 5 December 2019 в 04:30
поделиться

Именно для этого он предназначен: непосредственно помещает константу «размер переменной / константы / типа / и т.д.» в код

0
ответ дан 5 December 2019 в 04:30
поделиться

Sizeof анализирует переданное выражение, чтобы найти его тип. Затем он возвращает размер типа.

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

8
ответ дан 5 December 2019 в 04:30
поделиться

sizeof () возвращает размер в байтах того, что вы передали ему в качестве аргумента. В 32-битной архитектуре sizeof (int) вернет 4, а sizeof (char) вернет 1.

0
ответ дан 5 December 2019 в 04:30
поделиться

Вы сами сказали: 'sizeof' не является функцией. Это встроенный оператор со специальным синтаксисом и семантикой (см. Предыдущие ответы). Чтобы лучше помнить, что это не функция, вы можете избавиться от привычки использовать лишние фигурные скобки и предпочесть использовать "sizeof" без скобок с выражениями, как в следующем примере

printf("%d\n", sizeof ++i);

Это в точности эквивалентно вашему исходная версия.

0
ответ дан 5 December 2019 в 04:30
поделиться

В C ++ sizeof () вычисляет размер типа выражение внутри него и заменяет весь вызов функции « sizeof () » константой во время компиляции.

Выражение внутри sizeof () никогда не вычисляется во время выполнения программы. И это может быть даже не название типа. Ознакомьтесь с этими примерами:

struct X { int i; double j;};
int call_to_undefined_function();

sizeof(10/0);
sizeof( ((struct X*)NULL)->j );
sizeof( call_to_undefined_function() + 100 );
sizeof( call_to_undefined_function() + 100.0 );
sizeof( double() / int() );
1
ответ дан 5 December 2019 в 04:30
поделиться