Funkcje wewnętrzne kompilatora
Większość funkcji jest zawarta w bibliotekach, ale niektóre funkcje są wbudowane (czyli wewnętrzne) do kompilatora. Są one określane jako funkcje wewnętrzne lub funkcje wewnętrzne.
Uwagi
Jeśli funkcja jest funkcją wewnętrzną, kod tej funkcji jest zwykle wstawiany w tekście, unikając narzutu wywołania funkcji i zezwalając na emitowanie wysoce wydajnych instrukcji maszynowych dla tej funkcji. Funkcja wewnętrzna jest często szybsza niż równoważny zestaw wbudowany, ponieważ optymalizator ma wbudowaną wiedzę na temat tego, ile funkcji wewnętrznych zachowuje się, więc niektóre optymalizacje mogą być dostępne, gdy jest używany zestaw wbudowany. Ponadto optymalizator może rozszerzać funkcje wewnętrzne inaczej, wyrównywać inaczej lub wprowadzać inne korekty w zależności od kontekstu i argumentów wywołania.
Użycie funkcji wewnętrznych wpływa na przenośność kodu, ponieważ funkcje wewnętrzne dostępne w języku Visual C++ mogą nie być dostępne, jeśli kod jest kompilowany z innymi kompilatorami, a niektóre funkcje wewnętrzne, które mogą być dostępne dla niektórych architektur docelowych, nie są dostępne dla wszystkich architektur. Jednak funkcje wewnętrzne są zwykle bardziej przenośne niż wbudowany zestaw. Funkcje wewnętrzne są wymagane w architekturach 64-bitowych, w których wbudowany zestaw nie jest obsługiwany.
Niektóre funkcje wewnętrzne, takie jak __assume
i __ReadWriteBarrier
, udostępniają informacje kompilatorowi, co wpływa na zachowanie optymalizatora.
Niektóre funkcje wewnętrzne są dostępne tylko jako funkcje wewnętrzne, a niektóre są dostępne zarówno w implementacjach funkcji, jak i wewnętrznych. Kompilator może użyć implementacji wewnętrznej na jeden z dwóch sposobów, w zależności od tego, czy chcesz włączyć tylko określone funkcje, czy chcesz włączyć wszystkie funkcje wewnętrzne. Pierwszym sposobem jest użycie #pragma intrinsic(
funkcji wewnętrznej-function-name-list)
. Pragma może służyć do określania pojedynczego wewnętrznego lub wielu wewnętrznych rozdzielonych przecinkami. Drugim jest użycie opcji kompilatora /Oi (Generuj funkcje wewnętrzne), co sprawia, że wszystkie funkcje wewnętrzne na danej platformie są dostępne. W obszarze /Oi użyj #pragma function(
funkcji-function-name-list)
, aby wymusić użycie wywołania funkcji zamiast funkcji wewnętrznej. Jeśli dokumentacja dla określonych notatek wewnętrznych, że rutyna jest dostępna tylko jako funkcja wewnętrzna, implementacja wewnętrzna jest używana niezależnie od tego, czy /Oi lub #pragma intrinsic
jest określona. We wszystkich przypadkach /Oi lub #pragma intrinsic
zezwala, ale nie wymusza, optymalizator do korzystania z funkcji wewnętrznej. Optymalizator nadal może wywołać funkcję.
Niektóre standardowe funkcje biblioteki C/C++ są dostępne w implementacjach wewnętrznych w niektórych architekturach. Podczas wywoływania funkcji CRT implementacja wewnętrzna jest używana, jeśli /Oi jest określony w wierszu polecenia.
Dostępny jest plik <nagłówka intrin.h>, który deklaruje prototypy dla typowych funkcji wewnętrznych. Funkcje wewnętrzne specyficzne dla producenta są dostępne w plikach nagłówków <immintrin.h> i <ammintrin.h> . Ponadto niektóre nagłówki systemu Windows deklarują funkcje mapowane na funkcję wewnętrzną kompilatora.
W poniższych sekcjach wymieniono wszystkie funkcje wewnętrzne dostępne w różnych architekturach. Aby uzyskać więcej informacji na temat sposobu działania funkcji wewnętrznych na konkretnym procesorze docelowym, zapoznaj się z dokumentacją referencyjną producenta.
Zobacz też
Dokumentacja asemblera ARM
Dokumentacja asemblera makr firmy Microsoft
Słowa kluczowe
Dokumentacja biblioteki czasu wykonywania języka C