Dlaczego kompilacja w C ++ trwa tak długo?

540

Kompilacja pliku C ++ zajmuje bardzo dużo czasu w porównaniu do C # i Java. Skompilowanie pliku C ++ zajmuje znacznie więcej czasu niż uruchomienie skryptu Python o normalnym rozmiarze. Obecnie używam VC ++, ale jest tak samo z każdym kompilatorem. Dlaczego to?

Dwa powody, dla których mogłem wymyślić, to ładowanie plików nagłówkowych i uruchamianie preprocesora, ale nie wydaje się, żeby to wyjaśniało, dlaczego zajmuje to tak długo.

Dan Goldstein
źródło
58
VC ++ obsługuje wstępnie skompilowane nagłówki. Korzystanie z nich pomoże. Dużo.
Brian
1
Tak w moim przypadku (głównie C z kilkoma klasami - bez szablonów) nagłówki prekompilowane przyspieszają około 10x
Lothar
@Brian Nigdy nie użyłbym wcześniej skompilowanej głowy w bibliotece
Cole Johnson
13
It takes significantly longer to compile a C++ file- masz na myśli 2 sekundy w porównaniu do 1 sekundy? Z pewnością jest to dwa razy więcej, ale mało znaczące. A może masz na myśli 10 minut w porównaniu do 5 sekund? Proszę określić ilościowo.
Nick Gammon
2
Stawiam na moduły; Nie oczekuję, że projekty w C ++ będą szybsze w budowaniu niż w innym języku programowania, tylko z modułami, ale może być naprawdę blisko większości projektów z pewnym zarządzaniem. Mam nadzieję, że po modułach zobaczę dobrego menedżera pakietów ze sztuczną integracją
Abdurrahim,

Odpowiedzi:

800

Kilka powodów

Pliki nagłówkowe

Każda jednostka kompilacji wymaga (1) załadowania i (2) skompilowania setek, a nawet tysięcy nagłówków. Każdy z nich zazwyczaj musi zostać ponownie skompilowany dla każdej jednostki kompilacji, ponieważ preprocesor zapewnia, że ​​wynik kompilacji nagłówka może się różnić między każdą jednostką kompilacji. (Makro może być zdefiniowane w jednej jednostce kompilacji, która zmienia zawartość nagłówka).

Jest to prawdopodobnie Głównym powodem, ponieważ wymaga ogromnych ilości kodu zostać skompilowane dla każdej jednostki kompilacji, a dodatkowo, każdy nagłówek musi być skompilowany wiele razy (raz dla każdej jednostki kompilacji, która zawiera go).

Łączenie

Po skompilowaniu wszystkie pliki obiektowe muszą zostać połączone. Zasadniczo jest to monolityczny proces, którego nie da się zrównoważyć, i musi on przetworzyć cały projekt.

Rozbiór gramatyczny zdania

Składnia jest wyjątkowo skomplikowana do przeanalizowania, zależy w dużym stopniu od kontekstu i bardzo trudno jest ją jednoznacznie określić. To zajmuje dużo czasu.

Szablony

W języku C # List<T>jest to jedyny typ, który jest kompilowany, bez względu na to, ile wystąpień listy masz w swoim programie. W C ++ vector<int>jest całkowicie odrębnym typem vector<float>i każdy będzie musiał zostać skompilowany osobno.

Dodaj do tego, że szablony tworzą pełny „podjęzyk” Turinga, który kompilator musi interpretować, a to może stać się absurdalnie skomplikowane. Nawet stosunkowo prosty kod metaprogramowania szablonów może definiować szablony rekurencyjne, które tworzą dziesiątki instancji szablonów. Szablony mogą również skutkować wyjątkowo złożonymi typami, z absurdalnie długimi nazwami, co dodaje dodatkowej pracy do linkera. (Musi porównać wiele nazw symboli, a jeśli nazwy te mogą urosnąć do wielu tysięcy znaków, mogą stać się dość drogie).

