コンパイル時定数整数を使用する浮動小数点計算は、コンパイル時または実行時に実行されますか? たとえば、次の場合に除算演算が計算されます。
template <int A, int B>
inline float fraction()
{
return static_cast<float>(A) / B;
}
コンパイル時定数整数を使用する浮動小数点計算は、コンパイル時または実行時に実行されますか? たとえば、次の場合に除算演算が計算されます。
template <int A, int B>
inline float fraction()
{
return static_cast<float>(A) / B;
}
これほど単純なものの場合、コンパイラはおそらくコンパイル時にそれを行います。実際、コンパイル時にすべての値がわかっている限り、コンパイラはおそらくテンプレートがなくinline float fraction(int A, int B)
てもコンパイル時にそれを行いますfraction(1,2)
。
コンパイル時にコンパイラに何かをさせたい場合は、いくつかのテンプレート メタプログラミング トリックを使用する必要がありますが、浮動小数点演算で動作させることができるかどうかはわかりません。しかし、ここにテクニックの基本的な例があります:
// Something similarly simple that doesn't use floating-point ;)
template <int A, int B>
struct Product {
enum { value = A * B };
};
// Later:
... Product<3, 4>::value ...
C または C++ 標準では、コンパイル時にストライプの定数式を評価する必要はありませんが、許可されています。過去 20 年間にリリースされたほとんどのコンパイラは算術式を評価するため、関数呼び出しやコードのインライン化が重要でない場合は、可能な限り単純にしてください。
これらの式のスコープが 1 つのファイルに限定されている場合は、プリプロセッサをいつでも#define FRACTION(a,b) (float(a)/float(b))
便利に利用できます。ファイルの汚染を防ぐための適切なスキームがない限り、ヘッダーでこれを行うことはお勧めしません#include
。
最善の策は、生成されたコードを確認することです。コンパイル時に浮動小数点演算が実行されるという保証はありませんが、より高い最適化レベルでは、特にこのような単純なものでは実行される可能性があります。
(一部のアーキテクチャでは、実行時に浮動小数点の動作を構成できるため、これを回避するコンパイラもあります。コンパイル時に実行される操作の結果は、実行時に実行される同じ操作の結果と異なる可能性があります。)
C++0x constexprキーワードが実装された gcc 4.6 を待つ必要があります。
実装定義だと思いますが、ほとんどのコンパイラはコンパイル時に定数式を評価します。ただし、次の変更を行わなくても:
template <int A, int B>
inline float fraction()
{
static const float f = static_cast<float>(A) / B;
return f ;
}
実行時に評価される場合、式が一度だけ評価されることを少なくとも保証します。