私のアプリケーションでは、メモリ使用量が非常に重要です。したがって、コンパイル時にメモリサイズをチェックし、サイズが以前に正しいと見なしたものと異なる場合はstatic_assertを与える特定のアサーションがあります。
私はこのようなマクロを定義しました:
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "!");
このマクロを使用すると、次のように簡単に記述できます。
CHECKMEM(Book,144);
CHECKMEM(Library,80);
問題は、このstatic_assertがオフになると、新しいサイズを見つけるのが非常に難しい場合があることです(たとえば、非表示のコンパイラオプション "/ d1 reportAllClassLayout"を使用することによって)。実際のサイズを含めることができれば、はるかに便利なので、次の代わりに:
ブックのサイズが正しくありません!
それは表示されます
ブックのサイズが正しくありません!(予想144、サイズは152)
私はこのようなものを書いてみました:
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "! (expected" #size ", size is " #sizeof(mytype) ")");
ただし、関数呼び出しでstringize(#)演算子を使用することはできません。
また、次のように、二重文字列化のトリックを追加してみました。
#define STR1(x) #x
#define STR2(x) STR1(x)
#define CHECKMEM(mytype, size) static_assert((sizeof(objectType) == size)), "Size incorrect for " #mytype "! (expected" #size ", size is " STR2(sizeof(mytype)) ")");
ただし、印刷する代わりに、を印刷size is 152
しますsize is sizeof(Book)
。
static_assertでsizeofの結果を文字列化する方法はありますか?