レガシー APIのC++ラッパーを作成しています。この API は、余分なデータを保持するためのポインター値を提供します。これを使用してSmall Buffer Optimizationを実装したいと考えています。
特定のタイプがPODであり、次の範囲内に収まるかどうかをチェックするis_small_pod
メタ関数を実装しました。void*
template< typename Type >
struct is_small_pod
: std::integral_constant<
bool
, std::is_pod< Type >::type::value
&& sizeof( Type ) <= sizeof( void* )
>
{};
そして、私は次のように値を設定しています:
// void*& param;
if( detail::is_small_pod< Type >() )
{
*static_cast< Type* >( ¶m ) = value;
} else {
param = new Type( value );
}
この最適化を正しく実装していますか? 値のアラインメントがポインターのアラインメントと互換性がない場合、これは失敗すると思います (奇妙なケースもあります)。その状況は可能ですか、それとも私が考えすぎているだけですか? メタ関数を拡張して、互換性のあるアラインメントもチェックするにはどうすればよいですか?