2013-02-28 9 views
9

So definiert so etwas wie dies sehe ich oft:Einschließlich arithmetische Operationen, wenn ein konstant

#define gf_PI f32(3.14159265358979323846264338327950288419716939937510) 
#define gf_PIhalf f32(3.14159265358979323846264338327950288419716939937510 * 0.5) 

Dies bedeutet, dass die Hälfte PI-Wert jedes Mal berechnet wird, ich gf_PIhalf in meinem Code verwenden, nicht wahr?
Wäre es nicht besser, stattdessen den Wert von halber PI zu schreiben?

Wäre es nicht noch besser sein, wie folgt vorgehen:

#define gf_PI f32(3.14159265358979323846264338327950288419716939937510) 
const float gf_PIHalf = gf_PI * 0.5f; // PIHalf is calculated once 

Schließlich wäre es nicht am besten, es so zu tun (und warum es scheint nicht eine gängige Praxis zu sein):

const float gf_PI = 3.14159265358979323846264338327950288419716939937510; 
const float gf_PIHalf = gf_PI * 0.5f; 
+1

interessiert es dich wirklich, wenn dein Programm eine Multiplikation mehr macht? Ist das wirklich so kritisch? – Smash

+0

Das ist eine gute Frage. Ich habe einmal eine ähnliche Frage zu Speicherbeschränkungen und Effizienz gestellt, und ich denke, die Standardantwort, die ich erhielt, war ähnlich wie "Ehrlich, bei diesem Tempo ist es egal. Es ist so eine kleine Menge von Daten, dass das Verhältnis von Effizienz nicht Ich nehme einen großen Schlag. " Ich denke in diesem Fall werden Sie feststellen, dass die Effizienz des Programms VS nicht unbedingt leidet. die Idee, dass Sie eine Neuberechnung bekommen, der Sie jedes Mal vertrauen können. Wenn Sie in der Arithmetik sicher sind, würde ich für reine Effizienz gehen. – plast1K

+0

Sehen Sie, ein guter Compiler optimiert [sogar eine komplette Unordnung wie diese] (http://stackoverflow.com/questions/15114140/writing-binary-number-system-in-c-code/15114188#15114188) in eine Konstante ... –

Antwort

11

Dies bedeutet, dass die Hälfte PI-Wert jedes Mal, wenn ich gf_PIhalf in meinem Code verwenden berechnet wird, nicht wahr?

Nein, nicht wahrscheinlich.

Sie können vernünftigerweise mit Ihrem Compiler rechnen, diese Multiplikation zur Kompilierzeit und nicht zur Laufzeit zu machen.

3

Ihre Schlussfolgerungen sind etwas richtig, außer dass die #define Version wird fast definitiv in kompilieren Zeit und das bisschen über Typen const globals ist eine ungewöhnliche Praxis zu lösen. Sie sind gängige Praxis in modernen guten Code. #define s sind für diesen Zweck alles andere als tot. Die besten Praxis ist Ihre Datei Umfang Globals in einem ungenannten Namensraum zu definieren:

namespace 
{ 
    const float g_SomeGlobal = 123.456f; 
} 

Dies verhindert, dass jemand außerhalb Ihrer Übersetzungseinheit von der Lage zu ‚sehen‘ g_SomeGlobal.

Verwandte Themen