次のシグネチャを持つ関数が与えられたとします。
void SendBytesAsync(unsigned char* data, T length)
type で指定できる最大長のバイト配列を保持するのに十分な大きさのバッファーが必要T
です。そのバッファを宣言するにはどうすればよいですか? sizeof
型に含めることができる最大値ではなく、型 T のサイズ (バイト単位) を返すため、単に使用することはできません。基になる型が変更され、バッファーが小さすぎる可能性があるため、limits.h を使用したくありません。定数式が必要なため、math.h の pow を使用できません。では、C でコンパイル時に型の最大サイズの定数式を取得するにはどうすればよいでしょうか?
編集
タイプは unsigned になります。静的に割り当てられたバッファーがコンパイル時に決定されるという考えに誰もが愕然としているように見えるので、少し背景を説明します。これは、信頼性と速度が優先される組み込みアプリケーション (マイクロコントローラー上) 向けです。そのため、実行時の整合性 (malloc
問題なし) とパフォーマンス (バッファーが必要になるたびにメモリ割り当てのオーバーヘッドがない) のために、静的に割り当てられたメモリを浪費してもまったく問題ありません。の最大サイズT
が大きすぎると、リンカーがそれほど大きなバッファーを割り当てることができないというリスクを理解していますが、それは、実行時のエラーではなく、コンパイル時のエラーであり、対応できます。容認することはできません。たとえば、私が使用する場合size_t
ペイロードのサイズを調べてメモリを動的に割り当てると、システムで使用可能なメモリがそれほど多くない可能性が非常に高くなります。これは、パケットの損失やデータの破損などを引き起こす実行時よりも、コンパイル時に知りたいと思います。私が提供した関数シグネチャを見ると、動的な割り当てられたバッファーであり、呼び出し元が型の最大値を使用する可能性を期待しないでください。したがって、そのメモリを一度割り当てることについて、なぜそれほど多くの驚きがあるように見えるのか、私にはわかりません。これは、複数のプロセスが同じメモリ リソースをめぐって争っている Windows の世界では大きな問題であることがわかりますが、組み込みの世界では、実行するタスクは 1 つだけであり、それを効果的に実行できない場合は、それを実行できません。