Как ВЫ уменьшаете время компиляции и соединение времени для проектов Visual C++ (собственный C++)?

Предупреждение: Деление на ноль

Предупреждающее сообщение «Подразделение на ноль» является одним из наиболее часто задаваемых вопросов среди новых разработчиков PHP. Эта ошибка не вызовет исключения, поэтому некоторые разработчики будут иногда подавлять предупреждение, добавляя оператор подавления ошибок @ перед выражением. Например:

$value = @(2 / 0);

Но, как и при любом предупреждении, наилучшим подходом было бы отслеживать причину предупреждения и разрешать его. Причина предупреждения будет происходить из любого экземпляра, где вы пытаетесь разделить на 0, переменную, равную 0, или переменную, которая не была назначена (поскольку NULL == 0), потому что результат будет «неопределенным».

Чтобы исправить это предупреждение, вы должны переписать свое выражение, чтобы проверить, что значение не равно 0, если оно есть, сделать что-то еще. Если значение равно нулю, вы не должны делиться или изменять значение на 1, а затем делить так, что деление приводит к эквиваленту того, что он разделен только дополнительной переменной.

if ( $var1 == 0 ) { // check if var1 equals zero
    $var1 = 1; // var1 equaled zero so change var1 to equal one instead
    $var3 = ($var2 / $var1); // divide var1/var2 ie. 1/1
} else {
    $var3 = ($var2 / $var1); // if var1 does not equal zero, divide
}

Вопросы, относящиеся:

40
задан Peter Mortensen 25 April 2016 в 21:36
поделиться

10 ответов

Это может звучать очевидным для Вас, но мы пытаемся использовать предописания как можно больше, даже если это требует для выписывания длинных имен пространства имен, в которых находится тип (типы):

// Forward declaration stuff
namespace plotter { namespace logic { class Plotter; } }

// Real stuff
namespace plotter {
    namespace samples {
        class Window {
            logic::Plotter * mPlotter;
            // ...
        };
    }
}

Это значительно уменьшает время для компиляции также на компиляторах других. Действительно это относится ко всем конфигурациям:)

45
ответ дан Peter Mortensen 27 November 2019 в 01:08
поделиться

Используйте шаблон Дескриптора/Тела (также иногда известный как "pimpl", "адаптер", "декоратор", "мост" или "обертка"). Путем изоляции реализации классов в .cpp файлы они должны только быть скомпилированными однажды. Большинство изменений не требует изменений в заголовочном файле, таким образом, это означает, что можно внести довольно обширные изменения, только требуя, чтобы один файл был перекомпилирован. Это также поощряет осуществлять рефакторинг и писать комментариев и модульных тестов, так как время компиляции уменьшено. Кроме того, Вы автоматически разделяете проблемы интерфейса и реализации, таким образом, интерфейс Вашего кода упрощен.

21
ответ дан 1800 INFORMATION 27 November 2019 в 01:08
поделиться

Если у Вас есть большие сложные заголовки, которые должны быть включены большинством .cpp файлов в Вашем процессе сборки, и которые не изменяются очень часто, можно предварительно скомпилировать их. В проекте Visual C++ с типичной конфигурацией это - просто вопрос включения их в stdafx.h. Эта функция имеет своих хулителей, но библиотеки, которые полностью используют шаблоны, склонны иметь много материала в заголовках, и предварительно скомпилированные заголовки являются самым простым способом ускорить сборки в этом случае.

14
ответ дан Daniel Earwicker 27 November 2019 в 01:08
поделиться

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

Предописания являются общим решением.

Распределенное здание, такой как с Incredibuild является победой.

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

решение для А я не читал о, но использовал, должен разделить большие заголовки. Если Вы имеете горстку очень больших заголовков, смотрите на них. Они могут содержать сопутствующую информацию и могут также зависеть от большого количества других заголовков. Возьмите элементы, которые не имеют никаких зависимостей от других файлов... простые структуры, константы, перечисления и предописания и перемещают их от the_world.h до the_world_defs.h. Можно теперь найти, что много исходных файлов может теперь включать [только 112] и избежать включая все те издержки.

Visual Studio также имеет опцию "Show Includes", которая может дать Вам, смысл которых исходные файлы включают много заголовков и какие заголовочные файлы наиболее часто включаются.

Для очень общего включает, рассмотрите помещение их в предварительно скомпилированном заголовке.

8
ответ дан Drew Dormann 27 November 2019 в 01:08
поделиться

Я использую Сборки Единицы (Экранная демонстрация расположенный здесь ).

8
ответ дан OJ. 27 November 2019 в 01:08
поделиться

Вопрос о скорости компиляции достаточно интересен, что у Stroustrup есть он в его FAQ.

7
ответ дан Alex McCarthy 27 November 2019 в 01:08
поделиться

Мы используем Incredibuild Xoreax для выполнения компиляции параллельно через несколько машин.

7
ответ дан crashmstr 27 November 2019 в 01:08
поделиться

Наши машины разработки являются все четырехъядерными, и мы используем поддержки Visual Studio 2008 параллельная компиляция. Я не уверен относительно того, могут ли все выпуски VS сделать это.

Мы имеем файл решения приблизительно с 168 отдельными проектами и компилируем этот путь, занимает приблизительно 25 минут на наших четырехъядерных машинах, по сравнению с приблизительно 90 минутами на одноядерных ноутбуках, которые мы даем летним студентам. Не точно сопоставимые машины, но Вы получаете идею:)

4
ответ дан 27 November 2019 в 01:08
поделиться

С Visual C++ существует метод, некоторые называют Единицей, которая значительно улучшает время ссылки путем сокращения количества объектных модулей.

Это включает конкатенацию кода C++, обычно в группах библиотекой. Это, конечно, делает редактирование кода намного более трудным, и Вы столкнетесь с конфликтами пространства имен, если Вы не будете использовать их хорошо. Это мешает Вам использовать "нечто пространства имен использования";

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

2
ответ дан Peter Mortensen 27 November 2019 в 01:08
поделиться

Также интересная статья Неда Бэтчелдера: http://nedbatchelder.com/blog/200401/speeding_c_links.html (о C ++ в Windows).

5
ответ дан 27 November 2019 в 01:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: