2009-02-11 10 views
5

Tengo un búfer char * y estoy interesado en buscar el primer byte en el búfer char *, ¿cuál es la forma más óptima de hacerlo?Obtener el primer byte en un búfer char *

EDIT: con base en los votos negativos Me gustaría explicar por qué esta pregunta, estoy al tanto de los métodos, pero en la base de código que he estado buscando obtener gente de primer byte hacer todo tipo de cosas locas como hacer una copia del búfer, cópielo en una secuencia y luego haga un get.

+0

si por óptimo quiere decir "más rápido", solo use la respuesta de Johannes o Josh. la micro-optimización es estúpida. –

+0

La respuesta de Johannes es óptima de todos modos, se compila en una sola operación de carga indexada. – Crashworks

+0

No he visto un compilador que trate el búfer [0] de forma diferente al * búfer desde los días del pcc. –

Respuesta

18

sólo tiene que utilizar

char firstByte = buffer[0]; 
+1

¿Pero es óptimo? ¡Eso cuesta todo un ciclo! ;) – Crashworks

+0

Podría ser más si el búfer ha sido paginado, eso podría ser cientos de ciclos. Solo para estar seguro, probablemente debería bloquear esa memoria en la memoria RAM para que no ocurra ninguna búsqueda. – Eclipse

+0

¿Es posible asegurar que parte de la memoria no se propague? – Albert

0
char* c_ptr; 
char first_char; 

first_char = c_ptr[0]; 
13

O esto:

char firstByte = *buffer; 

Para mayor claridad, no hay diferencia entre *buffer y buffer[0], ya que este último es en realidad la abreviatura de *(buffer + 0*sizeof(char)) y cualquier compilador va a ser lo suficientemente inteligente como para reemplazarlo con *(buffer+0) y luego *buffer. Entonces, la elección es realmente lo que sea más claro en el contexto en que lo está usando, no cuán eficiente es cada uno.

1
char first = someCharPtr[0]; 

o

char first = *someCharPtr; 
5
char *buffer = {'h','e','l','l','o','\0'}; 

o:

char *buffer = "hello"; 

o:

char buffer[6] = {'h','e','l','l','o','\0'}; 

y para obtener el primer byte:

char firstChar = buffer[0]; 

o:

char firstChar = *buffer; // since the buffer pointer points to the first element in the array 
+0

{'h', 'e', ​​'l', 'l', 'o', '\ 0'} tiene seis elementos. – Chuck

+0

Eh, sí, idiota typo. –

+0

Existe una gran diferencia entre char * buffer = "hello"; y char buffer [] = "hello"; – Eclipse

2

Si usted está decidido a micro-optimización, usted debe saber que cada compilador de hecho en este milenio debe producir exactamente el mismo código de máquina para "c = x tampón" y "c = buffer [0]".

+0

Incluso mi compilador de proyectos de clase de juguetes puede hacer esta optimización;) – Eclipse

+0

Dado que el buffer [0] se define como * (buffer + 0 * sizeof (char)), no es una optimización difícil. Es una transformación directa, seguida de un pequeño precalculo. Me sorprendería un compilador disponible públicamente que se perdió esta. –

0

Bueno para plataformas x86 ...

char firstByte; 

__asm { 
    mov al, [buffer] 
    mov [firstByte], al 
} 
1

Así como una aclaración de lo que varias personas han mencionado - que:

buffer[0] 

es equivalente a

*(buffer + 0*sizeof(char)) 

Eso es no es técnicamente cierto si se supone que es un código C literal (es decir, no un pseudo código), aunque eso es lo que el compilador está haciendo por ti.

Debido a la aritmética de punteros, cuando se agrega un número entero a un puntero, que se multiplica automáticamente por sizeof(*pointer), por lo que realmente debe ser:

*(buffer + 0) 

Aunque, desde sizeof(char) se define como 1, es realmente equivalente en este caso.

Cuestiones relacionadas