Си структуры: Сложные типы данных в Си : структуры, объединения, битовые поля

Содержание

Урок 23. Паттерн 15. Рост размеров структур

24 Янв 2012

Сам по себе рост размера структур не является ошибкой, но может приводить к потреблению необоснованного количества памяти и в результате к замедлению скорости работы программы. Будем рассматривать данный паттерн не как ошибку, но как причину неэффективности 64-битного кода.

Данные в структурах в языке Си++ выравниваются таким образом, чтобы обеспечить более эффективный к ним доступ. Некоторые микропроцессоры вообще не могут напрямую обращаться к не выровненным данным и компилятору приходиться генерировать специальный код для обращения к таким данным. Те же микропроцессоры, которые могут обращаться к не выровненным данным, все равно делают это намного менее эффективно. Поэтому компилятор Си++ оставляет пустые ячейки между полями структур, чтобы обеспечить их выравнивание по адресам машинных слов и тем самым ускорить к ним обращение. Можно отключить выравнивание, используя специальные директивы #pragma, чтобы сократить объем используемой памяти, но нас этот вариант сейчас не интересует.

Часто можно значительно сократить объем расходуемой памяти простым изменением порядка полей в структуре, без потери производительности.

Рассмотрим следующую структуру:

struct MyStruct
{
  bool m_bool;
  char *m_pointer;
  int m_int;
};

На 32-битной системе эта структура займет 12 байт, и сократить этот размер не представляется возможным. Каждое поле выровнено по границе 4 байта. Даже если m_bool перенести в конец, это ничего не изменит. Компилятор все равно сделает размер структуры кратным 4 байтам для выравнивания таких структур в массивах.

В случае 64-битной сборки структура MyStruct займет уже 24 байта. Это понятно. В начале идет один байт под m_bool и 7 неиспользуемых байт для выравнивания, так как указатель занимает 8 байт и должен быть выровнен по границе 8 байт. Затем 4 байта для m_int и 4 неиспользуемых байта, для выравнивания структуры по границе 8 байт.

К счастью, дело можно легко поправить, переместив m_bool в конец структуры, как показано ниже:

struct MyStructOpt
{
  char *m_pointer;
  int m_int;
  bool m_bool;
};

Структура MyStructOpt займет уже не 24, а 16 байт. Визуально расположение полей представлено на рисунке 1. Весьма существенная экономия, если мы будем использовать, например, 10 миллионов элементов. В этом случае мы сэкономим 80 мегабайт памяти, но что еще более важно, можем повысить производительность. Если структур будет немного, то нет разницы, какого они размера. Доступ будет происходить с одинаковой скоростью. Но когда элементов много, то начинает играть роль кэш, количество обращений к памяти и так далее. И можно с уверенностью утверждать, что обработка 160 мегабайт данных займет меньше времени, чем 240 мегабайт. Даже простой доступ ко всем элементам массива для чтения, уже будет более быстр.

Рисунок 1 — Расположение полей в структурах MyStruct и MyStructOpt

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

Вы, наверное, зададите вопрос, по каким правилам компилятор выравнивает данные. Мы ответим кратко, а если интересно познакомиться с этой темой более подробно, то мы отсылаем вас к книге Джеффри Рихтер — Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows. Там этот вопрос рассматривается достаточно подробно.

В целом правило выравнивание следующее: каждое поле выравнивается по адресу, кратному размеру данного поля. Поле типа size_t на 64-битной системе будет выровнено по границе 8 байт, int по границе 4 байта, short по границе 2 байта. Поля типа char не выравниваются. Размер структуры выравнивается до размера, кратному размеру его максимального элемента. Поясним это выравнивание на примере:

struct ABCD
 {
  size_t m_a;
  char m_b;
 };

Элементы займут 8 + 1 = 9 байт. Но если размер структуры будет 9 байт, то, если мы захотим создать массив структур ABCD[2], поле m_a второй структуры будет лежать по не выровненному адресу. Вследствие этого компилятор дополнит структуру 7 пустыми байтами до размера 16 байт.

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

struct MyStruct
{
  int m_int;
  size_t m_size_t;
  short m_short;
  void *m_ptr;
  char m_char;
};

и простой сортировкой последовательности полей по убыванию размера:

struct MyStructOpt
{
  void *m_ptr;
  size_t m_size_t;
  int m_int;
  short m_short;
  char m_char;
};

мы сделаем из нее структуру размером всего 24 байт.

Диагностика

Инструмент PVS-Studio позволяет обнаружить структуры в коде 64-битных приложений, перестановка полей в которых, позволит сократить их размер. На неоптимальные структуры анализатор выдает диагностическое сообщение V802.

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

class MyWindow : public CWnd {
  bool m_isActive;
  size_t m_sizeX, m_ sizeY;
  char m_color[3];
  ...
};

