ホームページ >バックエンド開発 >C++ >コンパイル時に C 配列のサイズを効率的に決定するにはどうすればよいですか?

コンパイル時に C 配列のサイズを効率的に決定するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-30 08:06:16401ブラウズ

How Can I Efficiently Determine the Size of a C   Array at Compile Time?

「配列のサイズ」テンプレート関数を理解する

このコードは、配列のサイズを決定するように設計されたテンプレート関数 GetArrLength を定義します。

template<typename T, int size>
int GetArrLength(T(&amp;)[size]){return size;}

関数のパラメータの詳細

パラメータT(&)[size] は、型 T のサイズ size の配列への参照として宣言されています。これは、型とサイズがテンプレート パラメーターとして指定されている任意の配列への参照を受け入れることを意味します。

テンプレート パラメーターMatching

この関数を呼び出すと、コンパイラーはテンプレート パラメーターを推定しようとします。たとえば、次のように呼び出した場合:

int a[10];
GetArrLength(a);

コンパイラは、T が int でサイズが 10 であると判断し、10 個の整数の配列へのパラメータ参照を作成します。

関数動作

この関数は、テンプレート パラメーターのサイズの値を返し、事実上、テンプレート内の要素の数を提供します。 array.

使用法と制限

このコードは配列サイズの取得を簡素化しますが、いくつかの欠点があります。まず、テンプレート パラメーターと戻り値の両方に符号付き型を使用しますが、サイズを負にすることができないため問題があります。より堅牢な解決策を得るには、std::size_t などの符号なし型を使用する必要があります。

第 2 に、この関数の結果は、配列サイズである必要があるにもかかわらず、定数式ではありません。定数式の評価は、特定の最適化には不可欠です。

定数式のソリューション

定数式の結果を提供するより高度なアプローチには、型のイントロスペクションと sizeof 演算子の使用が含まれます。

template <std::size_t N>
struct type_of_size
{
    typedef char type[N];
};

template <typename T, std::size_t Size>
typename type_of_size<Size>::type&amp; sizeof_array_helper(T(&amp;)[Size]);

#define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))

この手法は、文字配列のサイズがその要素数と等しいという事実を利用します。 sizeof 演算子は、テンプレート パラメーターのサイズを表すために使用される char 配列のサイズを取得し、配列サイズの定数式評価を提供します。

以上がコンパイル時に C 配列のサイズを効率的に決定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。