2009-02-11 11 views
5

Ho un buffer char * e sono interessato a osservare il primo byte nel buffer char *, qual è il modo migliore per farlo.Ottenere il primo byte in un buffer char *

EDIT: Sulla base dei voti negativi, potrei voler spiegare perché questa domanda, sono a conoscenza dei metodi ma nel codice base che stavo cercando per ottenere le persone del primo byte fanno tutti i tipi di cose pazze come fare una copia del buffer, copialo su uno stream e poi esegui un get.

+0

se per ottimale intendi "più veloce", usa la risposta di Johannes o di Josh. il micro-ottimizzazione è stupido. risposta –

+0

Johannes' è ottimale in ogni caso - si compila ad un singolo carico op indicizzata. – Crashworks

+0

Non ho visto un compilatore che tratti il ​​buffer [0] diversamente dal * buffer dai giorni di pcc. –

risposta

18

Basta usare

char firstByte = buffer[0]; 
+1

Ma è ottimale? Questo costa un intero ciclo! ;) – Crashworks

+0

Potrebbe essere di più se il buffer è stato messo fuori servizio - potrebbero essere centinaia di cicli. Giusto per essere sicuro, dovresti probabilmente bloccare quella memoria nella RAM in modo che non avvenga alcuna impaginazione. – Eclipse

+0

È possibile garantire che la memoria non venga scaricata? – Albert

0
char* c_ptr; 
char first_char; 

first_char = c_ptr[0]; 
13

O questo:

char firstByte = *buffer; 

Per chiarimenti, non c'è alcuna differenza tra *buffer e buffer[0], dal momento che quest'ultima è in realtà solo una scorciatoia per *(buffer + 0*sizeof(char)), e qualsiasi compilatore sarà abbastanza intelligente da sostituirlo con *(buffer+0) e poi con *buffer. Quindi la scelta è davvero quella che è più chiara nel contesto in cui la stai usando, non quanto sia efficiente ognuno di essi.

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'}; 

e per ottenere il primo 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'} ha sei elementi. – Chuck

+0

Eheh, sì, idiota errore. –

+0

C'è abbastanza la differenza tra char * buffer = "hello"; e char buffer [] = "ciao"; – Eclipse

2

Se siete determinati a micro-ottimizzare, si dovrebbe sapere che ogni compilatore fatto in questo millennio dovrebbe produrre esattamente lo stesso codice macchina per "c = * tampone" e "c = buffer [0]".

+0

Anche il mio compilatore di progetto di classe toy può fare questa ottimizzazione;) – Eclipse

+0

Poiché il buffer [0] è definito come * (buffer + 0 * sizeof (char)), non è un'ottimizzazione difficile. È una trasformazione dritta, seguita da un piccolo calcolo preliminare. Sarei scioccato da un compilatore pubblicamente disponibile che ha mancato questo. –

0

Buono per le piattaforme x86 ...

char firstByte; 

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

Proprio come un chiarimento di ciò che molte persone hanno detto - che:

buffer[0] 

equivale a

*(buffer + 0*sizeof(char)) 

Ecco non è tecnicamente vero se si presuppone che sia un codice C letterale (cioè non un codice pseudo), sebbene sia questo il compilatore sta facendo per te.

A causa di aritmetica dei puntatori, quando si aggiunge un intero a un puntatore, esso si moltiplica automaticamente dal sizeof(*pointer), in modo che in realtà dovrebbe essere:

*(buffer + 0) 

Anche se, dal momento che sizeof(char) è definito come 1, è effettivamente equivalente in questo caso.

Problemi correlati