¿Qué son intrínsecos?


¿Puede alguien explicar qué son y por qué los necesitaría? ¿Qué tipo de aplicaciones estoy construyendo si necesito usar intrínsecos?

Author: plasmacel, 2010-02-15

4 answers

Normalmente, "intrínsecos" se refiere a las funciones que están incorporadas i es decir, la mayoría de las funciones de biblioteca estándar que el compilador puede/generará en línea en lugar de llamar a una función real en la biblioteca. Por ejemplo, una llamada como: memset(array1, 10, 0) podría compilarse para un x86 como algo como:

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

Intrínsecos como este son puramente una optimización. Lo más probable es que la "necesidad" de intrínsecos sea una situación en la que el compilador soporte intrínsecos que le permiten generar código que el compilador no puede (o generalmente no) generar directamente. Para un ejemplo obvio, bastantes compiladores para x86 tienen " Intrínsecos MMX "que le permiten usar" funciones " que en realidad son solo representaciones directas de instrucciones 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-15 20:06:20

Una función intrínseca es una función que el compilador implementa directamente cuando es posible, en lugar de vincularse a una implementación de la función provista por una biblioteca.

Un ejemplo común es strncpy().

Para cadenas cortas, hacer una llamada a función a strncpy(), que implica configurar un 'marco de pila' con una dirección de retorno, consumirá más tiempo que la copia real de bytes. Peor aún, el efecto en los búferes de recuperación previa de la CPU detendrá la ejecución de la CPU durante varios relojes ciclo.

En su lugar, la función intrínseca es implementada por el compilador en lugar de una llamada a la función. En el ejemplo de strncpy(), el código de copia de bytes se emite directamente en el lugar donde se invoca strncpy().

Similar a este ejemplo de strncpy(), cada función intrínseca se implementa directamente como código en línea si se cumplen las restricciones requeridas.

Una copia no intrínseca de la función intrínseca generalmente todavía existe en la biblioteca estándar, en caso de que la dirección de la función sea necesario.

En comparación con las funciones en línea, la función intrínseca es proporcionada por el compilador. No hay un lugar en el código fuente de un programa C donde se escriba la función intrínseca, ni hay una implementación de biblioteca a la que se deba vincular. Una función inline es diferente en que el compilador lee el código fuente para la función inline, pero es similar en que más tarde puede emitir una traducción compilada de la función inline directamente en el código objeto, omitiendo la sobrecarga de una llamada a una función.

En resumen, la diferencia práctica entre una función intrínseca y una función en línea es que las funciones intrínsecas están "presentes" incluso si no tiene #include el archivo de encabezado necesario que contiene la declaración de la función. Para una función en línea, el archivo de encabezado con la declaración de función debe ser #include'd (o declarado de otra manera) primero.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-15 22:28:18

Los intrínsecos son expuestos por el compilador como funciones que no forman parte de ninguna biblioteca, per se.

Los que probablemente usaría más son assembly intrinsics que son tratados por el compilador como precisamente la instrucción de máquina que representan. Los usaría, por ejemplo, en código donde necesita aprovechar una instrucción de CPU específica que el compilador no genera automáticamente, y donde no necesita necesariamente un ensamblaje en línea completo apartado.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-15 20:06:00

"Intrínsecos" son aquellas características de un lenguaje que un compilador reconoce e implementa sin necesidad de que el programa las declare. El compilador puede-o no-enlazar a una biblioteca de tiempo de ejecución para realizar la operación. En C++, por ejemplo, la operación de copia de estructura es implícita:

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

...
s = t;   // this statement copies hundreds of bytes, likely with a rtl call

Otros ejemplos incluyen lenguajes como Fortran donde hay soporte implícito para el tipo complejo, y el trascendental (seno, tangente, etc.) las funciones no necesitan-y no pueden-ser declaradas. PHP, Javascript, Ruby, etc. tiene cientos de funciones intrínsecas como crear y buscar arrays, realizar coincidencias de expresiones regulares, etc., sucesivamente.

En cuanto a sus otras preguntas, la única diferencia es si necesitan ser declaradas. Por ejemplo, un programa C++ que utilice funciones trascendentales debe incluir declaraciones de bibliotecas matemáticas:

#include <math.h>

No hay un patrón particular de aplicaciones que dependan de intrínsecos; eso es solo una cuestión de importancia para los escritores del compilador y programador.

 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/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-15 20:29:27