Was ist in HLSL der Unterschied zwischen "static const" und "#define" für Konstanten?

8

Bisher habe ich alle meine konstanten Variablen wie static constin meinem HLSL-Code deklariert , aber praktisch jedes einzelne Shader-Beispiel, auf das ich gestoßen bin, verwendet #definestattdessen.

Ich kenne die Gründe, warum ich statische Konstante in C ++ über den Präprozessor verwenden würde, und habe sie auch nur in HLSL übernommen. Ich bin jedoch gespannt, ob es neben den Standardargumenten von C ++ "static const versus #define" Nebenwirkungen oder Vor- / Nachteile gibt.

KaiserJohaan
quelle

Antworten:

3

Es ist im Grunde egal.

#defineverwendet Token-Pasting, um den angegebenen Wert in den Shader-Code einzufügen, wo immer er auftritt; Der Shader selbst sieht das Token so, als ob Sie es stattdessen bei jedem Auftreten einfach fest codiert hätten.

Eine static constVariable in Wirklichkeit eine Variable. Insbesondere handelt es sich um eine einmal initialisierte Variable, deren Wert zwischen Funktionsaufrufen bestehen bleibt und die nicht geändert werden kann. Als Variable kann sie dieselben Eigenschaften haben wie alle anderen Variablen: zusätzliche Speicher- und Typspezifizierer ( precise), komplexere Typen (z. B. float4), Semantik und Registerzuweisungen ( siehe hier für alle Dinge). Speziell für static constVariablen sind die meisten dieser Extras jedoch nicht zulässig oder gelten nicht (insbesondere, da eine globale Statik für den Anwendungscode nicht sichtbar ist ).

Die static constVersion erlaubt möglicherweise einige Compiler-Optimierungen (kleinere), insbesondere wenn der Typ der Variablen komplexer ist (z. B. ein float4oder ein Matrix-Typ), aber das scheint unwahrscheinlich zu sein.

Wählen Sie am Ende diejenige, die Sie stilistisch bevorzugen.


quelle
1
Gibt es einen Grund , warum man würde es vorziehen , static constzu const? Gibt es spezielle Optimierungen static const, für die dies nicht gilt const? Dies setzt voraus, dass der zugewiesene Wert selbst nur eine Konstante ist.
Shahbaz
Eine statische const-lokale Variable wird nur einmal initialisiert, aber eine reguläre const wird vermutlich jedes Mal initialisiert. Sie möchten eine nicht statische Konstante, wenn die Initialisierung beispielsweise von Parametern für die Funktion abhängt. Abgesehen davon glaube ich nicht, dass der Optimierer etwas Besonderes tun wird.
Vielen Dank. Ich sehe Fälle wie static const float something = 1.53;zum Beispiel, die dann mit oder ohne keinen Unterschied machen sollten static.
Shahbaz