I oczywiście zaostrzają problemy z plikami nagłówkowymi, ponieważ szablony zwykle muszą być definiowane w nagłówkach, co oznacza, że ​​o wiele więcej kodu musi zostać przeanalizowane i skompilowane dla każdej jednostki kompilacji. W zwykłym kodzie C nagłówek zazwyczaj zawiera tylko deklaracje przesyłania, ale bardzo mało rzeczywistego kodu. W C ++ nierzadko prawie cały kod znajduje się w plikach nagłówkowych.

Optymalizacja

C ++ pozwala na bardzo dramatyczne optymalizacje. C # lub Java nie pozwalają na całkowite wyeliminowanie klas (muszą one tam być w celu odbicia), ale nawet prosty metaprogram szablonu C ++ może z łatwością wygenerować dziesiątki lub setki klas, z których wszystkie są uwzględniane i ponownie eliminowane podczas optymalizacji faza.

Ponadto kompilator musi w pełni zoptymalizować program C ++. Program AC # może polegać na kompilatorze JIT w celu wykonywania dodatkowych optymalizacji w czasie ładowania, C ++ nie ma takich „drugich szans”. To, co generuje kompilator, jest tak zoptymalizowane, jak to tylko możliwe.

Maszyna

C ++ jest kompilowany do kodu maszynowego, który może być nieco bardziej skomplikowany niż użycie kodu bajtowego Java lub .NET (szczególnie w przypadku x86). (Jest to wspomniane kompletnie tylko dlatego, że zostało wspomniane w komentarzach itp. W praktyce jest mało prawdopodobne, aby krok ten zajął więcej niż niewielką część całkowitego czasu kompilacji).

Wniosek

Większość tych czynników jest współdzielona przez kod C, który faktycznie kompiluje się dość skutecznie. Etap analizy jest w C ++ o wiele bardziej skomplikowany i może zająć znacznie więcej czasu, ale głównym przestępcą są prawdopodobnie szablony. Są użyteczne i sprawiają, że C ++ jest znacznie potężniejszym językiem, ale także odbijają się na szybkości kompilacji.

jalf
źródło
38
W odniesieniu do punktu 3: kompilacja C jest zauważalnie szybsza niż C ++. Zdecydowanie frontend powoduje spowolnienie, a nie generowanie kodu.
Tom
72
Jeśli chodzi o szablony: nie tylko wektor <int> musi zostać skompilowany oddzielnie od wektora <double>, ale wektor <int> jest ponownie skompilowany w każdej jednostce kompilacji, która go używa. Nadmiarowe definicje są eliminowane przez linker.
David Rodríguez - dribeas
15
dribeas: Prawda, ale nie jest to specyficzne dla szablonów. Funkcje wbudowane lub cokolwiek innego zdefiniowane w nagłówkach zostaną ponownie skompilowane wszędzie tam, gdzie są uwzględnione. Ale tak, to szczególnie bolesne w przypadku szablonów. :)
lipiec
15
@configurator: Visual Studio i gcc pozwalają na prekompilowane nagłówki, które mogą przynieść poważne przyspieszenie kompilacji.
small_duck
5
Nie jestem pewien, czy problemem jest optymalizacja, ponieważ nasze kompilacje DEBUG są w rzeczywistości wolniejsze niż kompilacje w trybie wydania. Winowajcą jest również generacja pdb.
gast128
40

Spowolnienie niekoniecznie jest takie samo w przypadku jakiegokolwiek kompilatora.

Nie używałem Delphi ani Kylix, ale w czasach MS-DOS program Turbo Pascal skompilowałby się niemal natychmiast, podczas gdy równoważny program Turbo C ++ po prostu zaindeksowałby.

Dwie główne różnice to bardzo mocny system modułowy i składnia umożliwiająca kompilację jednoprzebiegową.

Jest oczywiście możliwe, że szybkość kompilacji po prostu nie była priorytetem dla programistów kompilatorów C ++, ale istnieją pewne nieodłączne komplikacje w składni C / C ++, które utrudniają przetwarzanie. (Nie jestem ekspertem od C, ale Walter Bright jest i po zbudowaniu różnych komercyjnych kompilatorów C / C ++ stworzył język D. Jedną z jego zmian było wymuszenie gramatyki bezkontekstowej, aby ułatwić analizowanie języka .)

