Ce este intrinsiki (intrisecile) overflow stivă în limba rusă

Aici este un exemplu de VC ++.

Compile-dezactivat de optimizare (/ Od). Dacă există #pragma intrinsecă (strlen) get

Iar în lipsa -

(Pentru informații - care să permită optimizarea aceeași în ambele cazuri -

Ie Într-un anumit sens, este în linie cu funcție doar cu un cod de asamblare de pre-preparate.

In C / C ++ orice entitate declarată, dar nu este definită în fișierul sursă este considerată a fi străină. Acest lucru se aplică și în funcții nu mai puțin de o variabilă. Link-uri către funcțiile externe sunt compilate în fișiere obiect și vor fi înlocuite cu apeluri la aceste entități numai în cazul în care legătura între toate dependențele inter-module sunt îndeplinite. Nu există nici o diferență între PrivetVasya () și printf () - în ceea ce privește atât compilatorului se ridică complet la aproximativ două și vă pot spune „da, este doar unele funcții externe.“ În cazul în care manualele prost sau educat jumătate profesori încep să vorbească „built-in funcția printf limba ()» (și acest lucru este un foarte popular iluzii) - trebuie să înțeleagă că acest lucru este pur și simplu un nonsens, că, în limba de nimic nu este construit, compilatorul se ocupă de apelul la printf () pe aceleași condiții ca un apel la orice altă funcție, dar cel puțin în fișierul de vânzări adiacente. În ceea ce privește aceeași printf () - acesta nu este un built-in limba și funcția de biblioteca standard. Standard pentru această funcție descrie limba, își anunță prezența în biblioteca standard, dar compilatorul bibliotecii standard este irelevantă - poate apărea pe scenă, care leagă, sau pot să nu apară deloc.

Cu toate acestea, există un adevărat funcții încorporate. pentru care compilatorul este de fapt pus în aplicare un tratament special - acestea sunt numite intrinseci-s. Compilatoare diferite intrinseci-uri diferite set. Intrinsec-lea poate fi o funcție care ar trebui să trăiască nominal în biblioteca standard. Atunci când apelați-intrinseci funcții compilator generează un cod special care este tipic pentru această funcție: nu generează nici un apel și nu va fi nici un apel reală și retur, și va avea mai multe instrucțiuni care execută sarcina dorită. De exemplu, o memcpy intrinsecă foarte frecvente () este compilat nu pentru a apela orice funcție, și instrucțiuni MOVs repnz (de exemplu, pentru x86).

Este clar că în biblioteca standard C (libc) pentru AVR există câteva caracteristici care oferă întârziere. Desigur, aceasta este o caracteristici cu drepturi depline, care în interiorul ciclului de răsucire. Dacă aveți nevoie de o întârziere de 1-2 cicluri, apoi în mod natural o astfel de funcție grele nu este potrivit. Pentru a face o întârziere a ciclului 1 de ceas complet (și comun) nu poate funcționa chiar dacă este complet instrucțiune gol funcția de apel este executat pentru 4 ceasuri, iar ret instrucțiuni - 4 mai multe cicluri, un total de 8 cicluri pe un apel de funcție goală.

Fără nici un gând exces clar că întârzierea în unități de cicluri (mai puțin de 8) pot fi puse în aplicare numai intrinsec-s. Și acum, degetele încrucișate, să ne întrebăm: Există în întârziere funcția-GCC AVR (funcție de întârziere), cu condiția ca intrinsecă și? Într-adevăr, există o astfel intrinsecă - funcție numită __builtin_avr_delay_cycles ().

articole similare