2013-03-27 11 views
112

Nie mogę znaleźć wystarczających informacji, aby zdecydować, który kompilator powinienem użyć do kompilacji mojego projektu. Istnieje kilka programów na różnych komputerach symulujących proces. W Linuksie używam GCC. Wszystko w porządku. Mogę zoptymalizować kod, szybko się kompiluje i zużywa mało pamięci.Jaka jest różnica między sjlj vs karzeł vs seh?

Wykonuję swój własny test porównawczy z kompilatorami MSVC i GCC. Później powstają nieco szybsze binaria (dla każdej podarchitektury). Chociaż czas kompilacji to znacznie więcej niż MSVC.

Postanowiłem więc użyć MinGW. Ale nie można znaleźć żadnego wyjaśnienia na temat metod obsługi wyjątków i ich implementacji w MinGW. Mogę używać różnych dystrybucji dla różnych systemów operacyjnych i architektur.

Uwagi:

  • czas kompilacji i pamięci nie są ważne dla mojego użytku. Jedyną ważną rzeczą jest optymalizacja środowiska wykonawczego. Potrzebuję, żeby moje programy były wystarczająco szybkie. Wolny kompilator jest akceptowalny.
  • System operacyjny: Microsoft Windows XP/7/8/Linux
  • Architektura: Intel Core i7/Core ™ 2/i bardzo stary i686 działa XP: P
+5

Dziwię GCC produkuje kod szybciej niż MSVC; Rzeczy musiały się zmienić w ciągu ostatnich kilku lat ... – trojanfoe

+15

@trojanfoe Powiedziano mi tyle razy, aby używać MSVC zamiast MinGW. Wszyscy myślą, że msvc jest szybszy! Przetestowałem MinGW 7.2 i MSVC 2010. z prostym programem cpu-burst. Na corei7 z '-O3 -mtune = corei7' GCC jest o 45% szybszy niż MSVC –

+4

Z własnego doświadczenia wynika, że ​​z generatorem ruchu szachowego (który używał bitów), zarówno MSVC, jak i Intel C++ były o 10% szybsze niż gcc, ale to było 2 lata temu ... – trojanfoe

Odpowiedz

78

Jest krótki przegląd w MinGW-w64 Wiki:

Dlaczego nie MinGW-W64 gcc support Dwarf-2 Obsługa wyjątków?

Dwarf-2 EH implementacja dla systemu Windows nie jest zaprojektowane w ogóle pracy pod 64-bitowych aplikacji Windows. W trybie win32 wyjątek odwijania instrukcji obsługi nie może być propagowany za pomocą kodu innego niż dw2, co oznacza, że ​​każdy wyjątek przechodzący przez dowolny świadomy kod "obcych klatek", o kodzie innym niż dw2, będzie niepomyślny, włącznie z bibliotekami DLL systemu Windows i bibliotekami DLL zbudowanymi za pomocą Visual. Studio. Kod odwijający DWF-2 w gcc sprawdza zespół odwijania x86 i nie jest w stanie kontynuować bez odwijania informacji od innych karłów-2 .

Metoda obsługi wyjątków działa dla większości przypadków zarówno na win32, jak i na win64, z wyjątkiem ogólnych błędów ochrony. Obsługa strukturalnej obsługi wyjątków w gcc jest rozwijana do przezwyciężenia słabości dw2 i sjlj. W win64 informacje na temat rozwijania są umieszczane w sekcji xdata, a zamiast stosu znajduje się .pdata (tablica deskryptorów funkcji). Dla win32 łańcuch handlerów jest na stosie i musi być zapisany/odtworzony przez rzeczywisty kod wykonany w postaci .

GCC GNU o obsługę wyjątków:

GCC obsługuje dwa sposoby obsługę wyjątków (EH):

  • KARŁOWATA-2 (DW2) EH, co wymaga użycia informacji o debugowaniu DWARF-2 (lub DWARF-3). DW-2 EH może spowodować, że pliki wykonywalne będą lekko nadęte, ponieważ duże tabele rozwijania stosów wywołań muszą być zawarte w plikach wykonywalnych.
  • Metoda oparta na setjmp/longjmp (SJLJ). EH oparte na SJLJ jest znacznie wolniejsze niż DW2 EH (penalizując nawet normalne wykonanie, gdy nie są zgłaszane wyjątki), ale może pracować z kodem, który nie został skompilowany przy użyciu GCC lub który nie ma informacji odwijania stosu wywoływania numeru wywoływania .

[...]

strukturalne obsługę wyjątków (SEH)

Okna wykorzystuje własny mechanizm obsługi wyjątków znany jako strukturyzowane obsługę wyjątków (SEH). [...] Niestety, GCC nie obsługuje jeszcze SEH. [...]

Patrz także:

+7

Dzięki za linki. Mam zamiar użyć DW2 dla 32bit i SEH dla 64. SEH jest dostępny w mingwbuilds (4.8). Czy powinienem poczekać na stabilne wydanie 4.8 lub wszystko w porządku? Tutaj się kompiluje. Obecnie tworzę zależności mojego projektu za pomocą 4.8 z SEH. Żadnych problemów ... –

+5

Zgaduję, że możesz już używać 4.8. – ollo

+2

Wszystkie zależności (w tym biblioteka Boost, OpenSSL, ICU, freeGLUT) zostały skompilowane, ale Qt kończy się dużą ilością wewnętrznych błędów kompilatora. Myślę, że poczekam na stabilne wydanie 4.8 –

61

SJLJ (setjmp/longjmp) : - dostępny dla wersji 32-bitowej i 64-bitowej - nie "zerowy koszt": nawet jeśli wyjątek nie zostanie rzucony, ma on niską karę wykonania (ok. 15% w przypadku ciężkiego kodu wyjątku) - zezwala na wyjątki do przechodzenia przez np. Okna Callbacki

karzeł (DW2, krasnolud-2) - dostępny tylko dla 32 bit - nie stały napowietrznej Runtime - potrzebuje całego stosu wywołań być karzeł z obsługą, która oznacza wyjątki nie mogą być wyrzucane na przykład Biblioteki systemowe systemu Windows.

SEH (wyjątek od zera napowietrznego) - będzie dostępny dla 64-bitowego GCC 4.8.

źródło: http://qt-project.org/wiki/MinGW-64-bit

+2

Przepraszamy, dodano link źródła –

+2

za odpowiedź;) –

+4

Teraz możemy odłożyć to pytanie w 2016 r. i po prostu zawsze używać SEH. – rustyx

Powiązane problemy