Zauważysz również, że ogólnie Pliki Makefile są skonfigurowane tak, że każdy plik jest kompilowany osobno w C, więc jeśli 10 plików źródłowych używa tego samego pliku dołączania, ten plik dołączania jest przetwarzany 10 razy.

Tangentstorm
źródło
38
Porównywanie Pascala jest interesujące, ponieważ Niklaus Wirth poświęcił czas kompilatorowi na skompilowanie się jako punkt odniesienia przy projektowaniu języków i kompilatorów. Istnieje historia, że ​​po starannym napisaniu modułu do szybkiego wyszukiwania symboli zastąpił go prostym wyszukiwaniem liniowym, ponieważ zmniejszony rozmiar kodu spowodował, że kompilator sam się skompilował.
Dietrich Epp,
1
@DietrichEpp Empiryzm się opłaca.
Tomas Zubiri
39

Parsowanie i generowanie kodu jest w rzeczywistości dość szybkie. Prawdziwym problemem jest otwieranie i zamykanie plików. Pamiętaj, że nawet przy włączonych strażnikach kompilator nadal ma otwarty plik .H i czyta każdą linię (a następnie ją ignoruje).

Kiedyś przyjaciel (znudzony pracą), wziął aplikację swojej firmy i umieścił wszystko - wszystkie pliki źródłowe i nagłówkowe - w jednym dużym pliku. Czas kompilacji spadł z 3 godzin do 7 minut.

James Curran
źródło
14
Cóż, dostęp do plików ma pewną rękę, ale jak powiedział Jalf, głównym powodem tego będzie coś innego, a mianowicie powtarzane analizowanie wielu, wielu, wielu (zagnieżdżonych!) Plików nagłówkowych, które całkowicie wypadają w twoim przypadku.
Konrad Rudolph,
9
W tym momencie twój przyjaciel musi skonfigurować wstępnie skompilowane nagłówki, przełamać zależności między różnymi plikami nagłówków (staraj się unikać jednego nagłówka łącznie z drugim, zamiast deklarować do przodu) i uzyskaj szybszy dysk twardy. Poza tym całkiem niesamowita metryka.
Tom Leys,
6
Jeśli cały plik nagłówka (z wyjątkiem możliwych komentarzy i pustych linii) znajduje się w osłonach nagłówka, gcc może zapamiętać plik i pominąć go, jeśli zdefiniowano prawidłowy symbol.
CesarB,
11
Parsowanie to wielka sprawa. W przypadku N par plików źródłowych / nagłówków o podobnych rozmiarach z wzajemnymi zależnościami istnieje pliki O (N ^ 2) przechodzące przez pliki nagłówkowe. Umieszczenie całego tekstu w jednym pliku eliminuje duplikowanie analizy.
Tom
9
Mała uwaga dodatkowa: Obejmuje to osłony chroniące przed wieloma analizami na jednostkę kompilacji. Nie przeciwko wielu analizom.
Marco van de Voort
16

Innym powodem jest użycie preprocesora C do lokalizowania deklaracji. Nawet w przypadku nagłówków nagłówek .h wciąż musi być analizowany w kółko, za każdym razem, gdy są uwzględniane. Niektóre kompilatory obsługują wstępnie skompilowane nagłówki, które mogą w tym pomóc, ale nie zawsze są używane.

Zobacz także: C ++ Często zadawane pytania

Dave Ray
źródło
Myślę, że powinieneś pogrubić komentarz na temat prekompilowanych nagłówków, aby zwrócić uwagę na WAŻNĄ część swojej odpowiedzi.
Kevin,
6
Jeśli cały plik nagłówka (z wyjątkiem możliwych komentarzy i pustych linii) znajduje się w osłonach nagłówka, gcc może zapamiętać plik i pominąć go, jeśli zdefiniowano prawidłowy symbol.
CesarB,
5
@CesarB: Nadal musi przetworzyć go w całości raz na jednostkę kompilacji (plik .cpp).
Sam Harwell,
16

