хотя на этом форуме уже есть несколько вопросов, связанных с оператором sizeof, я не мог получить никакого ответа о том, как компилятор оценивает оператор sizeof, чтобы найти размер любого типа данных, переменной, указателя, массива и т. д., если возможно, также укажите мне к некоторым ссылкам, которые могут помочь мне подробно разобраться в этом. Любая помощь будет оценена. благодаря.
как работает компилятор для оценки оператора sizeof в c
Ответы:
Компилятор просто знает размер примитивных типов данных; эти знания фундаментально встроены в компилятор.
Для традиционных массивов фиксированного размера и сложных типов данных (структур и классов) он просто складывает размеры составляющих примитивов и учитывает любые необходимые отступы. См. http://en.wikipedia.org/wiki/Data_structure_alignment.
Вычисление sizeof()
в большинстве случаев выполняется во время компиляции. Исключение составляют массивы переменной длины (новое в C99), где они вычисляются во время выполнения, когда известно количество элементов.
Информация о размере поступает из внутренней информации компилятора.
Компилятору известен размер основных типов, таких как char
, int
, double
и указатели, поскольку они встроены в компилятор.
Компилятор вычисляет размер составных структур, добавляя размеры всех их частей, включая элементы в структуре, плюс любые отступы, используемые для выравнивания, плюс любые скрытые части, которые поддерживают языковые функции (например, указатель на информацию о классе для поддержки полиморфизма) .
Компилятор вычисляет размер массива, умножая количество элементов на размер каждого элемента.
char
по определению имеет размер 1. Обратите внимание, что это не обязательно 8 бит, но всегда 1 байт.
Примитивные типы, а также указатели имеют фиксированный размер, который известен компилятору. Они могут различаться в зависимости от компилятора и платформы.
Массивы рассчитываются исходя из размера типа элемента, умноженного на количество элементов.
Структуры в C и классы в C ++ по крайней мере равны сумме их нестатических элементов данных. Они могут быть больше, чтобы правильно выровнять элементы; а в C ++ могут быть дополнительные, недоступные элементы данных для поддержки полиморфизма.
Размер переменных, объявленных в исходном коде, всегда известен программе, являются ли они массивами, структурами и т. Д. Но большинство типов данных имеют фиксированные размеры, которые их определяют. Причина, по которой у нас разные типы данных, заключается в том, что нам нужны типы данных разного размера. Символ - это любой символ, который может уместиться в 1 байт. Что для этого примера может представлять только числа 0-9. Допустим, у нас есть 16-значное длинное число, если бы у нас были только символы, тогда компьютеру потребовалось бы 16 байт для представления этого числа. Представьте себе 8-значное число (которое является байтом), которое может иметь только 2 возможных значения (0 или 1) в каждой из 8 цифр, у вас может быть только 64 возможных уникальных комбинации. А теперь представьте, что каждая из этих 64 комбинаций представляет собой определенное число. Скорее всего, вы могли бы исправить это 16-значное число менее чем за 16 байт. Это идея типа данных int. Обратите внимание, что я упростил объяснение int и chars, чтобы я мог объяснить их, не вдаваясь в подробности. Теперь я знаю, что вы думаете о массивах?
for (i = 0; array[i] != NULL; i++) {}
Приведенный выше код - это в основном то, что делает функция strlen (). Вы когда-нибудь задумывались, почему массивы заканчиваются символами NULL? Отчасти это связано с тем, что он делает определение длины массива таким же простым, как и приведенный выше код. Итак, чтобы ответить на ваш вопрос, sizeof () действительно рассчитывает все, что ему уже известно значение.
sizeof
для VLA. 18.12.2012