C ++: действительно ли windows.h - эффективная библиотека кода? - PullRequest
3 голосов
/ 23 апреля 2010

Я слышал, как некоторые люди жалуются на , включая заголовочный файл windows в приложении C ++ и , использующие it. Они упомянули, что это неэффективно. Это просто какая-то городская легенда, или за ней стоят действительно серьезные факты? Другими словами, если вы считаете, что это эффективно или неэффективно, объясните, как это может быть с фактами.

Я не гуру программиста на C ++ Windows. Было бы очень полезно получить подробные объяснения.


* Редактировать: Я хочу знать во время компиляции и выполнения. Извините, что не упомянул это.

Ответы [ 6 ]

3 голосов
/ 23 апреля 2010

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

Таким образом, если рассматривать его строго с точки зрения производительности, простое включение в него влияет только на время компиляции. Однако это довольно важно - например, если использовать заголовки Platform SDK, которые поставляются с VS2010, #include <windows.h> расширяется до ~ 2,4 МБ кода - и весь этот код должен быть проанализирован и обработан компилятором.

Опять же, если вы используете предварительно скомпилированные заголовки (и вы, вероятно, должны в этом сценарии), это не повлияет на вас.

3 голосов
/ 23 апреля 2010

Если вы прекомпилируете его, то разница в скорости компиляции будет едва заметна. Недостатком предварительной компиляции является то, что вы можете иметь только один предварительно скомпилированный заголовок для каждого проекта, поэтому люди, как правило, создают один «precompiled.h» (или «stdafx.h») и включают в себя windows.h, boost, stl и все остальное. иначе они там нуждаются. Конечно, это означает, что вы в конечном итоге включаете файлы windows.h в каждый .cpp файл, а не только те, которые в нем нуждаются. Это может быть проблемой в кроссплатформенных приложениях, но вы можете обойти это, выполнив все свои специфичные для win32 вещи в статической библиотеке (с предварительно скомпилированным windows.h) и связавшись с ней в основном исполняемом файле.

Во время выполнения материал в windows.h выглядит примерно так же, как в Windows. Так что в этом отношении действительно нет "неэффективности".

Я бы сказал, что большинство людей, которые занимаются серьезным графическим интерфейсом Windows, используют стороннюю библиотеку (Qt, wxWidgets, MFC и т. Д.), Которая обычно состоит из поверх Win32, определенного в Windows. .h (по большей части), как я уже говорил, в Windows материал в windows.h в основном голый.

2 голосов
/ 23 апреля 2010

Как было отмечено, #incindows.h, включая windows.h, замедляет время компиляции.Вы можете использовать предварительно скомпилированные заголовки или выполнять хорошую работу по изоляции вызовов Windows только для модулей, которым они нужны, чтобы помочь с этим.

Кроме того, вы можете добавить эти определения preproc, прежде чем windows.h включит вот так:

#define WIN32_LEAN_AND_MEAN
#define VC_EXTRALEAN
#include <windows.h>

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

Конфликты пространства имен являются допустимым недостатком, но технически ничего не имеютделать с эффективностью, если вы не считаете эффективность вашего личного использования времени.Учитывая, сколько тысяч определений будет добавлено в ваше пространство имен, конфликты обязательно возникнут в какой-то момент, и это может сильно раздражать.Просто используйте практику разделения ваших вызовов Windows на модули, и все будет в порядке.Для этого поместите #include windows.h в файл .cpp, а не в файл .h.

Я не вижу оснований полагать, что на производительность исполняемого файла во время выполнения повлияет включение windows.h.Вы только добавляете большое количество определений в контекст, используемый компилятором.Вы даже не помещаете все определения в ваш скомпилированный код - просто выделения, вызовы функций и ссылки на основе любых определений, используемых в вашем исходном коде (.cpp).

Можно сделать еще один аргумент, чтоТипы и функции Windows API по своей природе расточительны или неэффективны.Т.е., если вы хотите создать файл, есть некоторая чудовищная структура, которую нужно передать Windows API.Тем не менее, я думаю, что большая часть этого - глупое мышление.Оцените проблемы производительности Windows API в каждом конкретном случае и по возможности замените неэффективный код.

1 голос
/ 23 апреля 2010

В общем, включение windows.h является необходимостью: если вам нужны функции Windows, вы должны включить их. Я думаю, что вы обращаетесь к (среди прочего) вложенному включению windows.h. То есть, вы включаете .h, который включает в себя windows.h, и вы также включаете windows.h в свой файл .cpp. Конечно, это приводит к неэффективности, поэтому вы должны очень хорошо изучить в своем коде, какие файлы .h включены в каждый файл .h, и избегать, например, windows.hn times косвенно .

1 голос
/ 23 апреля 2010

Есть несколько мест, где эффективность вступает в игру.

Включая <windows.h> значительно увеличит время компиляции и принесет много символов и макросов.Некоторые из этих символов или макросов могут конфликтовать с вашим кодом.Таким образом, с этой точки зрения, если вам не нужно <windows.h>, было бы неэффективно вводить его во время компиляции.

Увеличенное время компиляции можно несколько уменьшить с помощью предварительно скомпилированных заголовков, но это также приносит сэто немного больше сложности кодовой базы (вам нужно как минимум еще 2 файла для PCH), и некоторые головные боли, уникальные для PCH.Тем не менее, для большого проекта Windows, я обычно использую PCH.Что касается игрушечных или вспомогательных проектов, я обычно этого не делаю, потому что это больше проблем, чем стоит.

Эффективность также играет роль во время выполнения.Насколько я знаю, если вы #include <windows.h> не используете ни одного из этих средств, это не повлияет на поведение вашей программы во время выполнения, по крайней мере, до вызова дополнительного кода и подобных вещей.Однако могут быть другие эффекты во время выполнения, о которых я не знаю.

Что касается вопроса о Белом слоне, "Эффективна ли Windows?"Здесь я не буду вдаваться в подробности, кроме как сказать следующее: использование Windows во многом похоже на то, насколько оно эффективно или неэффективно, в основном зависит от вас и от того, насколько хорошо вы знаете, как его использовать.Однако вы получите столько же разных мнений по этому поводу, сколько и людей, которых вы спрашиваете, от «Winblowz sucks» до «Я люблю Windows, это круто».Игнорировать их всех.Научитесь кодировать в Windows, если вам это нужно и хотите, а затем решите сами.

0 голосов
/ 23 апреля 2010
  • Простое включение заголовка без его использования не повлияет на эффективность времени выполнения
  • Это повлияет на время компиляции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...