Размер данной структуры может быть сокращен, но это не имеет практического смысла.

Авторы курса: Андрей Карпов ([email protected]), Евгений Рыжков ([email protected]).

Правообладателем курса «Уроки разработки 64-битных приложений на языке Си/Си++» является ООО «Системы программной верификации». Компания занимается разработкой программного обеспечения в области анализа исходного кода программ. Сайт компании: http://www.viva64.com.

Хотите получить бесплатную лицензию?

Министерство иностранных дел Китайской Народной Республики

Новые известия

Больше…

Си Цзиньпин направил телеграмму с соболезнованиями президенту Анголы Жоау Лоуренсу в связи с обрушившимися на страну проливными дождями


  27 апреля 2023 года председатель КНР Си Цзиньпин направил телеграмму с соболезнованиями президенту Анголы Жоау Лоуренсу в связи с обр. .. 27 апреля 2023 года председатель КНР Си Цзиньпин направил телеграмму с соболезнованиями президенту Анголы Жоау Лоуренсу в связи с обруши…

  • Си Цзиньпин встретился c членом Политбюро, постоянным секретарем Секретариата Центрального комитета Коммунистической партии Вьетнама, заведующей Организационным отделом ЦК КПВ Чыонг Тхи Май(2023-04-26)
  • Телефонный разговор Председателя Си Цзиньпина с Президентом Украины Владимиром Зеленским(2023-04-26)
  • Си Цзиньпин направил поздравительное письмо в адрес мероприятия, посвященного 50-й годовщине сотрудничества между Китаем и Всемирной организацией интеллектуальной собственности и Неделе интеллектуальной собственности(2023-04-26)
  • Си Цзиньпин направил поздравительное письмо в адрес Генеральной ассамблеи Альянса по защите культурного наследия в Азии(2023-04-25)
  • Си Цзиньпин принял верительные грамоты у послов иностранных государств в Китае(2023-04-24)
  • Си Цзиньпин направил поздравительное письмо в адрес 4-го Всемирного форума данных ООН(2023-04-24)
  • Си Цзиньпин направил поздравительную телеграмму президенту Бангладеш Мохаммеду Шахабуддину Чуппу по случаю вступления в должность(2023-04-24)
  • Си Цзиньпин направил Мигелю Диас-Канелю телеграмму с поздравлением с переизбранием на пост президента Кубы(2023-04-20)

Брифинги

Больше. ..

Очередная пресс-конференция 5 мая 2023 г. у официального представителя МИД КНР Мао Нин


  CCTV: 3 мая делегация представителей американской оборонной промышленности приняла участие в Тайваньско-американском форуме оборонн… CCTV: 3 мая делегация представителей американской оборонной промышленности приняла участие в Тайваньско-американском форуме оборонной …

  • Очередная пресс-конференция 4 мая 2023 г. у официального представителя МИД КНР Мао Нин(2023-05-04)
  • Очередная пресс-конференция 28 апреля 2023 г. у официального представителя МИД КНР Мао Нин(2023-04-28)
  • Очередная пресс-конференция 27 апреля 2023 г. у официального представителя МИД КНР Мао Нин(2023-04-27)
  • Очередная пресс-конференция 26 апреля 2023 г. у официального представителя МИД КНР Мао Нин(2023-04-26)
  • Очередная пресс-конференция 25 апреля 2023 г. у официального представителя МИД КНР Мао Нин(2023-04-25)
  • Очередная пресс-конференция 24 апреля 2023 г. у официального представителя МИД КНР Мао Нин(2023-04-24)

Заявления пресс-представителя

Больше…

Официальный представитель МИД КНР выступил с заявлением о «транзите» Цай Инвэнь через США


  В последние дни США, несмотря на строгое представление и неоднократные предупреждения Китая, настояли на разрешении лидеру Тайваня… В последние дни США, несмотря на строгое представление и неоднократные предупреждения Китая, настояли на разрешении лидеру Тайваня Ца…

  • Официальный представитель МИД КНР выступил с заявлением по поводу установления дипломатических отношений между Китаем и Гондурасом(2023-03-26)
  • Официальный представитель МИД ответил на вопрос журналиста об отклонении СПЧ ООН предложения стран Запада о проведении дебатов по Синьцзяну(2022-10-06)
  • Комментарий официального представителя МИД КНР в связи с проведением США «саммита за демократию»(2021-12-11)
  • Официальный представитель МИД КНР Хуа Чуньин ответила на вопрос СМИ относительно теракта в метро Санкт-Петербурга(2017-04-04)
  • Официальный представитель МИД КНР Хуа Чуньин ответила на вопрос журналистов(2017-03-23)
  • Официальный представитель МИД КНР Гэн Шуан ответил на вопрос СМИ относительно опубликованного Великобританией «Полугодичного доклада по вопросам Сянгана»(2017-02-24)

Si Crystal Structure — SpringerMaterials

