Сам по себе рост размера структур не является ошибкой, но может приводить к потреблению необоснованного количества памяти и в результате к замедлению скорости работы программы. Будем рассматривать данный паттерн не как ошибку, но как причину неэффективности 64-битного кода.
Урок 15. Паттерн 7. Упаковка указателейTatyanazaxarovaБольшое количество ошибок при миграции на 64-битные системы связано с изменением соотношения между размером указателя и размером обычных целых. В среде с моделью данных ILP32 обычные целые и указатели имеют одинаковый размер. К сожалению, 32-битный код повсеместно опирается на это предположение. Указатели часто приводятся к int, unsigned, long, DWORD и другим неподходящим типам.
Урок 13. Паттерн 5. Адресная арифметикаTatyanazaxarovaМы специально выбрали номер "тринадцать" для этого урока, поскольку ошибки, связанные с адресной арифметикой в 64-битных системах, являются наиболее коварными. Надеемся, число 13 заставит вас быть внимательнее.
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarovaВажным элементом переноса программного решения на новую платформу является преемственность к существующим протоколам обмена данными. Необходимо обеспечить чтение существующих форматов проектов, осуществлять обмен данными между 32-битными и 64-битными процессами и так далее.
Урок 21. Паттерн 13. Выравнивание данныхTatyanazaxarovaПроцессоры работают эффективнее, когда имеют дело с правильно выровненными данными. А некоторые процессоры вообще не умеют работать с не выровненными данными.
Разработка статического анализатора кода для обнаружения ошибок переноса прог...TatyanazaxarovaВ статье рассмотрена задача разработки программного инструмента под названием статический анализатор. Разрабатываемый инструмент используется для диагностики потенциально опасных синтаксических конструкций языка Си++ с точки зрения переноса программного кода на 64-битные системы. Акцент сделан не на самих проблемах переноса, возникающих в программах, а на особенностях создания специализированного анализатора кода. Анализатор предназначен для работы с кодом программ на языках Си и Си++.
Урок 26. Оптимизация 64-битных программTatyanazaxarovaПосле компиляции программы в 64-битном режиме она начинает потреблять большее количество памяти, чем ее 32-битный вариант. Часто это увеличение почти незаметно, но иногда потребление памяти может возрастать в 2 раза.
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarovaВ статье производится сравнение специализированного статического анализатора Viva64 со статическими анализаторами общего назначения Parasoft C++test и Gimpel Software PC-Lint. Сравнение производится в рамках задачи переноса 32-битного Си/Си++ кода на 64-битные системы или разработки нового кода с учетом особенностей 64-битной архитектуры.
Особенности разработки 64-битных приложенийTatyanazaxarovaЧто же получили программисты с приходом 64-битных систем? Помимо многочисленных преимуществ, о которых написаны сотни и тысячи рекламных статей, программисты получили целый набор задачек, головоломок и даже ловушек, с которыми предстоит столкнуться всем, кто хочет получить реальные преимущества от переноса кода на 64-битные системы.
20 ловушек переноса Си++ - кода на 64-битную платформуTatyanazaxarovaРассмотрены программные ошибки, проявляющие себя при переносе Си++ - кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Что такое size_t и ptrdiff_tTatyanazaxarovaСтатья поможет читателю разобраться, что представляют собой типы size_t и ptrdiff_t, для чего они нужны и когда целесообразно их использование. Статья будет интересна разработчикам, начинающим создание 64-битных приложений, где использование типов size_t и ptrdiff_t обеспечивает быстродействие, возможность работы с большими объемами данных и переносимость между разными платформами.
Урок 5. Сборка 64-битного приложенияTatyanazaxarovaХочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64-битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать процесс.
Урок 9. Паттерн 1. Магические числаTatyanazaxarovaВ некачественном коде часто встречаются магические числовые константы, наличие которых опасно само по себе. При миграции кода на 64-битную платформу эти константы могут сделать код неработоспособным, если участвуют в операциях вычисления адреса, размера объектов или в битовых операциях.
Статический анализ исходного кода на примере WinMergeTatyanazaxarovaСегодня я хочу посвятить пост тематике, почему инструменты анализа исходного кода полезны вне зависимости от уровня знаний и опыта программиста. А польза такого анализа будет продемонстрирована на примере инструмента, который известен всем программистам - WinMerge.
Безопасность 64-битного кодаTatyanazaxarovaВ статье рассматриваются вопросы обеспечения безопасности программного кода при его адаптации для 64-битных систем.
Урок 11. Паттерн 3. Операции сдвигаTatyanazaxarovaЛегко сделать ошибку в коде, работающем с отдельными битами. Рассматриваемый паттерн 64-битных ошибок связан с операциями сдвига.
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarovaВ результате появления на рынке персональных компьютеров 64-битных процессоров, перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После такого переноса кода приложение может вести себя некорректно. В статье рассматривается вопрос разработки и применения статического анализатора кода для проверки правильности таких приложений. Приводятся проблемы, возникающие в приложениях после перекомпиляции для 64-битных систем, а также правила, по которым выполняется проверка кода.
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarovaОсобенностью объединения (union) является то, что для всех элементов (членов) объединения выделяется одна и та же область памяти, то есть они перекрываются. Хотя доступ к этой области памяти возможен с использованием любого из элементов, элемент для этой цели должен выбираться так, чтобы полученный результат был осмысленным.
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryTatyanazaxarovaВ этой статье Анатолий Кузнецов отвечает на вопросы и рассказывает об открытой библиотеке BitMagic C++ Library.
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarovaСтатья представляет собой наиболее полную коллекцию примеров 64-битных ошибок на языках Си и Си++. Статья ориентирована на разработчиков Windows-приложений, использующих Visual C++, но будет полезна и более широкой аудитории.
Оптимизация в мире 64-битных ошибокTatyanazaxarovaВ предыдущей записи блога я обещал рассказать, почему сложно демонстрировать 64-битные ошибки на простых примерах. Разговор касался operator[] и я говорил, что в простых случая может работать даже явно некорректный код.
Правила статического анализа кода для диагностики потенциально опасных констр...Sergey VasilyevВ статье сформулированы правила диагностики потенциально опасных синтаксических конструкций в исходном коде программ на языке Си++. Описаны принципы построения статического анализатора исходного кода, реализующего проверку указанных правил.
Статический анализ Си++ кода и новый стандарт языка C++0xTatyanazaxarovaВ статье рассмотрены новые возможности языка Си++, описанные в стандарте C++0x и поддержанные в Visual Studio 2010. На примере PVS-Studio рассмотрено, как изменения языка отразятся на инструментах статического анализа кода.
64-битный конь, который умеет считатьTatyanazaxarovaСтатья посвящена особенностям поведения компилятора Visual C++ при генерации 64-битного кода и связанными с этим потенциальными ошибками.
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarovaПри разработке 64-битной версии приложения дополнительное внимание стоит уделить и вопросу дистрибуции программы. Ведь при установке на 64-битной операционной системе есть несколько нюансов, забыв о которых можно получить неработающий инсталляционный пакет.
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarovaДанная статья содержит различные примеры 64-битных ошибок, собранные в демонстрационном примере PortSample. Однако, начиная с версии PVS-Studio 3.63, вместо PortSample в дистрибутив PVS-Studio включается более новая версия примеров, которая называется OmniSample. Поэтому некоторые скриншоты в статье не соответствуют актуальному состоянию дел.
More Related Content
Similar to Урок 23. Паттерн 15. Рост размеров структур (20)
Урок 26. Оптимизация 64-битных программTatyanazaxarovaПосле компиляции программы в 64-битном режиме она начинает потреблять большее количество памяти, чем ее 32-битный вариант. Часто это увеличение почти незаметно, но иногда потребление памяти может возрастать в 2 раза.
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarovaВ статье производится сравнение специализированного статического анализатора Viva64 со статическими анализаторами общего назначения Parasoft C++test и Gimpel Software PC-Lint. Сравнение производится в рамках задачи переноса 32-битного Си/Си++ кода на 64-битные системы или разработки нового кода с учетом особенностей 64-битной архитектуры.
Особенности разработки 64-битных приложенийTatyanazaxarovaЧто же получили программисты с приходом 64-битных систем? Помимо многочисленных преимуществ, о которых написаны сотни и тысячи рекламных статей, программисты получили целый набор задачек, головоломок и даже ловушек, с которыми предстоит столкнуться всем, кто хочет получить реальные преимущества от переноса кода на 64-битные системы.
20 ловушек переноса Си++ - кода на 64-битную платформуTatyanazaxarovaРассмотрены программные ошибки, проявляющие себя при переносе Си++ - кода с 32-битных платформ на 64-битные платформы. Приведены примеры некорректного кода и способы его исправления. Перечислены методики и средства анализа кода, позволяющие диагностировать обсуждаемые ошибки.
Что такое size_t и ptrdiff_tTatyanazaxarovaСтатья поможет читателю разобраться, что представляют собой типы size_t и ptrdiff_t, для чего они нужны и когда целесообразно их использование. Статья будет интересна разработчикам, начинающим создание 64-битных приложений, где использование типов size_t и ptrdiff_t обеспечивает быстродействие, возможность работы с большими объемами данных и переносимость между разными платформами.
Урок 5. Сборка 64-битного приложенияTatyanazaxarovaХочется сразу предупредить читателя, что невозможно всесторонне описать процесс сборки 64-битного приложения. Настройки любого проекта достаточно уникальны, поэтому к адаптации настроек для 64-битной системы всегда надо подходить внимательно. В уроке будут описаны только общие шаги, которые важны для любого проекта. Эти шаги подскажут вам с чего начать процесс.
Урок 9. Паттерн 1. Магические числаTatyanazaxarovaВ некачественном коде часто встречаются магические числовые константы, наличие которых опасно само по себе. При миграции кода на 64-битную платформу эти константы могут сделать код неработоспособным, если участвуют в операциях вычисления адреса, размера объектов или в битовых операциях.
Статический анализ исходного кода на примере WinMergeTatyanazaxarovaСегодня я хочу посвятить пост тематике, почему инструменты анализа исходного кода полезны вне зависимости от уровня знаний и опыта программиста. А польза такого анализа будет продемонстрирована на примере инструмента, который известен всем программистам - WinMerge.
Безопасность 64-битного кодаTatyanazaxarovaВ статье рассматриваются вопросы обеспечения безопасности программного кода при его адаптации для 64-битных систем.
Урок 11. Паттерн 3. Операции сдвигаTatyanazaxarovaЛегко сделать ошибку в коде, работающем с отдельными битами. Рассматриваемый паттерн 64-битных ошибок связан с операциями сдвига.
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarovaВ результате появления на рынке персональных компьютеров 64-битных процессоров, перед разработчиками программ возникает задача переноса старых 32-битных приложений на новую платформу. После такого переноса кода приложение может вести себя некорректно. В статье рассматривается вопрос разработки и применения статического анализатора кода для проверки правильности таких приложений. Приводятся проблемы, возникающие в приложениях после перекомпиляции для 64-битных систем, а также правила, по которым выполняется проверка кода.
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarovaОсобенностью объединения (union) является то, что для всех элементов (членов) объединения выделяется одна и та же область памяти, то есть они перекрываются. Хотя доступ к этой области памяти возможен с использованием любого из элементов, элемент для этой цели должен выбираться так, чтобы полученный результат был осмысленным.
Интервью с Анатолием Кузнецовым, автором библиотеки BitMagic C++ LibraryTatyanazaxarovaВ этой статье Анатолий Кузнецов отвечает на вопросы и рассказывает об открытой библиотеке BitMagic C++ Library.
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarovaСтатья представляет собой наиболее полную коллекцию примеров 64-битных ошибок на языках Си и Си++. Статья ориентирована на разработчиков Windows-приложений, использующих Visual C++, но будет полезна и более широкой аудитории.
Оптимизация в мире 64-битных ошибокTatyanazaxarovaВ предыдущей записи блога я обещал рассказать, почему сложно демонстрировать 64-битные ошибки на простых примерах. Разговор касался operator[] и я говорил, что в простых случая может работать даже явно некорректный код.
Правила статического анализа кода для диагностики потенциально опасных констр...Sergey VasilyevВ статье сформулированы правила диагностики потенциально опасных синтаксических конструкций в исходном коде программ на языке Си++. Описаны принципы построения статического анализатора исходного кода, реализующего проверку указанных правил.
Статический анализ Си++ кода и новый стандарт языка C++0xTatyanazaxarovaВ статье рассмотрены новые возможности языка Си++, описанные в стандарте C++0x и поддержанные в Visual Studio 2010. На примере PVS-Studio рассмотрено, как изменения языка отразятся на инструментах статического анализа кода.
64-битный конь, который умеет считатьTatyanazaxarovaСтатья посвящена особенностям поведения компилятора Visual C++ при генерации 64-битного кода и связанными с этим потенциальными ошибками.
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarovaПри разработке 64-битной версии приложения дополнительное внимание стоит уделить и вопросу дистрибуции программы. Ведь при установке на 64-битной операционной системе есть несколько нюансов, забыв о которых можно получить неработающий инсталляционный пакет.
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarovaДанная статья содержит различные примеры 64-битных ошибок, собранные в демонстрационном примере PortSample. Однако, начиная с версии PVS-Studio 3.63, вместо PortSample в дистрибутив PVS-Studio включается более новая версия примеров, которая называется OmniSample. Поэтому некоторые скриншоты в статье не соответствуют актуальному состоянию дел.
Урок 24. Фантомные ошибкиTatyanazaxarovaМы закончили рассмотрение паттернов 64-битных ошибок. Последнее на чем мы остановимся в связи с этими ошибками, является то, как они могут проявляться в программах.
Урок 20. Паттерн 12. ИсключенияTatyanazaxarovaГенерирование и обработка исключений с участием целочисленных типов не является хорошей практикой программирования на языке Си++. Для этих целей следует использовать более информативные типы, например классы, производные от класса std::exception.
Урок 17. Паттерн 9. Смешанная арифметикаTatyanazaxarovaНадеемся, вы уже успели отдохнуть от 13 урока и теперь сможете рассмотреть еще один важный паттерн ошибок, связанный с арифметическими выражениями, в которых участвуют типы различной размерности.
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarovaКлассическими примерами, приводимыми во многих статьях по проблемам переноса программ на 64-битные системы, является некорректное использование функций printf, scanf и их разновидностей.
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarovaСтатический анализ кода - методология выявления ошибок в программном коде, основанная на просмотре программистом участков кода, помеченных статическим анализатором. Помеченные участки кода с большой вероятностью содержат ошибки определенного типа.
Урок 7. Проблемы выявления 64-битных ошибокTatyanazaxarovaСуществуют различные подходы к выявлению ошибок в программном коде. Рассмотрим основные методологии и их эффективность в выявлении 64-битных ошибок.
Урок 6. Ошибки в 64-битном кодеTatyanazaxarovaИсправление всех ошибок компиляции и предупреждений не будет означать работоспособность 64-битного приложения. И именно описанию и диагностике 64-битных ошибок будет посвящена основная часть уроков. Также не надейтесь на помощь ключа /Wp64, который многими часто без оснований преподносится при обсуждениях в форумах как чудесное средство поиска 64-битных ошибок.
Урок 4. Создание 64-битной конфигурацииTatyanazaxarovaВначале следует убедиться, что используемая вами редакция Visual Studio позволяет собирать 64-битный код. Если вы планируете разрабатывать 64-битные приложения с использованием последней версии (на момент написания курса) Visual Studio 2008, то следующая таблица поможет определить, какая из редакций Visual Studio вам необходима.
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarovaИнструмент PVS-Studio
набор правил Viva64 для анализа 64-битных приложений;
набор правил VivaMP для анализа параллельных приложений;
набор правил для анализа общего назначения.
Лицензионная и ценовая политика PVS-Studio
Информация о компании ООО «СиПроВер»
Статический анализ Си++ кодаTatyanazaxarovaМы все допускаем ошибки при программировании и тратим массу времени на их устранение.
Один из методов который позволяет быстро диагностировать дефекты – статический анализ исходного кода.
PVS-Studio TatyanazaxarovaPVS-Studio - статический анализатор, выявляющий ошибки в исходном коде приложений на языке C/C++/C++0x. Можно выделить 3 набора правил, включенных в состав PVS-Studio:
1. Диагностика 64-битных ошибок (Viva64)
2. Диагностика параллельных ошибок (VivaMP)
3. Диагностика общего назначения
PVS-Studio научился следить за тем, как вы программируетеTatyanazaxarovaВ PVS-Studio появился режим работы, который поможет максимально рано выявлять ошибки и опечатки. Анализатор запускается сразу после компиляции файлов и если что-то не так, покраснеет от стыда за ваш код. Фича доступна на данный момент только для пользователей Visual Studio 2010.
Пояснения к статье про Copy-PasteTatyanazaxarovaМногим читателя понравилась моя статья "Последствия использования технологии Copy-Paste при программировании на Си++ и как с этим быть" [1]. Обратил на неё внимание и Scott Meyers [2] и задал вопрос о том, как же собственно статический анализ помог выявить описанные в статье ошибки.
Использование анализатора PVS-Studio в процессе инкрементальной сборки в Micr...TatyanazaxarovaОдним из нововведений в последних версиях MSBuild/Visual Studio для компиляторов Visual C++ стала новая система минимальной сборки (также известная как инкрементная сборка), основанная на отслеживании зависимостей между входными и выходными данными при работе компилятора и позволяющая осуществлять пересборку только для файлов, затронутых модификацией исходного кода или не имеющих связанных с ними выходных объектных файлов. В отличие от старой методики минимальной пересборки, завязанной на генерируемые компилятором cl.exe файлы состояний (idb-файлы, Minimal Rebuild Dependancy Database, ключ /Gm) и обладавшей рядом недостатков (как например затруднённость распараллеливания сборки из-за конфликтов доступа и отсутствие прямого отслеживания выходных объектный файлов), новая система не зависит от типа используемых сборочных инструментов (может использоваться как для компиляции, так и для линковки) и имеет открытый API. Данная новинка позволила интегрировать проверку кода анализатором PVS-Studio в процесс разработки на C/C++ с использованием инкрементных пересборок для последней версии Visual Studio 2010. Эта возможность появилась в версии PVS-Studio 4.30.
Статический анализ и ROITatyanazaxarovaЯ регулярно общаюсь с потенциальными пользователями, озабоченными ошибками в программах на языке Си++. Их озабоченность выражается в том, что они пробуют инструмент PVS-Studio и начинают писать о том, что при испытаниях что-то подозрительно мало ошибок было найдено. И хотя, вроде чувствуется, что инструмент им интересен, их реакция полна скептицизма.
Вечный вопрос измерения времениTatyanazaxarovaКазалось, закончились долгие обсуждения в форумах, как измерить время работы алгоритма, какие функции использовать, какую точность ожидать. Жаль, но опять придется вернуться к этому вопросу. На повестке дня вопрос – как лучше измерить скорость работы параллельного алгоритма.
По колено в Си++ г... кодеTatyanazaxarovaНаверное, многие знают сайт govnokod.ru. Если нет - рекомендую заглянуть тем, кто считает себя программистом. Хорошее настроение будет обеспечено.
Статический анализ и регулярные выраженияTatyanazaxarovaЯ занимаюсь разработкой статического анализатор кода PVS-Studio для анализа программ на языке Си/Си++. После появления в PVS-Studio 4.00 анализа общего назначения мы получили множество откликов, как положительных, так и отрицательных. Кстати, предлагаю скачать новую версию PVS-Studio, в которой благодаря откликам людей было поправлено большое количество ошибок и недочетов.
1. Урок 23. Паттерн 15. Рост размеров
структур
Сам по себе рост размера структур не является ошибкой, но может приводить к потреблению
необоснованного количества памяти и в результате к замедлению скорости работы программы.
Будем рассматривать данный паттерн не как ошибку, но как причину неэффективности 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
{
2. 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;
3. 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-битных приложений,
перестановка полей в которых, позволит сократить их размер. На неоптимальные структуры
анализатор выдает диагностическое сообщение V401.
4. Анализатор не всегда выдает сообщение о неэффективности структур, так как старается сократить
количество излишних предупреждений. Например, анализатор не выдает предупреждение на
сложные классы, являющимися наследниками, поскольку такие объекты обычно создаются в
малом количестве. Пример:
class MyWindow : public CWnd {
bool m_isActive;
size_t m_sizeX, m_ sizeY;
char m_color[3];
...
};
Размер данной структуры может быть сокращен, но это не имеет практического смысла.
Авторы курса: Андрей Карпов (karpov@viva64.com), Евгений Рыжков (evg@viva64.com).
Правообладателем курса "Уроки разработки 64-битных приложений на языке Си/Си++"
является ООО "Системы программной верификации". Компания занимается разработкой
программного обеспечения в области анализа исходного кода программ. Сайт компании:
http://www.viva64.com.
Контактная информация: e-mail: support@viva64.com, 300027, г. Тула, а/я 1800.