Wenn __builtin_memcpy wird durch libc - memcpy
Gibt es eine version des C99/posix memcpy
Funktion im GCC: __builtin_memcpy
.
Manchmal kann es ersetzt werden durch GCC-inline-version von memcpy und in anderen Fällen ist es ersetzt durch Aufruf der libc ist memcpy. E. g. es wurde festgestellt hier:
Schließlich auf eine compiler-Hinweis, __builtin_memcpy zurückgreifen können, um das aussenden eines memcpy-Funktion aufrufen.
Was ist die Logik in dieser Auswahl? Ist es logisch, dass die gleiche in anderen gcc-kompatiblen Compiler, wie clang/llvm, intel c++ compiler, PCC, suncc (oracle-studio)?
Wann sollte ich lieber mit __builtin_memcpy, der über der Ebene memcpy?
Es scheint, dass es verwendet einen inline-version, wenn die Größe ist eine compile-Zeit-Konstante, und es ist weniger als oder gleich 8192.
InformationsquelleAutor osgx | 2012-07-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hatte ich experimentiert mit den eingebauten Ersatz einige Zeit her und ich fand heraus, dass die
<string.h>
Funktionen werden nur ersetzt, wenn die Größe der Quell-argument kann zur Kompilierzeit bekannt ist. In dem Fall der Aufruflibc
ist direkt ersetzt durch abgerollt code.Es sei denn, Sie kompilieren mit
-fno-builtins
,-ansi
,-std=c89
oder etwas ähnliches, ist es eigentlich egal, ob Sie verwenden die__builtin_
Präfix oder nicht.Obwohl es schwer zu Folgen, den code, der deciedes, ob die Strahlen ein library-call oder ein Stück code zu sein scheint hier.
gcc
version 4.6 mit-O3
und-fomit-frame-pointer
. Vor der Beantwortung habe ich getestet mit 4.7 so gut.Ist Ergebnis -O0 das gleiche?
Sorry, mein Fehler. Die Funktionen ersetzt, die von der ersten Optimierungsstufe (
-O1
oder einfach-O
).InformationsquelleAutor C2H5OH