Arhn - архитектура программирования

как работает компилятор для оценки оператора sizeof в c

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


Ответы:


1

Компилятор просто знает размер примитивных типов данных; эти знания фундаментально встроены в компилятор.

Для традиционных массивов фиксированного размера и сложных типов данных (структур и классов) он просто складывает размеры составляющих примитивов и учитывает любые необходимые отступы. См. http://en.wikipedia.org/wiki/Data_structure_alignment.

Вычисление sizeof() в большинстве случаев выполняется во время компиляции. Исключение составляют массивы переменной длины (новое в C99), где они вычисляются во время выполнения, когда известно количество элементов.

18.12.2012
  • В C есть динамический оператор sizeof для VLA. 18.12.2012

  • 2

    Информация о размере поступает из внутренней информации компилятора.

    Компилятору известен размер основных типов, таких как char, int, double и указатели, поскольку они встроены в компилятор.

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

    Компилятор вычисляет размер массива, умножая количество элементов на размер каждого элемента.

    18.12.2012

    3

    char по определению имеет размер 1. Обратите внимание, что это не обязательно 8 бит, но всегда 1 байт.

    Примитивные типы, а также указатели имеют фиксированный размер, который известен компилятору. Они могут различаться в зависимости от компилятора и платформы.

    Массивы рассчитываются исходя из размера типа элемента, умноженного на количество элементов.

    Структуры в C и классы в C ++ по крайней мере равны сумме их нестатических элементов данных. Они могут быть больше, чтобы правильно выровнять элементы; а в C ++ могут быть дополнительные, недоступные элементы данных для поддержки полиморфизма.

    18.12.2012

    4

    Размер переменных, объявленных в исходном коде, всегда известен программе, являются ли они массивами, структурами и т. Д. Но большинство типов данных имеют фиксированные размеры, которые их определяют. Причина, по которой у нас разные типы данных, заключается в том, что нам нужны типы данных разного размера. Символ - это любой символ, который может уместиться в 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 () действительно рассчитывает все, что ему уже известно значение.

    18.12.2012
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..