En la biblioteca estándar C, el strlen es una función de la secuencia que determina la longitud de una serie de caracteres.
optimizarán a menudo llamadas para strlen () con las discusiones de las secuencias del constante, haciendo el cálculo en de tiempo de compilación.
que ninguna optimización puede hacer para strlen () rápido para las entradas perceptiblemente grandes, tan almacenando la longitud del " " de las C-secuencias ; está generalmente el arreglo recomendado.
para (s=str; *s; s++); s-str de vuelta; }
Si hay una fuerza de octeto cero ser comprobado entendiendo cómo los números se representan en binario. Cada carácter está prendido, deja para presumir 8 pedacitos, octeto. Cierto número de octetos, deja para presumir 4, forma una palabra. Y esa palabra será el grupo que estamos comprobando para saber si hay 0 ' octetos del th.
¿Qué características este octeto tiene? Todos los pedacitos fijaron a 0. Otros tienen algunos de pedacitos fijados a 1. Éste es apenas que ninguÌn número mayor de 0 no es octeto del nul. ¿Qué queremos alcanzar? Ver si hay de octeto cero, y si no hay ninguno debemos tener misma respuesta para todas las variaciones posibles de otros octetos del non-nul. Éste es apenas que queremos una cierta manera de trazar ésos al mismo patrón o el número, que eventualmente el octeto es 0 estará roto.
Si pudiéramos trazar todos los octetos non-0 a un valor y 0 octetos al otro valor sería solucionado.
lang=c> del Y (y) la operación se utiliza para excluir el pedacito del valor 128, porque causa desbordamiento numérico. Y este valor por lo tanto no se maneja hasta ahora. Pero puesto que excluimos este valor necesitamos hacer algo sobre él. Lo agregamos simplemente, porque es apenas otro valor que tiene que distinguido a partir de 0 valores. Y por lo tanto tiene que ser tratado la misma manera. lang=c> del Ahora hemos hecho todos los valores que son > 0 valores de pedacito determinados 128. lang=c> del NOTA de //: que este cheque es rarley hecho en bibliotecas de C. si (PTR NULA del ==) ERROR_VALUE de vuelta; //or 0 Alineación de la manija de // aquí si no manejada de alguna manera dentro de secuencia. La secuencia de // tiene que ser alineada en límite del número entero ¡// o algunas arquitecturas pudo comportarse inesperado! NOTA de //: Esto también se requiere de modo que usted no desborde límites de // de la memoria mirando octetos más allá del final de // la C-secuencia. IP = (uint32_t *) PTR; // multi-salta (menos tiempos alrededor del lazo) mientras que (1) {comprobación para de/* el cero * uint32_t x = *ip; comprobación para de/* no-todo cero * si (((((x y 0x7f7f7f7f) + 0x7f7f7f7f7f) | ¡x) y 0x80808080)! = 0x80808080) rotura; ++ip; /* mueve adelante 4 octetos inmediatamente * } cuenta de // cuaesquiera octetos restantes para (s = (char*) IP; ¡0! = *s; ++s) /* no hacen nada *; s de vuelta - PTR; } Esto se puede encontrar en Hackmem. El strlen de la escritura en asamblea se hace sobre todo para la velocidad. La complejidad del código emitida de un recopilador es a menudo más alta que la asamblea mano-optimizada, incluso para las funciones muy cortas. Además, una llamada de función requiere la determinación de un marco apropiado de la llamada en la mayoría de las puestas en práctica; estas operaciones pueden compensar el tamaño de funciones simples como el strlen .
el size_t strlen (el *ptr del carbón de leña) { IP de uint32_t*; char* s; Asamblea
Los archivos de jefe para una biblioteca de C particular emiten a veces versiones en línea rápidas del strlen escrito en el montaje . El recopilador puede también hacer esto; o los archivos de jefe pueden llamar simplemente versiones del built-in del recopilador. Random links: INTERCAL | 1955 | Paul Ehrenberg | Dechado atlántico