C ++ jest kompilowany do kodu maszynowego. Masz więc procesor wstępny, kompilator, optymalizator i wreszcie asembler, z których wszystkie muszą działać.

Java i C # są kompilowane w bajt-code / IL, a maszyna wirtualna Java / .NET Framework wykonuje się (lub JIT kompiluje w kod maszynowy) przed wykonaniem.

Python jest językiem interpretowanym, który jest również kompilowany do kodu bajtowego.

Jestem pewien, że istnieją również inne powody, ale ogólnie rzecz biorąc, brak konieczności kompilacji do natywnego języka maszynowego oszczędza czas.

Alan
źródło
15
Koszt dodany przez przetwarzanie wstępne jest trywialny. Głównym „innym powodem” spowolnienia jest to, że kompilacja jest podzielona na osobne zadania (po jednym na plik obiektowy), więc wspólne nagłówki są przetwarzane w kółko. To najgorszy przypadek O (N ^ 2) w porównaniu z czasem analizy O (N) w innych językach.
Tom
12
Na podstawie tej samej argumentacji można stwierdzić, że kompilatory C, Pascal itp. Są wolne, co nie jest prawdą średnio. Ma to więcej wspólnego z gramatyką C ++ i ogromnym stanem, który musi utrzymać kompilator C ++.
Sebastian Mach
2
C jest wolny. Ma on ten sam problem z analizą nagłówków, co przyjęte rozwiązanie. Np. Weź prosty program GUI dla systemu Windows, który zawiera windows.h w kilku jednostkach kompilacyjnych, i mierz wydajność kompilacji, dodając (krótkie) jednostki kompilacyjne.
Marco van de Voort,
13

Największe problemy to:

1) Nieskończone przetwarzanie nagłówka. Już wspomniane. Ograniczenia (jak raz #pragma) zwykle działają tylko na jednostkę kompilacji, a nie na kompilację.

2) Fakt, że zestaw narzędzi jest często podzielony na wiele plików binarnych (marka, preprocesor, kompilator, asembler, archiwizator, impdef, linker i dlltool w skrajnych przypadkach), które muszą ponownie zainicjować i ponownie załadować cały stan dla każdego wywołania ( kompilator, asembler) lub co kilka plików (archiwizator, linker i dlltool).

Zobacz także tę dyskusję na temat comp.compilers: http://compilers.iecc.com/comparch/article/03-11-078, szczególnie ta:

http://compilers.iecc.com/comparch/article/02-07-128

Zauważ, że John, moderator kompilatorów kompilacji, wydaje się zgadzać, a to oznacza, że ​​powinno być możliwe osiągnięcie podobnych prędkości również dla C, jeśli w pełni zintegrujesz łańcuch narzędzi i zaimplementujesz prekompilowane nagłówki. Wiele komercyjnych kompilatorów C robi to do pewnego stopnia.

Zauważ, że uniksowy model faktoryzacji wszystkiego do osobnego pliku binarnego jest rodzajem najgorszego modelu dla Windows (z powolnym tworzeniem procesu). Jest to bardzo zauważalne przy porównywaniu czasów kompilacji GCC między Windows a * nix, szczególnie jeśli system make / config wywołuje również niektóre programy tylko w celu uzyskania informacji.

Marco van de Voort
źródło
12

Budowanie C / C ++: co tak naprawdę się dzieje i dlaczego zajmuje tak dużo czasu

Stosunkowo duża część czasu na tworzenie oprogramowania nie jest poświęcana na pisanie, uruchamianie, debugowanie, a nawet projektowanie kodu, ale na oczekiwanie na zakończenie kompilacji. Aby wszystko działało szybko, musimy najpierw zrozumieć, co się dzieje, gdy kompilowane jest oprogramowanie C / C ++. Kroki są z grubsza następujące:

  • Konfiguracja
  • Zbuduj uruchomienie narzędzia
  • Sprawdzanie zależności
  • Kompilacja
  • Łączenie