Неорганические твердые фазы

Получить доступ СИФ Скачать справку (pdf)

У вас нет доступа к этому содержимому

Опции доступа
Дополнительные опции доступа
  • Свяжитесь с нами, если вам нужна помощь в доступе к этому контенту
  • Узнайте об институциональных подписках

Просмотр трехмерной интерактивной структуры

Цитировать эту страницу

  • Цитата

Кристаллографические данные

Параметры ячейки

Стандартизированные данные

Космическая группа

У вас нет доступа к этому содержимому

Опции доступа
Дополнительные опции доступа
  • Свяжитесь с нами, если вам нужна помощь в доступе к этому контенту
  • Узнайте об институциональных подписках
и
б
с
α
β
γ
а/б
б/к
к/с
В

Координаты атома

Стандартизированный

У вас нет доступа к этому содержимому

Параметры доступа
Дополнительные возможности доступа
  • Свяжитесь с нами, если вам нужна помощь в доступе к этому контенту
  • Узнайте об институциональных подписках

Опубликовано

У вас нет доступа к этому содержимому

Опции доступа
Дополнительные опции доступа
  • Свяжитесь с нами, если вам нужна помощь в доступе к этому контенту
  • Узнайте об институциональных подписках

Детали эксперимента

У вас нет доступа к этому содержимому

Варианты доступа
Дополнительные возможности доступа
  • Свяжитесь с нами, если вам нужна помощь в доступе к этому контенту
  • Узнайте об институциональных подписках

Ссылка

У вас нет доступа к этому содержимому

Опции доступа
Дополнительные опции доступа
  • Свяжитесь с нами, если вам нужна помощь в доступе к этому контенту
  • Узнайте об институциональных подписках

3D интерактивная структура

У вас нет доступа к этому содержимому

Опции доступа
Дополнительные опции доступа
  • Свяжитесь с нами, если вам нужна помощь в доступе к этому контенту
  • Узнайте об институциональных подписках

Об этом контенте

  • Имя базы данных

    PAULING FILE Multinaries Edition — 2022 г.

  • Идентификатор набора данных

    sd_0530557

  • Авторские права

    © Springer и система данных о фазах материалов (MPDS), Швейцария и Национальный институт материаловедения (NIMS), Япония, 2016 г.

  • Главный редактор

    Пьер Виллар, Система данных о фазах материалов (MPDS), CH-6354 Вицнау, Швейцария

    вилларс[email protected]

  • Кредиты

  • Цитировать этот контент

    Пьер Виллар (главный редактор), PAULING FILE in: Inorganic Solid Phases, SpringerMaterials (онлайн-база данных), Springer, Гейдельберг (ред. ) SpringerМатериалы Кристаллическая структура кремния sd_0530557 (Springer-Verlag GmbH, Гейдельберг, © 2016)

    Скачать эту цитату

    Цитата скопирована

    sd_0530557

    Грамматика испанского языка в контексте — справочная грамматика с видеопримерами из коллекции «Испанский язык в Техасе» Они относятся к настоящему, прошлому и будущему. Эти условные предложения состоят из двух частей: условие, или

    si , и основное или результатное предложение, которое указывает, что произойдет, если условие si пункт выполнен.

    Время предложения результата зависит от времени предложения si . Другими словами, время двух предложений следует предписанной последовательности.

    Si  + Настоящее Индикативное

    Этот первый тип оговорки  si  используется в случаях, когда условие может быть выполнено и, таким образом, последствие рассматривается как  возможное 9033 8 . Си  оговорки в настоящем изъявительном падеже могут сопровождаться оговорками-результатами в настоящем изъявительном, будущем или повелительном наклонении:

    Si veo que ellos me contestan en inglés, sigo hablando con ellos en inglés.
    Если я увижу , что они отвечают мне на английском, я продолжаю говорить с ними по-английски.
    Обратите внимание, что либо предложение si , либо предложение результата могут начинать предложение, но одни и те же времена остаются специфическими для каждого предложения.

    Si  + Прошедшее (несовершенное) Сослагательное наклонение

    Этот второй тип предложения si противоречит действительности в настоящем. Таким образом, следствие рассматривается как невозможное . Обратите внимание, что в испанском языке несовершенное (прошедшее) сослагательное наклонение используется в предложении si , а не в условном.

    Si fuera lugar u objeto, yo diría que la televisión.
    Если то было (были) место или предмет, я сказал бы телевидение.

    Si  + Pluperfect Subjunctive

    Этот последний тип предложения si используется для ситуаций, которые противоречат прошлым фактам. Предложение результата, таким образом, выражает нереализованную прошедшую возможность и находится в условном времени прошедшего времени.

    Si hubiera estudiado más, habría sacado notas mejores. Если бы я учился на больше, я получил бы на лучших оценок.

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

    Оставить комментарий

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *