Hi, in einem anderen Thread habe ich einen Hinweis auf "__builtin_ctz (x);" gefunden. Ich hätte das schon öfters brauchen können ... Wo finde ich denn solche Sachen in der Doku ? Ich kenne zwar die libc-Doku aber da stehen ja nur die libc-Sachen drin ... Wo gibts eine Liste/ÜBersicht o.ä. ??? Gruß Andreas
Na in der GCC Doku? http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html War doch tatsächlich der allererste Treffer bei Google. ;-) Ob man diese Sachen unbedingt verwenden sollte, ist die andere Frage - es ist eben kein Standard-C.
Mark Brandis schrieb: > Ob man diese Sachen unbedingt verwenden sollte, ist die andere Frage - > es ist eben kein Standard-C. Ja und? Man kann doch trotzdem von einer effizienten Implementierung profitieren:
1 | #if defined (__GNUC__) && !defined (__STRICT_ANSI__)
|
2 | #define ctz(x) __builtin_ctz(x)
|
3 | #else
|
4 | static inline int ctz (int x) |
5 | {
|
6 | // ...
|
7 | }
|
8 | #endif
|
Wenn Effizienz so aussieht: >Built-in Function: int __builtin_ctz (unsigned int x) > >Returns the number of trailing 0-bits in x, starting at the least >significant bit position. If x is 0, the result is undefined. dann programmier ich's doch lieber gleich selbst. Ist einmal Arbeit und kann danach beliebig oft wiederverwendet werden.
>Wenn Effizienz so aussieht: >>Built-in Function: int __builtin_ctz (unsigned int x) >> >>Returns the number of trailing 0-bits in x, starting at the least >>significant bit position. If x is 0, the result is undefined. >dann programmier ich's doch lieber gleich selbst. Ist einmal Arbeit und >kann danach beliebig oft wiederverwendet werden. Woraus erkennst Du da, das es ineffizient ist? Oder was soll "Wenn Effizienz so aussieht" heissen?
Dass x zur Laufzeit auch mal 0 sein kann, davon sollte man eigentlich ausgehen. Ich mag eben kein "undefined behaviour".
Johann L. schrieb: > Mark Brandis schrieb: > >> Ob man diese Sachen unbedingt verwenden sollte, ist die andere Frage - >> es ist eben kein Standard-C. > > Ja und? Man kann doch trotzdem von einer effizienten Implementierung > profitieren: >
1 | > #if defined (__GNUC__) && !defined (__STRICT_ANSI__) |
2 | > #define ctz(x) __builtin_ctz(x) |
3 | > #else |
4 | > static inline int ctz (int x) |
5 | > { |
6 | > // ... |
7 | > } |
8 | > #endif |
9 | >
|
Jep, genau solche Wrapper verwende ich auch sehr gerne, wenn es darum geht Code, der nicht C-Standard kompatibel ist kompatibel zu machen. Wenn man portiert, muss man sich halt darum kümmern. Statt der static inline funktion könnte man auch einfach ein #error Not compiled with GCC nehmen ;) ;) (Höhö!)
Mark Brandis schrieb: > Dass x zur Laufzeit auch mal 0 sein kann, davon sollte man eigentlich > ausgehen. Ich mag eben kein "undefined behaviour". Ist doch eine Frage, wofür man es verwenden will. Wenn du mit x = 0 rechnen können musst, dann kannst du immer noch sowas machen:
1 | #define ctz(x) ((x) == 0? 32: __builtin_ctz(x))
|
@ Mark Brandis Ach so.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.