Teraz przyjrzymy się każdemu krokowi bardziej szczegółowo, koncentrując się na tym, jak można je przyspieszyć.

Konfiguracja

To pierwszy krok od rozpoczęcia budowy. Zwykle oznacza uruchomienie skryptu konfiguracyjnego lub CMake, Gyp, SCons lub innego narzędzia. Może to zająć od jednej sekundy do kilku minut w przypadku bardzo dużych skryptów konfiguracyjnych opartych na Autotools.

Ten krok zdarza się stosunkowo rzadko. Należy go uruchomić tylko podczas zmiany konfiguracji lub konfiguracji kompilacji. Poza zmieniającymi się systemami kompilacji niewiele można zrobić, aby ten krok był szybszy.

Zbuduj uruchomienie narzędzia

Tak się dzieje po uruchomieniu make lub kliknięciu ikony kompilacji w IDE (która jest zwykle aliasem make). Plik binarny narzędzia do budowania uruchamia się i odczytuje pliki konfiguracyjne oraz konfigurację kompilacji, które zwykle są tym samym.

W zależności od złożoności i wielkości kompilacji może to zająć od ułamka sekundy do kilku sekund. Samo w sobie nie byłoby tak źle. Niestety większość systemów budowania opartych na marce powoduje, że make jest wywoływany dziesiątki do setek razy dla każdego kompilacji. Zwykle jest to spowodowane rekurencyjnym użyciem make (co jest złe).

Należy zauważyć, że powodem, dla którego Make jest tak wolny, nie jest błąd implementacyjny. Składnia Makefiles ma pewne dziwactwa, które sprawiają, że naprawdę szybka implementacja jest prawie niemożliwa. Problem ten jest jeszcze bardziej zauważalny w połączeniu z następnym krokiem.

Sprawdzanie zależności

Po przeczytaniu konfiguracji narzędzie do budowania musi określić, które pliki uległy zmianie i które należy ponownie skompilować. Pliki konfiguracyjne zawierają ukierunkowany wykres acykliczny opisujący zależności kompilacji. Ten wykres jest zwykle budowany podczas etapu konfiguracji. Czas uruchamiania narzędzia kompilacji i skaner zależności są uruchamiane na każdej kompilacji. Ich łączny czas pracy określa dolną granicę cyklu edycji-kompilacji-debugowania. W przypadku małych projektów czas ten wynosi zwykle kilka sekund. To jest tolerowane. Istnieją alternatywy dla Make. Najszybszym z nich jest Ninja, która została zbudowana przez inżynierów Google dla Chromium. Jeśli używasz CMake lub Gyp do budowania, po prostu przełącz się na ich zaplecza Ninja. Nie musisz nic zmieniać w samych plikach kompilacji, po prostu ciesz się przyspieszeniem. Ninja nie jest jednak pakowana w większości dystrybucji,

Kompilacja

W tym momencie w końcu wywołujemy kompilator. Cięcie niektórych rogów, oto przybliżone kroki, które zostały wykonane.

  • Scalanie obejmuje
  • Przetwarzanie kodu
  • Generowanie / optymalizacja kodu

Wbrew powszechnemu przekonaniu, kompilacja C ++ nie jest wcale taka wolna. STL działa wolno, a większość narzędzi do kompilacji używanych do kompilacji C ++ działa wolno. Istnieją jednak szybsze narzędzia i sposoby łagodzenia wolnych części języka.

Ich użycie wymaga trochę smaru łokciowego, ale korzyści są niezaprzeczalne. Szybsze czasy kompilacji prowadzą do szczęśliwszych programistów, większej zwinności i ostatecznie lepszego kodu.

Ravindra Acharya
źródło
9

Skompilowany język zawsze będzie wymagał większego obciążenia początkowego niż język interpretowany. Ponadto być może nie ułożyłeś dobrze kodu C ++. Na przykład:

#include "BigClass.h"

class SmallClass
{
   BigClass m_bigClass;
}

