Что включать в stdafx.h
Все файлы, включающие «stdafx.h», зависят от его содержимого. Пусть в «stdafx.h» включен файл «X.h». Если вы поменяете хоть что-то в «X.h», это может повлечь полную перекомпиляцию всего проекта.
Правило. Включайте в «stdafx.h» только те файлы, которые никогда не изменяются или меняются ОЧЕНЬ редко. Хорошими кандидатами являются заголовочные файлы системных и сторонних библиотек.
Если включаете в «stdafx.h» собственные файлы из проекта, соблюдайте двойную бдительность. Включайте только те файлы, которые меняются очень- очень редко.
Если какой-то *.h файл меняется раз в месяц, это уже слишком часто. Как правило, редко удаётся сделать все правки в h-файле с первого раза. Обычно требуется 2-3 итерации. Согласитесь, 2-3 раза полностью перекомпилировать весь проект — занятие неприятное. Плюс полная перекомпиляция потребуется всем вашим коллегам.
Не увлекайтесь с неизменяемыми файлами. Включайте только то, что действительно часто используется. Нет смысла включать <set>, если это нужно только в двух местах. Там, где нужно, там и подключите этот заголовочный файл.
Как работают Precompiled Headers
Файл *.pch возникает после компиляции stdafx.cpp. Файл собирается с ключом «/Yc». Этот ключ как раз и говорит компилятору, что нужно создать precompiled headers. Файл stdafx.cpp может содержать одну строчку: #include «stdafx.h».
В файле «stdafx.h» находится самое интересное. Сюда нужно включить заголовочные файлы, которые будут заранее препроцессироваться. В качестве примера, вот файл stdafx.h, используемый нами в PVS-Studio (файл сокращён для статьи):
Теперь во все файлы *.c/*.cpp следует включить «stdafx.h». Заодно стоит удалить из этих файлов заголовки, которые уже включаются с помощью «stdafx.h».
А что делать, если используются хотя и похожие, но разные наборы заголовочных файлов? Например, такие:
- Файл A: <vector>, <string>
- Файл B: <vector>, <algorithm>
- Файл C: <string>, <algorithm>
Достаточно сделать один precompiled header, в котором будут раскрыты <vector>, <string> и <algorithm>. Выигрыш от того, что при препроцессировании не надо читать множество файлов и вставлять их друг друга намного больше, чем потери на синтаксический анализ лишних фрагментов кода.
6 ответов
столкнулся с проблемой отсутствует stdlib.h и stdio.h (и, возможно, больше) после установки сообщества VS2017 на новый компьютер и переноса решения с VS2013 на VS2017.
используется @Maxim Akristiniy’s предложение, но по-прежнему получил сообщение об ошибке относительно совместимости toolset. Однако VS сам предложил сделать решение retarget, щелкнув правой кнопкой мыши по решению в Обозреватель, затем выберите Retarget solution из меню и обновляется!–3–> из выпадающего списка.
теперь мои проекты строят без проблемы.
обратите внимание,что вам может потребоваться сделать проект стартовым проектом для переориентации. существует три способа решить эту проблему
существует три способа решить эту проблему.
- Игнорировать Предкомпилированных Заголовков #1действия: проект > свойства > свойства конфигурации > C / C++ > Командная строка > в поле Дополнительные параметры add / Y-. (скриншот страницы свойств) > Ok > Удалить #include “stdafx.h”
- Игнорировать Предкомпилированных Заголовков #2действия: Файл > Создать > Проект > … > В окне Мастера приложений нажмите кнопку Далее > снимите флажок предварительно скомпилированный заголовок > готово > удалить #include “stdafx.h”
-
Переустановите Visual StudioЭто также сработало для меня, потому что я понял, что, возможно, что-то не так с моим Windows SDK. Я использовал Windows 10, но с Windows SDK 8.1. Вы можете иметь эту проблему.действия: открыть установщик Visual Studio > нажмите на трехстрочную строку меню > Удалить > перезагрузить компьютер > открыть установщик Visual Studio > Установите то, что вы хотите, но убедитесь, что вы устанавливаете только последнюю версию Windows SDK 10, а не несколько или 8.1.
при первой установке Visual Studio я получу сообщение об ошибке, указывающее, что мне нужно установить Windows SDK 8.1. Так я и сделал, через опцию изменения установщика Visual Studio. Возможно, это была проблема, потому что я установил его после установки Visual Studio или потому, что мне нужен SDK 10. На всякий случай я сделал полную переустановку.
на случай, если вы не хотите поднимать Windows SDK до Windows 10 (например, вы можете работать над проектом с открытым исходным кодом, где решение не ваше), вы можете решить эту проблему в проекте Windows SDK 8.1, перейдя Tools -> Get Tools and Features… -> Individual Compontents tab и установка отдельных компонентов “Windows 8.1 SDK” (под SDK, библиотеками и фреймворками) и “Windows Universal CRT SDK” (под Comiplers, инструментами сборки и временем выполнения):
У меня была аналогичная проблема после обновления моего VS2017. Проект построен хорошо, но много ошибок, когда код был воспитан в Редакторе. Даже попытался переустановить VS. Я смог решить его, установив параметр “игнорировать стандартные пути включения” в Yes. Попытка построить решение с большим количеством ошибок. Вернулся и установил параметр нет. После восстановления моя проблема исчезла.
Лексический анализ
Первая фаза компиляции называется лексическим анализом или сканированием.
Лексический анализатор соответственно так же называется лексером или сканером.
Лексический анализатор сканирует входной поток символов (исходного текста программы) и выделяет значащие последовательности символов, называемые лексемами.
Для каждой лексемы анализатор выводит токен, представляющий из себя комбинацию абстрактного символа (названия типа токена) и произвольного набора атрибутов. Часто в качестве “набора атрибутов” выступает ссылка в глобальную таблицу, называемую таблицей символов.
Препроцессор
Параметр | Цель |
---|---|
Указывает каталог поиска для разрешения ссылок на файлы, указанные в директиве #using . | |
Сохраняет комментарии на этапе предварительной обработки. | |
Определяет константы и макросы. | |
Копирует выходные данные препроцессора в стандартный вывод. | |
Копирует выходные данные препроцессора в стандартный вывод. | |
Выполняет предварительную обработку указанного включаемого файла. | |
Принудительно использует имя файла, как если бы оно было передано в директиву #using . | |
Выполняет слияние введенного кода с исходным файлом. | |
Осуществляет поиск включаемых файлов в каталоге. | |
Записывает выходные данные препроцессора в файл. | |
Удаляет предварительно определенный макрос. | |
Удаляет все предварительно определенные макросы. | |
Пропускает стандартный каталог включаемых файлов. |
Вступление
Типичный компилятор выполняет следующие шаги:
- Разбор: исходный текст преобразуется в абстрактное синтаксическое дерево (AST).
- Разрешение ссылок на другие модули (C откладывает этот шаг до ссылки).
- Семантическая проверка: отсеивание синтаксически правильных утверждений, которые не имеют смысла, например недоступный код или дубликаты объявлений.
- Эквивалентные преобразования и оптимизация высокого уровня: AST преобразуется для представления более эффективных вычислений с той же семантикой. Это включает, например, раннее вычисление общих подвыражений и константных выражений, устраняя чрезмерные локальные назначения (см. также SSA ) и т. д.
- Генерация кода: AST преобразуется в линейный низкоуровневый код с переходами, распределением регистров и т. П. Некоторые вызовы функций могут быть встроены на этом этапе, некоторые циклы развернуты и т.д.
- Оптимизация глазка: низкоуровневый код сканируется для выявления простых локальных неэффективностей, которые устраняются.
Большинство современных компиляторов (например, gcc и clang) повторяют последние два шага еще раз. Они используют промежуточный низкоуровневый, но независимый от платформы язык для начальной генерации кода. Затем этот язык преобразуется в специфичный для платформы код (x86, ARM и т.д.), Что делает примерно то же самое оптимизированным для платформы способом. Это включает, например, использование векторных команд, когда это возможно, переупорядочение команд для повышения эффективности прогнозирования ветвлений и так далее.
После этого объектный код готов к связыванию. Большинство компиляторов нативного кода знают, как вызывать компоновщик для создания исполняемого файла, но сам по себе это не этап компиляции. В таких языках, как Java и C # ссылки могут быть полностью динамическими, что делается с помощью VM во время загрузки).
Какие ошибки может определить компилятор?
Когда компилятор анализирует текст программы, он проверяет, соответствует ли запись оператора стандартам языка. Если найдено несоответствие, то компилятор выводит об этом информацию пользователю в виде ошибки. Когда вся программа разобрана, пользователь видит список ошибок, которые есть в коде, и может их исправить.
Пока программист не исправит ошибки, компилятор не перейдет к следующему этапу — генерации машинного кода для процессора.
Чаще всего компилятор показывает пользователю:
- ошибки объявления переменных или отсутствие их начальных значений
- ошибки несоответствия типов
- ошибки неправильной записи операторов и функций
Иногда компилятор определяет код, который при выполнении дает неправильный результат. Но преобразовать такую программу в машинный код все-таки можно. В этом случае компилятор показывает пользователю предупреждение
Такая реакция компилятора больше похожа на рекомендации, но на них стоит обратить внимание. Программист сам решает оставить код с предупреждением или изменить программу.
Анализируя текст программы, компилятор не только ищет ошибки, но еще и упрощает ее код
Такой процесс называется оптимизацией.
Во время оптимизации компилятор изменяет программный код, но функции, которые выполняла программа, остаются прежними.
За и против
Основным аргументом за использование процесса компиляции является скорость. Возможность компилировать любой программный код в машинный, который может понять процессор ПК, исключает использование промежуточного кода. Можно запускать программы без дополнительных шагов, тем самым увеличивая скорость обработки кода.
Но наибольшим недостатком компиляции является специфичность. Когда компилируете программу для работы на конкретном процессоре, вы создаете объектный код, который будет работать только на этом процессоре. Если хотите, чтобы программа запускалась на другой машине, вам придется перекомпилировать программу под этот процессор. А перекомпиляция может быть довольно сложной, если процессор имеет ограничения или особенности, не присущие первому. А также может вызывать ошибки компиляции.
Основное преимущество интерпретации — гибкость. Можно не только запускать интерпретируемую программу на любом процессоре или платформе, для которых интерпретатор был скомпилирован. Написанный интерпретатор может предложить дополнительную гибкость. В определенном смысле интерпретаторы проще понять и написать, чем компиляторы.
С помощью интерпретатора проще добавить дополнительные функции, реализовать такие элементы, как сборщики мусора, а не расширять язык.
Другим преимуществом интерпретаторов является то, что их проще переписать или перекомпилировать для новых платформ.
Написание компилятора для процессора требует добавления множества функций, или полной переработки. Но как только компилятор написан, можно скомпилировать кучу интерпретаторов и на выходе мы имеем перспективный язык. Не нужно повторно внедрять интерпретатор на базовом уровне для другого процессора.
Самым большим недостатком интерпретаторов является скорость. Для каждой программы выполняется так много переводов, фильтраций, что это приводит к замедлению работы и мешает выполнению программного кода.
Это проблема для конкретных real-time приложений, таких как игры с высоким разрешением и симуляцией. Некоторые интерпретаторы содержат компоненты, которые называются just-in-time компиляторами (JIT). Они компилируют программу непосредственно перед ее исполнением. Это специальные программы, вынесенные за рамки интерпретатора. Но поскольку процессоры становятся все более мощными, данная проблема становится менее актуальной.
Как работают Precompiled Headers
Файл, который содержит precompiled headers, имеет расширение «.pch». Имя файла обычно совпадает с названием проекта. Естественно, это и другие используемые имена можно изменить в настройках. Файл может быть весьма большим и зависит от того, как много заголовочных файлов в нём раскрыто. Например, в проекте PVS-Studio он занимает около 3 мегабайт.
Файл *.pch возникает после компиляции stdafx.cpp. Файл собирается с ключом «/Yc». Этот ключ как раз и говорит компилятору, что нужно создать precompiled headers. Файл stdafx.cpp может содержать одну строчку: #include «stdafx.h».
В файле «stdafx.h» находится самое интересное. Сюда нужно включить заголовочные файлы, которые будут заранее препроцессироваться. В качестве примера, вот файл stdafx.h, используемый нами в PVS-Studio (файл сокращён для статьи):
Директивы «#pragma warning» нам нужны, чтобы избавиться от предупреждений, выдаваемых на стандартные библиотеки.
Теперь во все файлы *.c/*.cpp следует включить «stdafx.h». Заодно стоит удалить из этих файлов заголовки, которые уже включаются с помощью «stdafx.h».
А что делать, если используются хотя и похожие, но разные наборы заголовочных файлов? Например, такие:
- Файл A: <vector>, <string>
- Файл B: <vector>, <algorithm>
- Файл C: <string>, <algorithm>
Нужно делать отдельные precompiled headers? Так сделать можно, но не нужно.
Достаточно сделать один precompiled header, в котором будут раскрыты <vector>, <string> и <algorithm>. Выигрыш от того, что при препроцессировании не надо читать множество файлов и вставлять их друг друга намного больше, чем потери на синтаксический анализ лишних фрагментов кода.
Можно ли записывать определения в заголовочных файлах?
Язык C++ не будет жаловаться, если вы это сделаете, но так делать не принято.
Как уже было сказано выше, при подключении заголовочного файла, всё его содержимое вставляется сразу же после строки с #include. Это означает, что любые определения, которые есть в заголовочном файле, скопируются в ваш файл.
Для небольших проектов, это, скорее всего, не будет проблемой. Но для более крупных это может способствовать увеличению времени компиляции (так как код будет повторно компилироваться) и размеру исполняемого файла. Если внести изменения в определения, которые находятся в файле .cpp, то перекомпилировать придется только этот файл. Если же внести изменения в определения, которые записаны в заголовочном файле, то перекомпилировать придется каждый файл, который подключает этот заголовок, используя директиву препроцессора #include. И вероятность того, что из-за одного небольшого изменения вам придется перекомпилировать весь проект, резко возрастает!
Иногда делаются исключения для простых функций, которые вряд ли изменятся (например, где определение состоит всего лишь из одной строки).
Лучшие онлайн сервисы-компиляторы
Итак, мы рассмотрели самые интересные IDE для разработки программ на C++. Как видно, там есть из чего выбрать. Однако существует и другая категория — сервисы-компиляторы, доступные онлайн. Само собой, они не идут ни в какое сравнение со «старшими братьями», но у них ведь и другие задачи — быстро проверить небольшой кусок кода и запустить его. О них мы и поговорим далее.
Coliru
Если вам нужно оперативно скомпилировать небольшую программу, то подойдет Coliru. Это простой и легкий компилятор доступный через браузер. Он работает с языками C и C++, но при этом не может предложить слишком много.
В числе его особенностей отметим компиляцию только одного файла сразу. Зато у него есть архив, а также отсутствуют любые подписки и платные функции. Даже регистрироваться не нужно.
Плюсы:
- Работает через браузер.
- Бесплатный и легкий.
- Не нужна регистрация или подписка.
- Есть возможность делиться файлами с другими пользователями.
Минусы:
- Несколько файлов одновременно компилировать нельзя.
- Поддерживаются только два языка.
Codepad
Более мощный вариант онлайн-сервиса с функциями компиляции и отладки. Поддерживается более десятка языков. При этом система позволяет организовать упрощенный вариант совместной разработки. При запуске компиляции Codepad создаст URL-адрес, по которому можно получить доступ к коду. Если отправить его друзьям, те могут подключиться к разработке.
Благодаря тому, что это онлайн-сервис, писать код можно с любого устройства, которое имеет выход в интернет.
Список языков:
- C
- C++
- D
- Haskell
- Lua
- OCaml
- PHP
- Perl
- Plain Text
- Python
- Ruby
- Scheme
- Tcl
Плюсы:
- Поддерживается довольно много языков, бесплатно, без регистрации.
- Можно отправить ссылку друзьям, чтобы те помогли.
Минусы:
Функциональность намного меньше, чем в обычных IDE.
Tutorialspoint CodingGround
Неплохой онлайн-компилятор с простым и функциональным дизайном. Его особенности — поддержка более 75 языков и хорошо структурированная документация. В перечне есть книги, видео и другие материалы по разным аспектам, но для этого придется оформить подписку. Впрочем, на YouTube есть и бесплатные ролики.
В остальном же — довольно типичный инструмент с подсветкой синтаксиса, выводом результата и так далее.
Плюсы:
- Большое количество языков.
- Хорошая документация и видеоматериалы.
Недостатки:
За доступ к данным придется заплатить.
PaizaCloud
Это довольно мощный компилятор с поддержкой ряда языков и технологий. Список языков включает:
- C++
- Python
- JavaScript
- Java
- Ruby on Railse
- PHP
Есть бесплатная и платная версии. Главное различие между ними — время работы сервера. В бесплатном варианте его срок активной работы — 4 часа. При этом доступен только один сервер.
В платной версии ($19,8) дается один постоянно включенный сервер и еще три — с лимитированным временем использования. Есть возможность публикации сервера, а срок теперь не ограничен. Во всех случаях предлагаются два процессорных ядра, 2 ГБ ОЗУ и 4 ГБ постоянной памяти.
Плюсы:
- Веб-сервер, сервер баз данных, терминал и прочее прямо в браузере.
- Возможность работать на любой платформе, где есть браузер.
- Поддержка LAMP, Ruby on Rails, JSP, Django, Node.js, Laravel и так далее.
Минусы:
Платная версия намного превосходит бесплатную.
7 ответов
«Сборка» — это процесс, охватывающий все этапы, необходимые для создания «поставляемого» программного обеспечения. В мире Java это обычно включает в себя:
- Создание источников (иногда).
- Компиляция источников.
- Компиляция тестовых источников.
- Выполнение тестов (модульные тесты, интеграционные тесты и т. д.).
- Упаковка (в банку, войну, эйб-банку, колос).
- Выполнение проверок работоспособности (статические анализаторы, такие как Checkstyle, Findbugs, PMD, тестовое покрытие и т. д.).
- Создание отчетов.
Итак, как вы можете видеть, компиляция является лишь (небольшой) частью сборки (и лучше всего полностью автоматизировать все шаги с помощью таких инструментов, как Maven или Ant, и непрерывно запускать сборку, известную как Непрерывная интеграция ).
Некоторые из ответов, которые я вижу здесь, выходят за рамки контекста и имеют больше смысла, если бы это был вопрос C /C ++.
Короткая версия:
- «Компиляция» превращает файлы .java в файлы .class
- «Сборка» — это общий термин, включающий компиляцию и другие задачи.
«Сборка» — это универсальный термин, описывающий процесс общего , который включает компиляцию. Например, процесс сборки может включать инструменты, которые генерируют код Java или файлы документации.
Часто возникают дополнительные фазы, такие как «пакет», который берет все ваши файлы .class и помещает их в .jar, или «чистый», который очищает файлы .class и временные каталоги.
Компиляция — это превращение исходного кода в объектный код.
Связывание — это процесс объединения объектного кода с библиотеками в сырой исполняемый файл.
Сборка — это последовательность, состоящая из компиляции и компоновки , и, возможно, других задач, таких как создание установщика.
Многие компиляторы обрабатывают шаг связывания автоматически после компиляции исходного кода.
Простыми словами
На самом деле вы делаете то же самое. Ant — это система сборки, основанная на файлах конфигурации XML, которая может выполнять широкий спектр задач, связанных с компиляцией программного обеспечения. Компиляция вашего Java-кода является лишь одной из таких задач. Есть много других, таких как копирование файлов, настройка серверов, сборка zip и jar-файлов и компиляция других языков, таких как C.
Вам не нужен Ant для компиляции вашего программного обеспечения. Вы можете сделать это вручную, как в школе. Другой альтернативой Ant является продукт под названием Maven. И Муравей, и Мэйвен делают одно и то же, но совершенно по-разному.
Поиск Ant и Maven для получения более подробной информации.
- Build — это скомпилированная версия программы.
- Компилировать означает преобразовать (программу) в машинный код или в форму более низкого уровня, в которой программа может быть выполнена.
В Java : сборка — это жизненный цикл, содержащий последовательность именованных фаз.
например: maven имеет три жизненных цикла сборки, следующий — жизненный цикл сборки.
Компиляция — это просто преобразование исходного кода в двоичный код, сборка — это компиляция и связывание любых других необходимых файлов в каталог сборки
Primary tabs
Forums:
При создании нового проекта (C++, далее любой из подпроектов, типа Console App, MFC App, или ATL Service) Visual Studio генерит кучку файлов, которые составляют костяк приложения. Кстати — при создании приложения типа Conlsole Application в Visual Studio 2010 stdafx.h содержит следующие строки =
Среди этих файлов имеются два, которые служат для генерации файла предкомпилированных заголовков (precompiled headers). Первый — stdafx.h, в нем хранятся все «основные» include-ы проекта, но, как правило, не входящие в сам проект, т.е. файлы типа=
включаются, а CSomeSuperPuperProjectClass.h — нет.Второй — stdafx.cpp, служит как «затравка» компилятору для компиляции этого самого .pch-файла (precompiled headers file)
В свойствах проекта для всех файлов ставиться опция «use this precompiled header» и указывается stdafx.h Исключение — stfafx.cpp, для него указывается «create precompiled header file» и, опять таки, указывается stdafx.h
Шаг 5. Компоновка (линковка) объектных файлов и библиотек
После того, как компилятор создал один или несколько объектных файлов, включается другая программа, называемая компоновщиком (линкером). Работа компоновщика состоит из трех частей:
Во-первых, взять все объектные файлы, сгенерированные компилятором, и объединить их в единую исполняемую программу.
Рисунок 3 – Процесс компоновки (линковки)
Во-вторых, помимо возможности связывать объектные файлы, компоновщик (линкер) также может связывать файлы библиотек. Файл библиотеки – это набор предварительно скомпилированного кода, который был «упакован» для повторного использования в других программах.
Ядро языка C++ на самом деле довольно небольшое и лаконичное (и вы узнаете многое о нем в последующих статьях). Однако C++ также поставляется с обширной библиотекой, называемой стандартной библиотекой C++ (обычно сокращенно «стандартная библиотека», или STL), которая предоставляет дополнительные функции, которые вы можете использовать в своих программах. Одна из наиболее часто используемых частей стандартной библиотеки C++ – это библиотека , которая содержит функции для печати текста на мониторе и получения от пользователя ввода с клавиатуры. Почти каждая написанная программа на C++ в той или иной форме использует стандартную библиотеку, поэтому она часто подключается к вашим программам. Большинство компоновщиков автоматически подключают стандартную библиотеку, как только вы используете какую-либо ее часть, так что, как правило, вам не о чем беспокоиться.
Вы также можете при желании выполнить линковку с другими библиотеками. Например, если вы собрались написать программу, которая воспроизводит звук, вы, вероятно, не захотите писать свой собственный код для чтения звуковых файлов с диска, проверки их правильности или выяснения, как маршрутизировать звуковые данные к операционной системе или оборудованию для воспроизведения через динамик – это потребует много работы! Вместо этого вы, вероятно, загрузили бы библиотеку, которая уже знала, как это сделать, и использовали бы ее. О том, как связывать библиотеки (и создавать свои собственные!), мы поговорим в приложении.
В-третьих, компоновщик обеспечивает правильное разрешение всех межфайловых зависимостей. Например, если вы определяете что-то в одном файле .cpp, а затем используете это в другом файле .cpp, компоновщик соединит их вместе. Если компоновщик не может связать ссылку с чем-то с ее определением, вы получите ошибку компоновщика, и процесс линковки будет прерван.
Как только компоновщик завершит линковку всех объектных файлов и библиотек (при условии, что всё идет хорошо), вы получите исполняемый файл, который затем можно будет запустить!
Для продвинутых читателей
Для сложных проектов в некоторых средах разработки используется make-файл (makefile), который представляет собой файл, описывающий, как собрать программу (например, какие файлы компилировать и связывать, или обрабатывать какими-либо другими способами). О том, как писать и поддерживать make-файлы, написаны целые книги, и они могут быть невероятно мощным инструментом. Однако, поскольку make-файлы не являются частью ядра языка C++, и вам не нужно их использовать для продолжения изучения, мы не будем обсуждать их в рамках данной серии статей.
Заключение
Я рассмотрел две важные оптимизации, выполняемые компилятором Visual C++: выделение регистров ит планирование инструкций.
Выделение регистров — самая важная оптимизация, выполняемая компилятором, так как обращение к регистру происходит гораздо быстрее, чем даже к кешу
Планирование инструкций также важно. Однако новейшие процессоры обладают выдающимися средствами динамического выполнения, делая планирование инструкций не столь значимым, как это было раньше
Тем не менее, компилятор может видеть все инструкции функции независимо от того, насколько она велика, тогда как процессор способен увидеть лишь ограниченное количество инструкций. Кроме того, аппаратное обеспечение с измененным порядком выполнения потребляет довольно много электроэнергии, поскольку всегда работает, пока работает ядро. Более того, в процессорах x86 и x64 реализована модель памяти, более строгая, чем модель памяти в C11/C++11, и она предотвращает переупорядочение определенных инструкций, которые могли бы улучшить производительность. Поэтому планирование инструкций с помощью компилятора все еще крайне важно для устройств с ограниченным электропитанием.
Несколько ключевых слов и ключей компилятора могут положительно или отрицательно повлиять на производительность, поэтому убедитесь, что вы используете их должным образом, и тогда ваш код будет выполняться максимально быстро и давать корректные результаты. Существует еще много других оптимизаций, о которых стоит поговорить, так что ждите продолжения!
Hadi Brais — аспирант в Индийском технологическом институте Дели (Indian Institute of Technology Delhi, IITD), исследует оптимизации компилятора для технологий памяти следующего поколения. Большую часть времени проводит в написании кода на C/C++/C# и глубоко копает в CLR и CRT. Ведет блог hadibrais.wordpress.com. С ним можно связаться по адресу [email protected].
Выражаю благодарность за рецензирование статьи эксперту Microsoft (из группы Microsoft Visual C++) Джиму Хоггу (Jim Hogg).