2016-04-29 15 views
4

のメモリ消費説明 -私はメタプログラミングの本の中で、この作業コード見つかっこのメタプログラミング

template<unsigned long N> 
struct binary 
{ 
    static unsigned const value = binary<N/10>::value *2 + N%10;  
}; 

template<> 
struct binary<0> 
{ 
    static unsigned const value = 0; 
}; 

int main() 
{ 
    unsigned x = binary<101010>::value; 
    cout << x; 
} 

私の質問をされた - valueためのメモリが割り当てられているの?それはデータセグメントに割り当てられていますか?

また、このコードでは、再帰と同様の方法で結果を計算するテンプレートのインスタンシエーションのカスケードが生成されます。つまり、各テンプレートのインスタンス化では、データセグメントに新しいunsignedが割り当てられますか?

答えて

6

valueには定義がありません。このような静的データメンバーは、アドレスを持つ必要がない方法でのみ使用できます(odr-used)。それらの値は、unsigned x = 42;のようにインライン化されます。

もちろん、コンパイラは、何らかの形ですべてのテンプレートの特殊化をインスタンス化し、binary<101010>::valueを計算する必要があります。しかし、コンパイルが完了してもそれはもう重要ではありません。

3

良いC++コンパイラを使用すると、メモリはどこにも割り当てられません。 C++コンパイラは、このクラスを完全に最適化し、計算された定数をそれを使用するコードで直接使用します。

関連する問題