Kompiluje się dużo wolniej niż:

class BigClass;

class SmallClass
{
   BigClass* m_bigClass;
}
Andy Brice
źródło
3
Szczególnie prawdziwe, jeśli BigClass zawiera 5 dodatkowych plików, których używa, ostatecznie włączając cały kod do twojego programu.
Tom Leys,
7
To może być jeden z powodów. Ale na przykład Pascal zajmuje tylko jedną dziesiątą czasu kompilacji, który zajmuje równoważny program C ++. Nie dzieje się tak dlatego, że optymalizacja gcc trwa dłużej, ale raczej to, że Pascal jest łatwiejszy do analizy i nie musi zajmować się preprocesorem. Zobacz także kompilator Digital Mars D.
Daniel O
2
To nie jest łatwiejsze parsowanie, to modułowość, która pozwala uniknąć ponownej interpretacji windows.h i wielu innych nagłówków dla każdej jednostki kompilacji. Tak, Pascal analizuje łatwiej (choć te dojrzałe, takie jak Delphi, są znowu bardziej skomplikowane), ale to nie robi dużej różnicy.
Marco van de Voort
1
Pokazana tutaj technika, która oferuje poprawę prędkości kompilacji, jest znana jako deklaracja forward .
DavidRR
pisanie zajęć w jednym pliku. czy nie byłby to niechlujny kod?
Fennekin
7

Prostym sposobem na skrócenie czasu kompilacji w większych projektach C ++ jest utworzenie pliku * .cpp zawierającego wszystkie pliki cpp w projekcie i skompilowanie go. Zmniejsza to problem wybuchu nagłówka do jednego razu. Zaletą tego jest to, że błędy kompilacji nadal będą odnosić się do poprawnego pliku.

Załóżmy na przykład, że masz pliki a.cpp, b.cpp i c.cpp .. utwórz plik: everything.cpp:

#include "a.cpp"
#include "b.cpp"
#include "c.cpp"

Następnie skompiluj projekt, tworząc po prostu everything.cpp

Rileyberton
źródło
3
Nie widzę sprzeciwu wobec tej metody. Zakładając, że generujesz dołączenia ze skryptu lub pliku Makefile, nie jest to problem z konserwacją. W rzeczywistości przyspiesza kompilację bez zaciemniania problemów z kompilacją. Można argumentować zużycie pamięci podczas kompilacji, ale rzadko jest to problem na nowoczesnym komputerze. Jaki jest zatem cel tego podejścia (oprócz twierdzenia, że ​​jest ono błędne)?
rileyberton
9
@rileyberton (odkąd ktoś głosował za twoim komentarzem) pozwól mi przeliterować: nie, to nie przyspiesza kompilacji. W rzeczywistości upewnia się, że każda kompilacja zabiera maksymalny czas , nie izolując jednostek tłumaczeniowych. Wspaniałą rzeczą w nich jest to, że nie trzeba ponownie kompilować wszystkich plików .cpp-s, jeśli się nie zmieniły. (Pomijając argumenty stylistyczne). Właściwe zarządzanie zależnościami i być może prekompilowane nagłówki są znacznie lepsze.
patrz
7
Przykro nam, ale może to być bardzo skuteczna metoda przyspieszenia kompilacji, ponieważ (1) praktycznie eliminujesz łączenie, a (2) tylko raz przetwarzasz często używane nagłówki. Działa również w praktyce , jeśli próbujesz go wypróbować. Niestety, uniemożliwia to przyrostowe przebudowy, więc każda kompilacja jest całkowicie od zera. Ale pełna przebudowa przy użyciu tej metody jest o wiele szybsza niż w innym przypadku
2013
4
@BartekBanachewicz na pewno, ale powiedziałeś, że „nie przyspiesza kompilacji”, bez żadnych kwalifikacji. Jak już wspomniałeś, powoduje to, że każda kompilacja zajmuje maksymalny czas (bez częściowych przebudowań), ale jednocześnie radykalnie zmniejsza maksimum w porównaniu z tym, czym byłby w innym przypadku. Mówię tylko, że jest to trochę bardziej dopracowany niż „nie rób tego”
jalf
2
Baw się ze zmiennymi statycznymi i funkcjami. Jeśli chcę dużą jednostkę kompilacyjną, utworzę duży plik .cpp.
gnasher729
6

