Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
Вопрос по Visual C++ 2005 |
Философия, технологии, алгоритмы! |
|
Опции темы |
03.08.2006, 21:48 | #1 |
IGBT
Сообщений: 535
Регистрация: 09.10.2005
Не в сети |
Вопрос по Visual C++ 2005
Долго читал на форумах о прекрасной оптимизации в Visual Studio и какое это счастие там программировать. Сегодня сходил к другу 3 часа закачивал Visual Studio 2005 с голимого сервера. Скомпилировал следующий файлик
#include <windows.h> void main() { MessageBox(0,"text","text",MB_OK); } И получил экзешник размером 48 Кб. Больше в проекте кроме main.cpp ничего нет даже ресурсов. Объясните лому как уменьшить размер проги в студии. Я конечно понимаю что оптимизацию из коробки мне не получить но хотелось бы что нибудь поменьше. Даже дельфи всеми преданный анафеме делает проги меньше. |
03.08.2006, 21:57 | #2 | |
IGBT
Сообщений: 535
Регистрация: 09.10.2005
Не в сети |
и еще вот сколько мне гов*а студия напихала в экзешник
Цитата:
|
|
04.08.2006, 10:40 | #5 |
Форумец
Сообщений: 119
Регистрация: 05.02.2003
Не в сети |
в исходнике windows.h можно найти следующую информацию
/* If defined, the following flags inhibit definition * of the indicated items. * * NOGDICAPMASKS - CC_*, LC_*, PC_*, CP_*, TC_*, RC_ * NOVIRTUALKEYCODES - VK_* * NOWINMESSAGES - WM_*, EM_*, LB_*, CB_* * NOWINSTYLES - WS_*, CS_*, ES_*, LBS_*, SBS_*, CBS_* * NOSYSMETRICS - SM_* * NOMENUS - MF_* * NOICONS - IDI_* * NOKEYSTATES - MK_* * NOSYSCOMMANDS - SC_* * NORASTEROPS - Binary and Tertiary raster ops * NOSHOWWINDOW - SW_* * OEMRESOURCE - OEM Resource values * NOATOM - Atom Manager routines * NOCLIPBOARD - Clipboard routines * NOCOLOR - Screen colors * NOCTLMGR - Control and Dialog routines * NODRAWTEXT - DrawText() and DT_* * NOGDI - All GDI defines and routines * NOKERNEL - All KERNEL defines and routines * NOUSER - All USER defines and routines * NONLS - All NLS defines and routines * NOMB - MB_* and MessageBox() * NOMEMMGR - GMEM_*, LMEM_*, GHND, LHND, associated routines * NOMETAFILE - typedef METAFILEPICT * NOMINMAX - Macros min(a,b) and max(a,b) * NOMSG - typedef MSG and associated routines * NOOPENFILE - OpenFile(), OemToAnsi, AnsiToOem, and OF_* * NOSCROLL - SB_* and scrolling routines * NOSERVICE - All Service Controller routines, SERVICE_ equates, etc. * NOSOUND - Sound driver routines * NOTEXTMETRIC - typedef TEXTMETRIC and associated routines * NOWH - SetWindowsHook and WH_* * NOWINOFFSETS - GWL_*, GCL_*, associated routines * NOCOMM - COMM driver routines * NOKANJI - Kanji support stuff. * NOHELP - Help engine interface. * NOPROFILER - Profiler interface. * NODEFERWINDOWPOS - DeferWindowPos routines * NOMCX - Modem Configuration Extensions */ так что напильник в руки и вперед |
04.08.2006, 12:12 | #6 | |||
бибизьян
Сообщений: 3,031
Регистрация: 17.02.2004
Не в сети |
Pengvin
Давненько я не брал в руки шашек! сразу ремарка: VC 2005 сейчас под рукой нет, поэтому будем кивирять 2003 Но я далек от мысли, что в 2005 кардинально все по другому... Итак поехали. Пустой проект win32. Добавляем файл mini.cpp: Цитата:
Идем дальше. Смотрим командную строку линкера: Цитата:
Ясно, что раз зашел разговор о размере, то большая часть либ нам и завтра не понадобится вместе со стартап-кодом Поехали. До свидания все дефолтные либы - /NODEFAULTLIB. mini.cpp принимает вид: Цитата:
Так сойдет или еще поковырять? |
|||
04.08.2006, 21:02 | #10 | |
IGBT
Сообщений: 535
Регистрация: 09.10.2005
Не в сети |
вот мне тут люди еще подсказали вот такую хрень
Цитата:
Нет вы не подумайте что я придераюсь просто нехорошо когда в тривиальный хелло ворлд линкер набивает всякого другого барахла |
|
05.08.2006, 20:23 | #12 | |
IGBT
Сообщений: 535
Регистрация: 09.10.2005
Не в сети |
aerin, конечно не кончится. Да и на смерженные сегменты warnings пошли Я просто недавно достал DirectX SDK и решил покодить трехмерные проги. Пришлось визуал студию ставить. Все мне рекомедовали 6 но я смог только 2005 достать. Теперь вот мучаюсь может мне стит 6 поискать?
Тут вот еще такая трабла. линкер вот что пишет: Цитата:
|
|
07.08.2006, 12:02 | #15 | ||
бибизьян
Сообщений: 3,031
Регистрация: 17.02.2004
Не в сети |
Цитата:
Цитата:
ЗЫ. Ты бы почитал чего-нибудь типа Рихтера, да и покопаться в исходниках CRT не грех, если ты этим собираешься заниматься всерьез, то код некоторых функций приедется выдирать из рантаймовской библиотеки. |
||
09.08.2006, 00:14 | #16 |
IGBT
Сообщений: 535
Регистрация: 09.10.2005
Не в сети |
я бы выдернул или на крайний случай сам бы написал. Там всего то memcpy,memset и strcmp нужен. Так он же (то есть линкер) засранец какие то ___security_cookie и другую ересь требует. Я наверное поищу еще эту функцию. Просто сейчас неохото вплотную заниматься оптимизицией. Просто меня ужаснул размер пустого экзешника. А простое приложение с инициализацией Direct3D весит 1,6 Mб. Это даже на дискету влезает
Я компилил с /NODEFAULTLIB но мне пришлось дописывать libcmt.lib чтобы он находил свои security_cookie. Но он стал требовать _main. Но я в хелпе нашел еще msvcrt.lib и почти все получилось только вот прога компилилась с debagом и пришлось msvctd.lib подключать. Правда еще пришлось в папку с экзешником еще и msvct80.dll кинуть. Вобщем еще та песня. |
09.08.2006, 11:07 | #17 | ||
бибизьян
Сообщений: 3,031
Регистрация: 17.02.2004
Не в сети |
Pengvin
Вы уж меня простите, но я констатирую, что у вас напрочь отсутствует понимание вопроса. libcmt.lib - это и есть с-ный MultiThread-ный run-тайм для статической линковки, от которого мы и избавлялись в начале темы, увеличивает размер итогового экзешника. msvcrt.lib - то же самое, но линковка динамическая, т.е. для запуска нужна еще и MSVCPXX.DLL. Разумеется, оба эти способа требуют от тебя указать точку входа. Так такие вещи не пишутся. Цитата:
Цитата:
../Vc7/crt/src/memcpy.c, ../Vc7/crt/src/memset.c, ../Vc7/crt/src/strcmp.c. ЗЫ. Почитай все ж чего-нибудь, а? |
||
09.08.2006, 18:41 | #18 | |
IGBT
Сообщений: 535
Регистрация: 09.10.2005
Не в сети |
конечно у меня отсутствует понимание вопроса. Я студию практически неделю только вижу. Просто при явно указанной точке входа /ENTRY:WinMain при статической линковке линкер требует main а при динамической нет. Для меня проблема была не в теории а в том что с одной подключенной либой программа собирается а с другой нет.
Цитата:
|
|
10.08.2006, 00:08 | #19 |
бибизьян
Сообщений: 3,031
Регистрация: 17.02.2004
Не в сети |
Pengvin
Расскажите все-таки, что вы собираетесь писать: маленькую демку/интро/... или большой серьезный проект? Если первое, то много читать, смотреть исходники CRT, еще читать. Если второе, то пока забить на размер и писать содержательную часть кода. На экзамплы MS особо внимания не обращать, там кстати еще и утечки памяти встречаются И если мне память не изменяет, то в примерах DX SDK они наваяли еще кучу классов-оберток, плюс к этому они там любят линковать картинки к экзешнику. |
11.08.2006, 00:48 | #20 | |
IGBT
Сообщений: 535
Регистрация: 09.10.2005
Не в сети |
Наверное первое. На большой серьезный проект на подобие игры у меня терпения не хватит. (хотя может быть ) Просто давно хотел изучить студию. А ИМХО лучшего способа что-либо изучить чем решить какую либо задачу нет. Есть конечно языки которые без книги не выучишь, вроде ассемблера.
Цитата:
|
|
11.08.2006, 09:29 | #21 | |||
бибизьян
Сообщений: 3,031
Регистрация: 17.02.2004
Не в сети |
Pengvin
Мне кажется, что это немножко не та задача, на которой стоит изучать VC. Органично такие задачи решаются на асме. А в студии такие вещи решаются отказом от большой части стандартного workflow. Скажем так, мощь инструмента несоразмерна задаче. Цитата:
Цитата:
Цитата:
|
|||
12.08.2006, 11:09 | #22 |
IGBT
Сообщений: 535
Регистрация: 09.10.2005
Не в сети |
aerin
Я конечно куплю себе книгу по VC. У меня дома валяется какая -то по VC 6 но там только MFC и кусок, стандартной для такого рода книг , теории о ООП. Может быть вы мне что-нибудь посоветуете? А насчет асма позвольте не согласиться. По моему асм это та крайность, в которую частенько бросаются когда речь заходит об оптимизации. По моему студия и так гененрирует отличный код. Я уже молчу об оптимизации FPU , для меня это вобще темный лес. PS: Microsoft мне нравиться им можно сказать спасибо хотя бы за DirectX и VC. Но ругать их это - модно. Вот я и не удержался. |
12.08.2006, 12:09 | #23 | |||
IGBT
Сообщений: 535
Регистрация: 09.10.2005
Не в сети |
эээээ. С оптимизмрованным кодом я погараячился.Что то он не сильно оптимизирован. Решил посмотреть ассемблерные листинги.
Вот код на си: Цитата:
Цитата:
Вот что выдал intel c compiler v8.0 c /O2 Цитата:
|
|||
14.08.2006, 12:00 | #24 | |||
бибизьян
Сообщений: 3,031
Регистрация: 17.02.2004
Не в сети |
Pengvin
Цитата:
Цитата:
Цитата:
Я убил 20 минут своего времени, пытаясь заставить VC выдать мне add al, 1 - это происходило лишь в случае /Od - т.е. Optimization Disabled. Во всех остальных случаях был честный inc. Кстати, если множитель не тройка, а степень двойки - то умножнеие разворачивается в серию сложений. Т.е. я хочу сказать, что когда идет битва за такты и байты, то уже нет большой разницы между C и Asm-ом. Считаете, что соптимизируете лучше - пишите функции на Asm-е, нет проблем, благо сейчас машины без сопроцессора вымерли как класс, так что вполне можно юзать FPU незадумываясь. |
|||