2011-01-24 8 views
8

W języku C/C++ (konkretnie używam MSVS), w jakiej sytuacji należałoby się martwić o określenie konwencji wywołującej dla definicji funkcji? Czy są one kiedykolwiek ważne? Czy nie jest w stanie wybrać optymalną konwencję w razie potrzeby (np. Szybka kolejka itd.).MS Visual C++: Kiedy należy obchodzić się z konwencjami wywoływania?

Być może brakuje mi mojego zrozumienia, ale po prostu nie widzę, kiedy byłby to przypadek, w którym programista musiałby dbać o takie rzeczy, jak kolejność argumentów na stosie i tak dalej. Nie widzę również powodu, dla którego optymalizacja kompilatora nie byłaby w stanie wybrać, który schemat byłby najlepszy dla tej konkretnej funkcji. Każda wiedza, którą ktoś mógłby mi zapewnić, byłaby świetna. Dzięki!

+0

To czysto brzydkie dziedzictwo ze względu na zły projekt systemu Windows 1.0, który został przeniesiony do przodu bez powodu. Dopóki używasz właściwych nagłówków do uzyskania prototypów funkcji bibliotecznych, które wywołujesz, nie powinieneś poświęcać więcej czasu na zastanawianie się nad nimi, z wyjątkiem może podczas pisania funkcji zwrotnych, które są wymagane, aby mieć określoną konwencję wywoływania. –

+0

R, masz na myśli, że konwencje wywoływania nie będą ważne dla szybkiego kodu? – Mandrake

Odpowiedz

6

Nie musisz przejmować się aplikacjami 64-bitowymi, ponieważ istnieje tylko jedna konwencja wywoływania.

Trzeba dbać o aplikacji 32-bitowych w następujących przypadkach:

  • możliwość interakcji z bibliotekami 3rd party i nagłówki dla tych bibliotek nie deklarują właściwą konwencję telefonicznej.
  • Tworzysz bibliotekę lub bibliotekę DLL dla innej osoby. Musisz wybrać konwencję wywołującą, aby inny kod korzystał z prawidłowej konwencji wywołującej podczas wywoływania twojego kodu.
+1

+1 dla punktu, w którym 64-bitowy ma tylko jedną konwencję wywoływania. –

+1

w rzeczywistości 64 bit ma dwie konwencje wywoływania przynajmniej na x86_64 - konwencja wywoływania Microsoftu i standardowa konwencja wywoływania –

+0

Właśnie dowiedziałem się, że 64 ma tylko jeden – Mandrake

10

W ujęciu ogólnym, konwencja powołaniem jest ważne, gdy jesteś integracji kodu, który jest kompilowany przez różnych kompilatorów. Na przykład, jeśli publikujesz bibliotekę DLL, która będzie używana przez twoich klientów, będziesz chciał się upewnić, że wyeksportowane funkcje mają spójną, oczekiwaną konwencję wywoływania.

Masz rację, że w ramach jednego programu kompilator może ogólnie wybrać konwencję wywoływania, która ma być używana dla każdej funkcji (reguły są zazwyczaj dość proste).

Powiązane problemy