| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > лишний код в стандартных библиотеках |
| Автор: GoldFinch 13.4.2009, 15:31 | ||
берем какую-нибудь тривиальную программу
компилируем (msvc2008), получаем .exe размером 36Кб, размер секции кода 0x6200 а все потому что используется немалого размера mainCRTStartup, а данные CRT хранятся в TLS изза чего при вызове rand() используется уйма апи доступа к TLS и сохранения LastErr, а так же немало связанных с ними проверок что с этим можно сделать? |
| Автор: J0ker 13.4.2009, 16:15 |
| учитывая размер сектора любой файловой системы - не забивать себе голову глупостями ради исключительно академического интереса - отключить CRT и юзать исключительно ОС API и асм |
| Автор: GoldFinch 13.4.2009, 16:32 |
| J0ker, размер сектора почти любой файловой системы - 512 байт, размер страницы памяти - 4Кб я хочу юзать стандартные библиотеки, но при этом чтобы небыло лишнего кода "юзать исключительно ОС API и асм" - это совет не для раздела С++ |
| Автор: Lazin 13.4.2009, 16:42 |
начиная с vs2005 - ничего, а в старых версиях студии, можно использовать signle threaded rtl но смысла я не вижу, в более менее сложном приложении лучше использовать multithreaded версию rtl |
| Автор: J0ker 13.4.2009, 16:42 |
| пардон имелось ввиду конечно кластер |
| Автор: GoldFinch 13.4.2009, 17:19 | ||||
| Lazin, например есть задача заполнить большой массив случайными значениями, смоделировать случайный процесс, вобщем надо много раз вызвать функцию rand() в делфи функция random выполняется за десяток инструкций процессора (могло бы быть и меньше)
а в С++ трасса rand() состоит из 80 инструкций, причем весьма не быстрых:
|
| Автор: J0ker 13.4.2009, 18:12 |
| GoldFinch, случайные числа вообще тема сложная здесь наряду со скоростью надо рассматривать распределение и "случайность" |
| Автор: GoldFinch 13.4.2009, 18:52 |
| J0ker, ты читал о чем я пишу? алгоритм формирования случайного числа и в С++ и в паскале и наверное во многих других ЯП один и тот же: randseed=randseed*a+b но в С++ в функции rand() много лишнего кода никак не связанного с генерацией случайного числа |
| Автор: Любитель 13.4.2009, 19:36 |
| GoldFinch, вроде ж уже выяснили - многопоточный рантайм, проблемы синхронизации (чтобы в двух потоках не было одинаковой последовательности твоих чисел). |
| Автор: J0ker 13.4.2009, 20:07 |
| GoldFinch, я подозреваю (не вчитывался в код) что в VC rand реализован per-thread - в дельфи во-первых соершенно не thread-safe, а во-вторых с т.з. секьюрити не per-thread rand - это явный косяк |
| Автор: Cтpaнник 13.4.2009, 20:45 |
| Да можешь уже и не подозревать, - так и есть, в VC++ rand() действительно per-thread. По крайней мере, в VC++ 2005 я этим вопросом интересовался. |
| Автор: GoldFinch 13.4.2009, 20:47 | ||
J0ker, Cтpaнник, вы посты читаете или сразу пишете? =\
|
| Автор: vinter 13.4.2009, 20:54 |
| GoldFinch, дык в чем вопрос то? утебя есть ответ, что тебя еще интересует? Не нравятся студийные накладки - не используй ее. Благо есть бесплатные аналоги. |
| Автор: azesmcar 13.4.2009, 20:55 | ||
| Я не совсем понимаю в чем вопрос? CRT непотокобезопасная библиотека, она использует глобальные переменные итд...чтобы решить эту проблему ее загружают в TLS (Thread Local Storage). Если вопрос то вот ответ
либо используй Single Thread, либо забудь об этом. Добавлено через 1 минуту и 11 секунд опередили |
| Автор: Rififi 13.4.2009, 21:55 |
| GoldFinch, что с этим можно сделать? писать всё на ассемблере, как настоящий джедай, а не чайник какойта, а с++ - фтопку. |
| Автор: GoldFinch 13.4.2009, 23:38 |
| лишние проверки STL отключаются дефайном "#define _SECURE_SCL 0" может в CRT тоже есть чтото подобное? или может гдето есть оптимизированная версия CRT? |
| Автор: J0ker 14.4.2009, 01:20 |
| GoldFinch, ты джедай или где? теж сказали - на ассемблере |
| Автор: azesmcar 14.4.2009, 08:30 |
| GoldFinch Не видел отдельного CRT. А если попробовать GCC? |
| Автор: GoldFinch 14.4.2009, 08:42 |
| azesmcar, нехочу gcc, в msvc слишком много вкусных вещей которых нет в gcc одно наличие __asm чего стоит |
| Автор: azesmcar 14.4.2009, 08:54 |
| GoldFinch не понял?? кто сказал что в GCC нет ассемблерных вставок? http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html Практически все что есть в Визуал студии заменяется аналогами в GCC. Надо только поискать. |
| Автор: GoldFinch 14.4.2009, 09:41 |
| azesmcar, я не сказал что их нет, я говорю что синтаксис асм вставок в msvc удобнее чем в gcc может все что есть в Визуал студии и заменяется аналогами в GCC, но не факт что эта замена так же хороша как и оригинал |
| Автор: azesmcar 14.4.2009, 09:51 | ||||
а это кто говорил?
спорный вопрос что считать оригиналом и что лучше. С тем же успехом скажу - не факт что микрософтовские функции лучше POSIX. |
| Автор: J0ker 14.4.2009, 16:32 |
| ............... |
| Автор: 586 14.4.2009, 16:51 | ||
|
| Автор: GoldFinch 14.4.2009, 17:53 |
| 586, этот код не работает, какой смысл постить неработающий код? |
| Автор: Alca 14.4.2009, 18:23 | ||
Кажись это для шестерки. Добавлено через 1 минуту и 46 секунд http://forum.sources.ru/index.php?showtopic=139119&view=showall Добавлено через 3 минуты и 3 секунды http://forum.sources.ru/index.php?act=Attach&type=post&id=1069983 |
| Автор: 586 15.4.2009, 00:28 |
В любой студии должно работать. В 98 и 2005 точно. Что именно не работает? Какая ошибка? |
| Автор: GoldFinch 15.4.2009, 08:19 |
| 586, в msvc2008 валится после ntdll.RtlDecodePointer, видимо потому что не был выполнен EncodePointer |
| Автор: zim22 15.4.2009, 08:30 |
у меня работает. MSVC 2008 Professional. только при сборке Release предупреждает: warning LNK4229: invalid directive '/opt:nowin98' encountered; ignored размер debug версии exe-шника: 20480 байт размер release: 3584 байт |
| Автор: 586 15.4.2009, 14:46 | ||||
У тебя Debug-версия? Это нужно делать в Release-версии. Что отображено в окне Call Stack? Debug->Windows->Call Stack. Эта информация может прояснить ситуацию.
/opt:nowin98 - устаревшая опция. В 2005 студии (и старше) эта опция вшита в линкер по умолчанию. |
| Автор: GoldFinch 15.4.2009, 15:23 |
| zim22, у тебя CRT в dll, естественно все работает 586, компилю релиз со статическим CRT, дебажу олькой, где и как валится прога я уже писал, прога выполняет DecodePointer и call eax, указатель битый, прога прыгает вникуда и валится |
| Автор: 586 15.4.2009, 15:39 |
Правильно. И рантайм инициализируется частично в DllMain DLL_PROCESS_ATTACH. А статический рантайм будет некорректно работать, потому что он не инициализирован. |
| Автор: GoldFinch 15.4.2009, 16:37 |
| 586, и как использование длл с CRT помогает решить сабжевую проблему? (длл с CRT сама по себе - зло, с ней программы даже не компе с msvc не работают о_О) |