![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| gunmanill |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 12.11.2011 Репутация: нет Всего: нет |
Есть программа размером порядка 1гб Большая часть кода сгенерированно и представляет собой описание функций. Причем функции достаточно простые по типу вернуть сумму и пр. Эти функции я запихал в отдельные заголовочные файлы. Под win32 скомпилить впринципе не получилось. Поставил x64 систему, проапдейтил комп 16гб оперативки, 2 жестких диска в рейде 0. Поставил intel c++ компилятор. В итоге что происходит - по-началу прога постепенно сжирает всю оперативку, файл подкачки 30гб и процессор вроде как что-то просчитывает. Через сутки проц уже вообще как-будто ничего не делает, иногда подпрыгивает в 5%, а компилятор просто там что-то пережевывает из оперативки на жесткий и обратно. Я выдержал 3 дня ожиданий и выключил. Прочитал, что есть параметр /Od - выключить все оптимизации. Сейчас поставил снова компилить, после работы приду посмотрю что будет. Неужели так трудно перевести все в машинный код? Мне впринципе не нужны никакие оптимизации. Может есть какой-то способ и я просто не то делаю?
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
такое возможно только в том случае, если исходники очень большого размера. так что делите.
Добавлено через 7 минут и 19 секунд боюсь даже поинтересоваться, для чего вам миллионы функций |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
![]() Это сообщение отредактировал(а) borisbn - 12.11.2011, 09:24 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| gunmanill |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 12.11.2011 Репутация: нет Всего: нет |
|
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
gunmanill, да. только не на хидеры. а то вдруг у тебя весь код в хидерах написан. тогда разбивать бесполезно.
Добавлено через 14 секунд borisbn, а это к чему? Добавлено через 52 секунды ааа, начало пророчества терминаторов |
|||
|
||||
| gunmanill |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 12.11.2011 Репутация: нет Всего: нет |
А тогда смысла нет разбивать, мне тогда чтобы обратиться к функциям придется писать хидер, который выйдет чуть всего-лишь меньше. У меня в теле функции сразу идет что-то по типу return a+b*c... Или если в хидере только заголовки, то он не будет его жестко лопатить?
Это сообщение отредактировал(а) gunmanill - 12.11.2011, 09:45 |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
да. вынеси в хидеры декларации, а в .c/.cpp реализации. и подели на файлы. а то вдруг у тебя все в одном файле с миллионом строк.
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
я просто предположил, что за систему компиляет gunmanill
Проект лучше разбить на н-ное количество статических библиотек, а потом линковать их к проекту программы. Если не получается смыслового разделения - можно просто разбить по 1000...10000 ф-ций на либину. Да... и в этом случае реализацию функций (даже очень простых) лучше перенести в *.cpp Добавлено через 3 минуты и 38 секунд мягко говоря, не самый быстрый. студийный побыстрее будет. особенно, если дать ему сразу несколько проектов (в одном солюшене). тогда он будет компилировать их параллельно. Кста, хорошо ложится на разбиение на либины Добавлено через 7 минут и 10 секунд а... и ещё. компилять надо без дебаговой информации, ессно. существенно быстрее будет -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 6 Всего: 10 |
make -j 8 ?
так что вы собариаете |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Чтобы исходник перевести в исполняемый код система сборки должна выполнить 4 операции: 1. препроцессинг (обработка всяких #define/#include и пр) 2. компиляция - преобразование к ассемблерному коду 3. ассемблирование - преобразование к объектному коду. 4. компоновка Причем, пункт 1 в общем случае увеличивает объем исходника. Пункт 2 сжирает памяти в несколько раз больше, чем исходник. Ассемблерный текст занимает больше места, чем перед компиляцией. Таким образом, чтобы программа успешно скомпилировалась необходимо разделись твой гигабайтный исходник на тысячу мегабайтных и компилировать по отдельности. Кстати, мне одно непонятно, а зачем тебе хидер? Т.е. где-то есть программа, которая все эти миллионы функций использует? Тогда она тоже должна быть невпупительного объема. Короче, давай больше информации: зачем, для чего, как работает... А мы подумаем и скажем, как лучше организовать этот проект. |
|||
|
||||
| gunmanill |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 12.11.2011 Репутация: нет Всего: нет |
У меня всего один cpp и он использует все эти функции, в хидер я запилил просто для удобства(не пихать же в cpp, он у меня тогда вообще не откроется в редакторе). Чтобы функции вызывать лелаю так:
double (*f[N])(double *) = {f1,f2,f3....fN}; ну и в cpp вызываю по индексу, поэтому он небольшой. Я сейчас разбиваю на cpp'шники, в хидерах оставляю только заголовки, может лучше пойдет... |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Возможно, зря мелкие функции перенесены в заголовки.
C++ код может быть коротким, а генерируемый машинный код длинный. Например, обращение к указатетелю на метод класса может занимать около 256 байт. При каждом вызове машинный код дублируется. Ограничь применение шаблонов - опять же, короткий код на C++ выливается в дублирование почти идентичного машинного кода. |
|||
|
||||
| gunmanill |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 12.11.2011 Репутация: нет Всего: нет |
Разбиение на модули вроде помогло, по крайней мере пошел видимый процесс компиляции. Однако один из модулей остался размером 250 мб, его никак не урезать. Самое печальное, что в итоге мне надо будет, чтобы код в 4 раза больше был, сейчас пока тестирую скомпилится или нет вообще. И тогда один из модулей будет не 250мб, а гиг.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |