2009-02-11 11 views
5

Mam char * bufor i jestem zainteresowany patrząc na pierwszy bajt w char * bufor, co jest najbardziej optymalny sposób, aby przejść na ten temat.Pierwsze pierwszy bajt w char * bufor

EDYCJA: Na podstawie głosów negatywnych mogę chcieć wyjaśnić, dlaczego to pytanie, jestem świadomy metod, ale w bazie kodu, że szukałem, aby ludzie z pierwszego bajtu robili różne rodzaje zwariowanych rzeczy, takich jak zrobić kopię bufora, skopiuj go do strumienia, a następnie wykonaj get.

+0

jeśli przez optymalny masz na myśli "najszybszy", po prostu użyj odpowiedzi Johannesa lub Josha. mikrooptymalizacja jest głupia. –

+0

Odpowiedź Johannesa jest optymalna - kompiluje się do pojedynczego obciążenia indeksowanego. – Crashworks

+0

Nie widziałem kompilatora, który traktuje bufor [0] inaczej niż bufor * od czasów pcc. –

Odpowiedz

18

Wystarczy użyć

char firstByte = buffer[0]; 
+1

Ale czy jest to optymalne? To kosztuje cały cykl! ;) – Crashworks

+0

Może być więcej, jeśli bufor został stronicowany - może to być setki cykli. Dla pewności, prawdopodobnie powinieneś zablokować tę pamięć w pamięci RAM, więc nie będzie stronicowania. – Eclipse

+0

Czy można upewnić się, że niektóre pamięci nie są stronicowane? – Albert

0
char* c_ptr; 
char first_char; 

first_char = c_ptr[0]; 
13

albo to:

char firstByte = *buffer; 

Dla wyjaśnienia, nie ma różnicy między *buffer i buffer[0], ponieważ ten ostatni jest naprawdę tylko skrótem *(buffer + 0*sizeof(char)), a każdy kompilator będzie na tyle sprytny, aby zastąpić go *(buffer+0), a następnie *buffer. Tak więc wybór jest naprawdę oczywisty w kontekście, w którym go używasz, a nie jak efektywny jest każdy z nich.

1
char first = someCharPtr[0]; 

lub

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

czyli

char *buffer = "hello"; 

czyli

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

i zdobyć pierwszy bajt:

char firstChar = buffer[0]; 

czyli

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

{'h', 'e', ​​'l', 'l', 'o', '\ 0'} ma sześć elementów. – Chuck

+0

Eh, tak, głupek. –

+0

Istnieje dość różnica między char * buffer = "hello"; i char buffer [] = "cześć"; – Eclipse

2

Jeśli jesteś zdecydowany mikro optymalizacji należy wiedzieć, że każdy kompilator wykonane w tym tysiącleciu powinna produkować dokładnie ten sam kod maszynowy dla „c = * bufor” oraz "c = buffer [0]".

+0

Nawet mój kompilator klasy projektów zabawek może wykonać tę optymalizację;) – Eclipse

+0

Ponieważ bufor [0] jest zdefiniowany jako * (bufor + 0 * sizeof (znak)), nie jest to trudna optymalizacja. Jest to prosta transformacja, po której następuje małe wstępne obliczenie. Byłbym zszokowany publicznie dostępnym kompilatorem, który tęsknił za tym. –

0

Dobry dla platform x86 ...

char firstByte; 

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

Podobnie jak wyjaśnienia co kilka osób wspomniało - że:

buffer[0] 

jest równoważna

*(buffer + 0*sizeof(char)) 

to nie jest to prawdą techniczną, jeśli założymy, że jest to dosłowny kod C (tj. nie jest to pseudo kod), chociaż to jest to, co kompilator robi dla ciebie.

Ponieważ wskaźnik arytmetyki, gdy dodasz liczbę całkowitą do wskaźnika, jest on automatycznie mnożone przez sizeof(*pointer), więc powinno być naprawdę:

*(buffer + 0) 

Chociaż od sizeof(char) określa się 1, to jest faktycznie równoważne w tym przypadku.