2009-02-11 3 views
5

Ich habe einen char * -Puffer und ich bin daran interessiert, das erste Byte im char * -Puffer zu betrachten, was der optimale Weg ist.Das erste Byte in einem char * -Puffer holen

EDIT: Basierend auf den negativen Stimmen möchte ich erklären, warum diese Frage, ich bin mir der Methoden bewusst, aber in der Code-Basis, die ich gesucht habe erste Byte Menschen alle Arten von verrückten Dinge wie eine Kopie tun des Puffers, kopiere es in einen Stream und mache dann einen get.

+0

Wenn Sie mit Optimal "Schnellster" meinen, verwenden Sie entweder die Antwort von Johannes oder Josh. Mikrooptimierung ist dumm. –

+0

Johannes Antwort ist sowieso optimal - es kompiliert zu einer einzigen indizierten Last op. – Crashworks

+0

Ich habe keinen Compiler gesehen, der Puffer [0] anders behandelt als * Puffer seit den Tagen von pcc. –

Antwort

18

Verwenden Sie einfach

char firstByte = buffer[0]; 
+1

Aber ist es optimal? Das kostet einen ganzen Zyklus! ;) – Crashworks

+0

Es könnte mehr sein, wenn der Puffer ausgelagert wurde - das könnten Hunderte von Zyklen sein. Nur um sicher zu sein, sollten Sie diesen Speicher wahrscheinlich in RAM sperren, so dass kein Paging stattfinden wird. – Eclipse

+0

Es ist möglich, sicherzustellen, dass einige Speicher nicht ausgelagert werden? – Albert

0
char* c_ptr; 
char first_char; 

first_char = c_ptr[0]; 
13

Oder diese:

char firstByte = *buffer; 

Zur Klarstellung gibt es keinen Unterschied zwischen *buffer und buffer[0], da diese wirklich für *(buffer + 0*sizeof(char)) nur eine Abkürzung ist, und jeder Compiler wird schlau genug sein, das durch *(buffer+0) und dann *buffer zu ersetzen. Also ist die Wahl wirklich diejenige, die am deutlichsten in dem Kontext ist, in dem Sie es verwenden, nicht wie effizient jeder einzelne ist.

1
char first = someCharPtr[0]; 

oder

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

oder:

char *buffer = "hello"; 

oder:

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

und das erste Byte zu erhalten:

char firstChar = buffer[0]; 

oder:

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

{'h', 'e', ​​'l', 'l', 'o', '\ 0'} hat sechs Elemente. – Chuck

+0

Eheh, Yep, Idiot Tippfehler. –

+0

Es gibt ziemlich den Unterschied zwischen char * buffer = "Hallo"; und Zeichenpuffer [] = "Hallo"; – Eclipse

2

Wenn Sie Mikro-optimize bestimmt sind, sollten Sie wissen, dass jeder Compiler in diesem Jahrtausend genau für den gleichen Maschinencode erzeugen sollte "c = * buffer" und "c = Puffer [0]".

+0

Sogar mein Spielzeug Klassen-Projekt Compiler kann diese Optimierung tun;) – Eclipse

+0

Da Puffer [0] als * (Puffer + 0 * sizeof (char)) definiert ist, ist es keine schwierige Optimierung. Es ist eine direkte Transformation, gefolgt von einer kleinen Vorausberechnung. Ich wäre schockiert über einen öffentlich verfügbaren Compiler, der diesen verpasst hat. –

0

Geeignet für x86-Plattformen ...

char firstByte; 

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

So wie eine Klärung dessen, was einige Leute erwähnt haben - dass:

buffer[0] 

entspricht

*(buffer + 0*sizeof(char)) 

ist That technisch nicht wahr, wenn man annimmt, dass es sich um literalen C-Code handelt (also nicht um Pseudocode), obwohl das der Compiler ist tut für dich.

Wegen der Pointer-Arithmetik, wenn Sie eine ganze Zahl auf einen Zeiger hinzufügen, wird sie automatisch von sizeof(*pointer) multipliziert, so dass es wirklich sein soll:

*(buffer + 0) 

Obwohl, da sizeof(char) 1 definiert ist zu sein, es ist in diesem Fall tatsächlich gleichwertig.

Verwandte Themen