Czym są wewnętrzne cechy?

Czy ktoś może wyjaśnić czym one są i dlaczego miałbym ich potrzebować? Jakie aplikacje buduję, jeśli muszę używać iskrobezpiecznych?

Author: plasmacel, 2010-02-15

4 answers

Normalnie, "intrinsics" odnosi się do funkcji, które są wbudowane -- tj. większość standardowych funkcji bibliotecznych, które kompilator może/będzie generować inline zamiast wywoływać faktyczną funkcję w bibliotece. Na przykład, wywołanie typu: memset(array1, 10, 0) może być skompilowane dla x86 jako coś w rodzaju:

 mov ecx, 10
 xor eax, eax
 mov edi, offset FLAT:array1
 rep stosb

Takie wewnętrzne elementy są wyłącznie optymalizacją. "Potrzebujące" iskierki to najprawdopodobniej sytuacja, w której kompilator obsługuje iskierki, które pozwalają generować kod, którego kompilator nie może (lub zazwyczaj nie będzie) generować bezpośrednio. Dla oczywistego przykładu, sporo kompilatorów dla x86 ma "MMX Intrinsics", które pozwalają używać" funkcji", które są tak naprawdę tylko bezpośrednimi reprezentacjami instrukcji MMX.

 30
Author: Jerry Coffin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-15 20:06:20

Funkcja wewnętrzna jest funkcją, którą kompilator implementuje bezpośrednio, gdy jest to możliwe, zamiast linkować do implementacji funkcji dostarczonej przez Bibliotekę.

Częstym przykładem jest strncpy().

W przypadku krótkich łańcuchów wywołanie funkcji do strncpy(), które wymaga ustawienia 'ramki stosu' z adresem zwrotnym, zajmie więcej czasu niż rzeczywiste kopiowanie bajtów. Co gorsza, wpływ na bufory wstępnego pobierania procesora zatrzyma wykonanie procesora na kilka zegarów cykle.

Zamiast wywołania funkcji wbudowana funkcja jest implementowana przez kompilator. W przykładzie strncpy() kod kopiujący bajty jest emitowany bezpośrednio w miejscu wywołania strncpy().

Podobnie jak w tym przykładzie strncpy(), każda wewnętrzna funkcja jest zaimplementowana bezpośrednio jako kod w linii, jeśli spełnione są wymagane ograniczenia.

Nieodłączna Kopia funkcji wewnętrznej zwykle nadal istnieje w bibliotece standardowej, w przypadku gdy adres funkcji jest potrzebne.

W porównaniu do funkcji inline, funkcja wewnętrzna jest dostarczana przez kompilator. Nie ma miejsca w kodzie źródłowym programu C, w którym pisana jest wewnętrzna funkcja, ani nie ma implementacji bibliotecznej, z którą musi być powiązana. Funkcja inline różni się tym, że kompilator odczytuje kod źródłowy funkcji inline, ale jest podobny w tym, że później może emitować skompilowane tłumaczenie funkcji inline bezpośrednio do kodu obiektowego, pomijając narzut wywołania funkcji.

Krótko mówiąc, praktyczna różnica między funkcją wewnętrzną a funkcją inline polega na tym, że funkcje wewnętrzne są "obecne", nawet jeśli nie masz #include wymaganego pliku nagłówkowego zawierającego deklarację funkcji. Dla funkcji inline, plik nagłówkowy z deklaracją funkcji musi być #include'd (lub w inny sposób zadeklarowany) jako pierwszy.

 43
Author: Heath Hunnicutt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-15 22:28:18

Intrinsics są ujawniane przez kompilator jako funkcje, które nie są częścią żadnej biblioteki, per se .

Te, których prawdopodobnie używasz najczęściej to ASSEMBLY intrinsics, które są traktowane przez kompilator jako dokładnie instrukcje maszynowe, które reprezentują. Używasz ich na przykład w kodzie, gdzie musisz skorzystać z określonej instrukcji procesora, której kompilator nie generuje automatycznie, i gdzie niekoniecznie potrzebujesz pełnego zestawu wbudowanego sekcja.

 5
Author: greyfade,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-15 20:06:00

"wewnętrzne" to te cechy języka, które kompilator rozpoznaje i implementuje bez potrzeby ich deklarowania przez program. Kompilator może-lub nie-połączyć się z biblioteką uruchomieniową w celu wykonania operacji. Na przykład w C++ operacja kopiowania struktury jest niejawna:

struct {
    int  a;
    char b [100];
    long c [27];
} s, t;

...
s = t;   // this statement copies hundreds of bytes, likely with a rtl call
Inne przykłady obejmują języki takie jak Fortran, w których istnieje ukryte wsparcie dla typu złożonego, oraz transcendentalne (sinus, tangent, itp.) funkcji nie trzeba-i nie można-deklarować. PHP, Javascript, Ruby itp. posiada setki funkcji wewnętrznych, takich jak tworzenie i wyszukiwanie tablic, wykonywanie dopasowań wyrażeń regularnych itp., itd.

Jeśli chodzi o inne pytania, jedyną różnicą jest to, czy trzeba je zadeklarować. Na przykład, program C++ wykorzystujący funkcje transcendentalne musi zawierać deklaracje biblioteki matematycznej:

#include <math.h>

Nie ma konkretnego wzorca aplikacji, które zależą od wewnętrznych; jest to tylko kwestia znaczenia dla twórców kompilatorów i programistów.

 3
Author: wallyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-15 20:29:27