Niektóre powody to:

1) Gramatyka C ++ jest bardziej złożona niż C # lub Java i zajmuje więcej czasu na analizę.

2) (Co ważniejsze) Kompilator C ++ tworzy kod maszynowy i wykonuje wszystkie optymalizacje podczas kompilacji. C # i Java idą tylko do połowy i pozostaw te kroki JIT.

Nemanja Trifunovic
źródło
5

Kompromis, który otrzymujesz, polega na tym, że program działa trochę szybciej. Może to być dla ciebie zimnym komfortem podczas programowania, ale może mieć duże znaczenie po zakończeniu programowania, a program jest po prostu uruchamiany przez użytkowników.

PRZETRZĄSAĆ
źródło
3

Większość odpowiedzi jest nieco niejasna, gdy wspomina się, że C # zawsze będzie działał wolniej ze względu na koszt wykonywania działań, które w C ++ są wykonywane tylko raz w czasie kompilacji, ten koszt wydajności ma również wpływ ze względu na zależności środowiska wykonawczego (więcej rzeczy do załadowania, aby móc do uruchomienia), nie wspominając o tym, że programy w języku C # zawsze będą miały więcej pamięci, co skutkuje ściślejszą wydajnością związaną z możliwościami dostępnego sprzętu. To samo dotyczy innych języków, które są interpretowane lub zależą od maszyny wirtualnej.

Panika
źródło
3

Są dwa problemy, które mogą mieć wpływ na szybkość kompilacji twoich programów w C ++.

MOŻLIWE ZAGADNIENIE nr 1 - KOMPILACJA NAGŁÓWKA: (To może być lub nie być rozwiązane przez inną odpowiedź lub komentarz.) Microsoft Visual C ++ (AKA VC ++) obsługuje wstępnie skompilowane nagłówki, które bardzo polecam. Po utworzeniu nowego projektu i wybraniu rodzaju tworzonego programu na ekranie powinno pojawić się okno kreatora instalacji. Jeśli naciśniesz przycisk „Dalej>” u dołu, okno przeniesie Cię do strony, która ma kilka list funkcji; upewnij się, że pole obok opcji „Prekompilowany nagłówek” jest zaznaczone. (UWAGA: Takie było moje doświadczenie z aplikacjami konsolowymi Win32 w C ++, ale może nie być tak w przypadku wszystkich rodzajów programów w C ++.)

MOŻLIWA KWESTIA # 2 - LOKALIZACJA, DO KTÓREJ JEST KOMPILACJA: Tego lata wziąłem kurs programowania i musieliśmy przechowywać wszystkie nasze projekty na dyskach flash 8 GB, ponieważ komputery w laboratorium, z którego korzystaliśmy, były czyszczone co noc o północy, co wymazałoby całą naszą pracę. Jeśli kompilujesz się na zewnętrzne urządzenie pamięci masowej ze względu na przenośność / bezpieczeństwo / itp., Może to potrwać bardzo długoczas (nawet z wcześniej skompilowanymi nagłówkami, o których wspomniałem powyżej) na kompilację programu, szczególnie jeśli jest to dość duży program. Radzę ci w tym przypadku tworzyć i kompilować programy na dysku twardym komputera, z którego korzystasz, a gdy chcesz / musisz przerwać pracę nad projektem (projektami) z jakiegokolwiek powodu, przenieś je do zewnętrznego urządzenie pamięci, a następnie kliknij ikonę „Bezpiecznie usuń sprzęt i wysuń nośnik”, która powinna pojawić się jako mały dysk flash za małym zielonym kółkiem z białym znacznikiem wyboru, aby go odłączyć.

Mam nadzieję, że to Ci pomoże; daj mi znać, jeśli tak! :)

cjor530
źródło