Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как быстро скомпилить проект?


Автор: gunmanill 12.11.2011, 08:06
Есть программа размером порядка 1гб Большая часть кода сгенерированно и представляет собой описание функций. Причем функции достаточно простые по типу вернуть сумму и пр. Эти функции я запихал в отдельные заголовочные файлы. Под win32 скомпилить впринципе не получилось. Поставил x64 систему, проапдейтил комп 16гб оперативки, 2 жестких диска в рейде 0. Поставил intel c++ компилятор. В итоге что происходит - по-началу прога постепенно сжирает всю оперативку, файл подкачки 30гб и процессор вроде как что-то просчитывает. Через сутки проц уже вообще как-будто ничего не делает, иногда подпрыгивает в 5%, а компилятор просто там что-то пережевывает из оперативки на жесткий и обратно. Я выдержал 3 дня ожиданий и выключил. Прочитал, что есть параметр /Od - выключить все оптимизации. Сейчас поставил снова компилить, после работы приду посмотрю что будет. Неужели так трудно перевести все в машинный код? Мне впринципе не нужны никакие оптимизации. Может есть какой-то способ и я просто не то делаю?

Автор: boostcoder 12.11.2011, 08:26
такое возможно только в том случае, если исходники очень большого размера. так что делите.

Добавлено через 7 минут и 19 секунд
боюсь даже поинтересоваться, для чего вам миллионы функций smile 

Автор: borisbn 12.11.2011, 09:22
user posted image

Автор: gunmanill 12.11.2011, 09:35
 smile  Результатими функций запоняется матрица.  Т.е. лучше рабить на бОльшее колличество файлов, так компилятору легче будет?

Автор: boostcoder 12.11.2011, 09:39
gunmanill, да. только не на хидеры. а то вдруг у тебя весь код в хидерах написан. тогда разбивать бесполезно.

Добавлено через 14 секунд
borisbn, а это к чему?

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

Автор: gunmanill 12.11.2011, 09:44
А тогда смысла нет разбивать, мне тогда чтобы обратиться к функциям придется писать хидер, который выйдет чуть всего-лишь меньше. У меня в теле функции сразу идет что-то по типу return a+b*c...  Или если в хидере только заголовки, то он не будет его жестко лопатить? 

Автор: boostcoder 12.11.2011, 10:13
да. вынеси в хидеры декларации, а в .c/.cpp реализации. и подели на файлы. а то вдруг у тебя все в одном файле с миллионом строк.

Автор: borisbn 12.11.2011, 10:26
я просто предположил, что за систему компиляет gunmanill  smile 

Проект лучше разбить на н-ное количество статических библиотек, а потом линковать их к проекту программы.
Если не получается смыслового разделения - можно просто разбить по 1000...10000 ф-ций на либину.
Да... и в этом случае реализацию функций (даже очень простых) лучше перенести в *.cpp

Добавлено через 3 минуты и 38 секунд
Цитата(gunmanill @  12.11.2011,  08:06 Найти цитируемый пост)
Поставил intel c++ компилятор.

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

Добавлено через 7 минут и 10 секунд
а... и ещё. компилять надо без дебаговой информации, ессно. существенно быстрее будет

Автор: alexvs11 12.11.2011, 11:50
make -j 8 ?  smile 
так что вы собариаете

Автор: bsa 12.11.2011, 12:48
Цитата(gunmanill @  12.11.2011,  09:06 Найти цитируемый пост)
Неужели так трудно перевести все в машинный код? Мне впринципе не нужны никакие оптимизации. Может есть какой-то способ и я просто не то делаю? 

Чтобы исходник перевести в исполняемый код система сборки должна выполнить 4 операции:
1. препроцессинг (обработка всяких #define/#include и пр)
2. компиляция - преобразование к ассемблерному коду
3. ассемблирование - преобразование к объектному коду.
4. компоновка

Причем, пункт 1 в общем случае увеличивает объем исходника. Пункт 2 сжирает памяти в несколько раз больше, чем исходник. Ассемблерный текст занимает больше места, чем перед компиляцией.
Таким образом, чтобы программа успешно скомпилировалась необходимо разделись твой гигабайтный исходник на тысячу мегабайтных и компилировать по отдельности.
Кстати, мне одно непонятно, а зачем тебе хидер? Т.е. где-то есть программа, которая все эти миллионы функций использует? Тогда она тоже должна быть невпупительного объема. Короче, давай больше информации: зачем, для чего, как работает... А мы подумаем и скажем, как лучше организовать этот проект.

Автор: gunmanill 12.11.2011, 14:50
У меня всего один cpp и он использует все эти функции, в хидер я запилил просто для удобства(не пихать же в cpp, он у меня тогда вообще не откроется в редакторе). Чтобы функции вызывать лелаю так:
double (*f[N])(double *) = {f1,f2,f3....fN};  ну и в cpp вызываю по индексу, поэтому он небольшой.
Я сейчас разбиваю на cpp'шники, в хидерах оставляю только заголовки, может лучше пойдет... 

Автор: math64 12.11.2011, 15:02
Возможно, зря мелкие функции перенесены в заголовки.
C++ код может быть коротким, а генерируемый машинный код длинный. Например, обращение к указатетелю на метод класса может занимать около 256 байт.
При каждом вызове машинный код дублируется.
Ограничь применение шаблонов - опять же, короткий код на C++ выливается в дублирование почти идентичного машинного кода.

Автор: gunmanill 12.11.2011, 17:37
Разбиение на модули вроде помогло, по крайней мере пошел видимый процесс компиляции. Однако один из модулей остался размером 250 мб, его никак не урезать. Самое печальное, что в итоге мне надо будет, чтобы код в 4 раза больше был, сейчас пока тестирую скомпилится или нет вообще. И тогда один из модулей будет не 250мб, а гиг.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)