Wie zu verwenden MSVC-Interna, um das äquivalent von diesem GCC-code?

Der folgende code ruft die builtin Funktionen für clz/ctz in GCC und, auf anderen Systemen, hat die C-Versionen. Natürlich, die C-Versionen sind ein wenig suboptimal, wenn das system verfügt über einen eingebauten clz/ctz Anleitung, wie x86 und ARM.

#ifdef __GNUC__
#define clz(x) __builtin_clz(x)
#define ctz(x) __builtin_ctz(x)
#else
static uint32_t ALWAYS_INLINE popcnt( uint32_t x )
{
    x -= ((x >> 1) & 0x55555555);
    x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
    x = (((x >> 4) + x) & 0x0f0f0f0f);
    x += (x >> 8);
    x += (x >> 16);
    return x & 0x0000003f;
}
static uint32_t ALWAYS_INLINE clz( uint32_t x )
{
    x |= (x >> 1);
    x |= (x >> 2);
    x |= (x >> 4);
    x |= (x >> 8);
    x |= (x >> 16);
    return 32 - popcnt(x);
}
static uint32_t ALWAYS_INLINE ctz( uint32_t x )
{
    return popcnt((x & -x) - 1);
}

#endif

Welche Funktionen muss ich aufrufen, welche Header muss ich zählen, etc, fügen Sie eine richtige ifdef für MSVC hier? Hab ich schon angeschaut auf dieser Seite, aber ich bin mir nicht ganz sicher, was das #pragma ist (ist es nötig?) und welche Einschränkungen bringt es auf MSVC-version die Anforderungen für die Kompilierung. Als jemand, der nicht wirklich verwenden, MSVC, ich weiß auch nicht, ob diese Interna haben C-äquivalente auf anderen Architekturen, oder ob ich zu #ifdef x86/x86_64-auch wenn #zu definieren.

Die Seite, die Sie beziehen sich auf oben bezieht sich auf eine Funktion, ist Teil des .NET runtime sind Sie versuchen zu bauen Ihr Programm für .NETTO-oder als native ausführbare Datei unter Windows?
Es ist eine native ausführbare Datei für Windows-Teil der Grund, warum ich Frage ist, dass ich herausgefunden habe, dass es ziemlich schwierig zu finden in der Microsoft-Dokumentation Seiten, die eigentlich darüber reden C in diesen Tagen.
Libcxx Implementierung github.com/llvm-mirror/libcxx/blob/...

InformationsquelleAutor Dark Shikari | 2008-12-10

Schreibe einen Kommentar