о мощности оператора sizeof в C ++ - PullRequest
4 голосов
/ 26 февраля 2011

Я читаю Современный C ++ дизайн.Было упомянуто о размере оператора в следующем описании.Следующий абзац объясняется с точки зрения общего программирования.

В sizeof есть удивительная сила: вы можете применять sizeof к любому выражению, независимо от его сложности, а sizeof возвращает его размер без фактическогооценивая это выражение во время выполнения.Это означает, что sizeof знает о перегрузке, создании шаблона, правилах преобразования - обо всем, что может принимать участие в выражении C ++.Фактически, sizeof скрывает полную возможность для определения типа выражения;в конечном итоге sizeof отбрасывает выражение и возвращает только размер его результата.

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

Спасибо

Ответы [ 5 ]

2 голосов
/ 26 февраля 2011

что означает автор: sizeof возвращает свой размер без фактической оценки выражения во время выполнения.

Это означает, что sizeof(1/0) даст sizeof(int), хотя 1/0 будетОбычно программа прерывается, потому что деление на ноль - это ошибка runtime .Кроме того, для любого p, объявленного как T* p, sizeof(*p) даст sizeof(T) независимо от того, какое значение хранится в p, даже если p висят или не инициализируются вообще.

2 голосов
/ 26 февраля 2011

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

Компилятор вычисляет тип, затем онможет вывести размер выражения из типа , а затем, все еще во время компиляции , все выражение sizeof заменяется вычисленным размером.Таким образом, само выражение не превращает его в исполняемый код.Вот что означает «sizeof отбрасывает выражение и возвращает только размер его результата» означает.

1 голос
/ 26 февраля 2011

Ниже приведен размер типа, который имеет i++, который равен int (обычно int имеет 4 или 8 байтов, поэтому он, скорее всего, даст вам значение 4 или 8).Однако, поскольку выражение не оценивается, для выражения не выполняется никаких действий во время выполнения.

int i = 0;
sizeof(i++);

Оценка выражения в основном означает выполнение его побочных эффектов (например, увеличение переменной) или чтение значений из памяти или регистров во время выполнения.Таким образом, в некотором смысле sizeof «выбрасывает» свой операнд, поскольку он не выполняет операцию времени выполнения, которую он указывает (значение i все равно будет равно нулю).

0 голосов
/ 29 апреля 2011

Это означает, что int j=sizeof(int); будет скомпилировано в int j=4;

Я прочитал скомпилированную сборку, фактически нет calc во время выполнения!

0 голосов
/ 26 февраля 2011

Компилятору необходимо рассчитать размеры типов / структур / классов для различных операций.Оператор sizeof делает эти размеры доступными для вашей программы как константу.Так, например, если вы сделаете sizeof(int), компилятор знает, насколько велик размер int (в байтах), и вместо этого вставит это значение.То же самое относится к более сложным вещам, таким как sizeof(myVariable) с типом myVariable типа MyClass: компилятор знает, сколько места занимает MyClass, и, следовательно, может вставить это значение.

что эта оценка происходит во время компиляции: результатом является число.Во время выполнения оценку не нужно делать снова.

...