Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> лишний код в стандартных библиотеках, (msvc) 
:(
    Опции темы
GoldFinch
Дата 13.4.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



берем какую-нибудь тривиальную программу
Код

#include <cstdlib>
int main() {
    return rand()%10;
}

компилируем (msvc2008), получаем .exe размером 36Кб, размер секции кода 0x6200
а все потому что используется немалого размера mainCRTStartup, 
а данные CRT хранятся в TLS изза чего при вызове rand() используется уйма апи доступа к TLS и сохранения LastErr, а так же немало связанных с ними проверок

что с этим можно сделать?

Это сообщение отредактировал(а) GoldFinch - 13.4.2009, 15:32
PM MAIL ICQ   Вверх
J0ker
Дата 13.4.2009, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



учитывая размер сектора любой файловой системы - не забивать себе голову глупостями
ради исключительно академического интереса - отключить CRT и юзать исключительно ОС API и асм


--------------------
user posted image
PM MAIL   Вверх
GoldFinch
Дата 13.4.2009, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



J0ker, размер сектора почти любой файловой системы - 512 байт, размер страницы памяти - 4Кб
я хочу юзать стандартные библиотеки, но при этом чтобы небыло лишнего кода
"юзать исключительно ОС API и асм" - это совет не для раздела С++
PM MAIL ICQ   Вверх
Lazin
Дата 13.4.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(GoldFinch @  13.4.2009,  15:31 Найти цитируемый пост)
что с этим можно сделать?

начиная с vs2005 - ничего, а в старых версиях студии, можно использовать signle threaded rtl
но смысла я не вижу, в более менее сложном приложении лучше использовать multithreaded версию rtl
PM MAIL Skype GTalk   Вверх
J0ker
Дата 13.4.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



пардон
имелось ввиду конечно кластер


--------------------
user posted image
PM MAIL   Вверх
GoldFinch
Дата 13.4.2009, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Lazin, например есть задача заполнить большой массив случайными значениями, смоделировать случайный процесс, вобщем надо много раз вызвать функцию rand()
в делфи функция random выполняется за десяток инструкций процессора (могло бы быть и меньше)
Код

___:30002D9C Random          proc near
___:30002D9C                 push    ebx
___:30002D9D                 xor     ebx, ebx
___:30002D9F                 imul    edx, RandSeed[ebx], 8088405h
___:30002DA9                 inc     edx
___:30002DAA                 mov     RandSeed[ebx], edx
___:30002DB0                 mul     edx
___:30002DB2                 mov     eax, edx
___:30002DB4                 pop     ebx
___:30002DB5                 retn
___:30002DB5 Random          endp
 
а в С++ трасса rand() состоит из 80 инструкций, причем весьма не быстрых:
Код

Address  Thread   Command                                   ; Registers and comments
00401593 Main     MOV EDI,EDI
00401595 Main     PUSH ESI
00401596 Main     CALL cstd_tes.0040151A
0040151A Main     MOV EDI,EDI
0040151C Main     PUSH ESI
0040151D Main     PUSH EDI
0040151E Main     CALL DWORD PTR [<&KERNEL32.GetLastError>]
RtlGetLastWin32Er>MOV EAX,DWORD PTR FS:[18]                 ; EAX=7FFDD000
7C910337 Main     MOV EAX,DWORD PTR [EAX+34]                ; EAX=00000000
7C91033A Main     RETN
00401524 Main     PUSH DWORD PTR [40A00C]
0040152A Main     MOV EDI,EAX                               ; EDI=00000000
0040152C Main     CALL cstd_tes.004013C2
004013C2 Main     MOV EDI,EDI
004013C4 Main     PUSH ESI
004013C5 Main     PUSH DWORD PTR [40A010]                   ; TlsIndex = 1
004013CB Main     CALL DWORD PTR [<&KERNEL32.TlsGetValue>]
TlsGetValue       MOV EDI,EDI
7C809742 Main     PUSH EBP
7C809743 Main     MOV EBP,ESP                               ; EBP=0012FF4C
7C809745 Main     MOV EAX,DWORD PTR FS:[18]                 ; EAX=7FFDD000
7C80974B Main     MOV ECX,DWORD PTR [EBP+8]
7C80974E Main     CMP ECX,40
7C809751 Main     JNB kernel32.7C84495C
7C809757 Main     AND DWORD PTR [EAX+34],0
7C80975B Main     MOV EAX,DWORD PTR [EAX+ECX*4+E10]         ; EAX=7C809740
7C809762 Main     POP EBP                                   ; EBP=0012FFC0
7C809763 Main     RETN 4
004013D1 Main     MOV ESI,EAX                               ; ESI=7C809740
004013D3 Main     TEST ESI,ESI
004013D5 Main     JNZ SHORT cstd_tes.004013F2
004013F2 Main     MOV EAX,ESI
004013F4 Main     POP ESI                                   ; ESI=FFFFFFFF
004013F5 Main     RETN
00401531 Main     CALL EAX
TlsGetValue       MOV EDI,EDI
7C809742 Main     PUSH EBP
7C809743 Main     MOV EBP,ESP                               ; EBP=0012FF58
7C809745 Main     MOV EAX,DWORD PTR FS:[18]                 ; EAX=7FFDD000
7C80974B Main     MOV ECX,DWORD PTR [EBP+8]                 ; ECX=00000002
7C80974E Main     CMP ECX,40
7C809751 Main     JNB kernel32.7C84495C
7C809757 Main     AND DWORD PTR [EAX+34],0
7C80975B Main     MOV EAX,DWORD PTR [EAX+ECX*4+E10]         ; EAX=00331E90
7C809762 Main     POP EBP                                   ; EBP=0012FFC0
7C809763 Main     RETN 4
00401533 Main     MOV ESI,EAX                               ; ESI=00331E90
00401535 Main     TEST ESI,ESI
00401537 Main     JNZ SHORT cstd_tes.00401587
00401587 Main     PUSH EDI                                  ; Error = ERROR_SUCCESS
00401588 Main     CALL DWORD PTR [<&KERNEL32.SetLastError>]
RtlSetLastWin32Er>MOV EDI,EDI
7C910342 Main     PUSH EBP
7C910343 Main     MOV EBP,ESP                               ; EBP=0012FF58
7C910345 Main     MOV EAX,DWORD PTR FS:[18]                 ; EAX=7FFDD000
7C91034B Main     MOV ECX,DWORD PTR [EBP+8]                 ; ECX=00000000
7C91034E Main     MOV DWORD PTR [EAX+34],ECX
7C910351 Main     POP EBP                                   ; EBP=0012FFC0
7C910352 Main     RETN 4
0040158E Main     POP EDI                                   ; EDI=7C910738
0040158F Main     MOV EAX,ESI                               ; EAX=00331E90
00401591 Main     POP ESI                                   ; ESI=FFFFFFFF
00401592 Main     RETN
0040159B Main     MOV ESI,EAX                               ; ESI=00331E90
0040159D Main     TEST ESI,ESI
0040159F Main     JNZ SHORT cstd_tes.004015A9
004015A9 Main     MOV EAX,ESI
004015AB Main     POP ESI                                   ; ESI=FFFFFFFF
004015AC Main     RETN
00401024 Main     MOV ECX,DWORD PTR [EAX+14]                ; ECX=00000001
00401027 Main     IMUL ECX,ECX,343FD                        ; ECX=000343FD
0040102D Main     ADD ECX,269EC3                            ; ECX=0029E2C0
00401033 Main     MOV DWORD PTR [EAX+14],ECX
00401036 Main     MOV EAX,ECX                               ; EAX=0029E2C0
00401038 Main     SHR EAX,10                                ; EAX=00000029
0040103B Main     AND EAX,7FFF
00401040 Main     RETN


PM MAIL ICQ   Вверх
J0ker
Дата 13.4.2009, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



GoldFinch,
случайные числа вообще тема сложная
здесь наряду со скоростью надо рассматривать распределение и "случайность"


--------------------
user posted image
PM MAIL   Вверх
GoldFinch
Дата 13.4.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



J0ker, ты читал о чем я пишу? алгоритм формирования случайного числа и в С++ и в паскале и наверное во многих других ЯП один и тот же: randseed=randseed*a+b
но в С++ в функции rand() много лишнего кода никак не связанного с генерацией случайного числа
PM MAIL ICQ   Вверх
Любитель
Дата 13.4.2009, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



GoldFinch, вроде ж уже выяснили - многопоточный рантайм, проблемы синхронизации (чтобы в двух потоках не было одинаковой последовательности твоих чисел).


--------------------
PM MAIL ICQ Skype   Вверх
GoldFinch
Дата 13.4.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(Любитель @  13.4.2009,  20:36 Найти цитируемый пост)
чтобы в двух потоках не было одинаковой последовательности твоих чисел

это как это будут одинаковые последоватльности в двух потоках если числа случайные берутся из одного ГПСЧ?
вот как раз когда у каждого потока свой ГПСЧ, то и могут возникнуть одинаковые последовательности
PM MAIL ICQ   Вверх
J0ker
Дата 13.4.2009, 20:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



GoldFinch, я подозреваю (не вчитывался в код) что в VC rand реализован per-thread - в дельфи во-первых соершенно не thread-safe, а во-вторых с т.з. секьюрити не per-thread rand - это явный косяк


--------------------
user posted image
PM MAIL   Вверх
Cтpaнник
Дата 13.4.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 53
Регистрация: 12.10.2008
Где: Россия, Санкт-Пет ербург

Репутация: нет
Всего: нет



Да можешь уже и не подозревать, - так и есть, в VC++ rand() действительно per-thread. По крайней мере, в VC++ 2005 я этим вопросом интересовался.
PM MAIL   Вверх
GoldFinch
Дата 13.4.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



J0ker, Cтpaнник, вы посты читаете или сразу пишете? =\
Цитата(GoldFinch @  13.4.2009,  16:31 Найти цитируемый пост)
данные CRT хранятся в TLS изза чего при вызове rand() используется уйма апи доступа к TLS


PM MAIL ICQ   Вверх
vinter
Дата 13.4.2009, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



GoldFinch, дык в чем вопрос то? утебя есть ответ, что тебя еще интересует? Не нравятся студийные накладки - не используй ее. Благо есть бесплатные аналоги.


--------------------
Мой блог
PM MAIL WWW   Вверх
azesmcar
Дата 13.4.2009, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Я не совсем понимаю в чем вопрос?
CRT непотокобезопасная библиотека, она использует глобальные переменные итд...чтобы решить эту проблему ее загружают в TLS (Thread Local Storage). Если вопрос

Цитата(GoldFinch @  13.4.2009,  15:31 Найти цитируемый пост)
что с этим можно сделать?

то вот ответ

Цитата(Lazin @  13.4.2009,  16:42 Найти цитируемый пост)

начиная с vs2005 - ничего, а в старых версиях студии, можно использовать signle threaded rtl
но смысла я не вижу, в более менее сложном приложении лучше использовать multithreaded версию rtl

либо используй Single Thread, либо забудь об этом.

Добавлено через 1 минуту и 11 секунд
опередили smile 

Это сообщение отредактировал(а) azesmcar - 13.4.2009, 20:56
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0607 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.