C: Vergleich mit NULL
Religiöse Argumente beiseite:
-
Option1:
if (pointer[i] == NULL) ...
-
Option2:
if (!pointer[i]) ...
In C option1 funktionell äquivalent zu option2?
Tut, die später aufgelöst werden schneller durch die Abwesenheit von ein Vergleich ?
InformationsquelleAutor der Frage Andrew Turner | 2009-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich mag die zweite, andere Leute wie das erste.
Eigentlich bevorzuge ich eine Dritte Art der ersten:
Weil ich dann:
Funktional sind Sie gleichwertig.
Selbst wenn ein
NULL
Zeiger ist nicht "0" (alle null-bits),if (!ptr)
vergleicht mit derNULL
Zeiger.Das folgende ist falsch. Es ist immer noch hier, weil es viele Kommentare, die sich auf ihn:
Vergleichen Sie nicht einen Zeiger mit dem literal null, jedoch. Es funktioniert fast überall, aber ist undefiniert Verhalten, wenn ich mich Recht erinnere.
InformationsquelleAutor der Antwort Thomas
Ich bevorzuge die explizite Stil (erste version). Es macht es offensichtlich, dass es ist ein Zeiger und nicht eine Zahl oder etwas anderes, aber es ist nur eine Frage des Stils.
Aus performance-Sicht sollte es keinen Unterschied machen.
InformationsquelleAutor der Antwort Laserallan
Entspricht. So steht es in der Sprache standard. Und die Menschen haben die damndest religiösen Vorlieben!
InformationsquelleAutor der Antwort Norman Ramsey
Ist es oft nützlich, davon ausgehen, dass die compiler-Autoren wenigstens ein minimum an Intelligenz. Dem compiler ist nicht geschrieben von concussed Entenküken. Es ist geschrieben von Menschen, mit Jahre Programmier-Erfahrung, und Jahren studierte compiler-Theorie. Dies bedeutet nicht, dass dein compiler ist perfekt, und weiß immer am besten, aber es hat bedeuten, dass es durchaus in der Lage Umgang mit trivialen automatischen Optimierungen.
Wenn die beiden Formen äquivalent sind, dann warum würde der compiler nur übersetzen in die andere, um sicherzustellen, beide sind gleich effizient?
Wenn
if (pointer[i] == NULL)
war langsamer alsif (!pointer[i])
nicht am compiler ändern Sie einfach es in die zweite, effizientere form?Also kein, vorausgesetzt, Sie sind gleichwertig, Sie sind gleichermaßen effizient.
Als für den ersten Teil der Frage, ja, Sie sind gleichwertig. Die Sprache, standard ist eigentlich festgelegt, ist dies explizit irgendwo -- ein pointer wird zu true ausgewertet, wenn es nicht NULL ist, und false, wenn es NULL ist, also die zwei, die genau gleich sind.
InformationsquelleAutor der Antwort jalf
Fast sicherlich keinen Unterschied in der Leistung. Ich bevorzuge die impliziten Stil des zweiten, aber.
InformationsquelleAutor der Antwort Barry Kelly
NULL
erklärt werden sollte in einem der standard-header-Dateien als solche:So oder So, Sie vergleichen gegen null, und der compiler optimieren sollten beide auf die gleiche Weise. Jeder Prozessor hat einige "Optimierung" oder opcode für den Vergleich mit null.
InformationsquelleAutor der Antwort Mark Rushakoff
Frühe Optimierung ist schlecht. Mikro-Optimierung ist auch schlecht, es sei denn, Sie versuchen, squeeze jeden letzten bit der Hz von der CPU, es ist kein Punkt, es zu tun. Als Menschen, die bereits gezeigt haben, kann der compiler optimieren, die die meisten von Ihre-code entfernt sowieso.
Sein bestes, um Ihren code so prägnant und lesbar wie möglich. Wenn dies mehr lesbar
als diese
dann verwenden Sie es. Solange jeder, der Lesen dein code stimmt.
Ich persönlich verwende die vollständig den vorgegebenen Wert (NULL==ptr), so ist es klar, was ich bin für die überprüfung. Könnte sein, mehr zu geben, aber ich kann einfach Lesen. Ich denke, die !ptr wäre leicht zu übersehen ! wenn das Lesen zu schnell.
InformationsquelleAutor der Antwort shimpossible
Es hängt wirklich davon ab, den compiler. Ich wäre überrascht, wenn die meisten modernen C-Compiler nicht generiert nahezu identischen code für den spezifischen Szenario, das Sie beschreiben.
Holen Sie sich Ihr compiler generiert eine assembly, auflisten für jedes dieser Szenarien und Sie können Ihre eigene Frage zu beantworten (für Ihre speziellen compiler :)).
Und selbst wenn Sie sind andere, den Unterschied in der Leistung wird wahrscheinlich irrelevant sein, in praktischen Anwendungen.
InformationsquelleAutor der Antwort
Schalten compiler-Optimierung und Sie sind im Grunde die gleichen
getestet, die auf gcc 4.3.3
vs
produziert keine Ausgabe 🙂
InformationsquelleAutor der Antwort Charles Ma
Ich habe eine assembly dump, und fand den Unterschied zwischen den beiden Versionen:
@@ -11,8 +11,7 @@
pushl %ecx
subl $20, %esp
movzbl -9(%ebp), %eax
- movsbl %al,%eax
- testl %eax, %eax
+ testb %al, %al
Sieht es aus wie letzteres tatsächlich erzeugt einen Befehl, und die erste erzeugt zwei, aber das ist ziemlich unwissenschaftlich.
Dies ist gcc (ohne Optimierungen:
test1.c:
test2.c: Ändern
pointer[0] == NULL
zu!pointer[0]
gcc -s test1.c gcc -s test2.c, diff -u test1.s test2.s
InformationsquelleAutor der Antwort ctennis
Vorsicht, gcc haben sollte, stieß eine Warnung, wenn das nicht der Fall, kompilieren Sie mit
-Wall
Flagge aufSollten Sie jedoch immer kompilieren zu optimierten gcc-code.
BTW, vor Ihren Variablen mit volatile-Schlüsselwort, um zu vermeiden, gcc aus, ihn zu ignorieren...
Immer erwähnen in Ihrem compiler-build-version 🙂
InformationsquelleAutor der Antwort ZeroCool