小缓冲区优化和对齐

K-b*_*llo 10 c++ c++11

我正在编写一个围绕遗留API 的C++包装器.这个API为我提供了一个指针值来保存额外的数据,我想用它实现小缓冲区优化.

我已经实现了一个is_small_pod 元函数,它检查给定的类型是否是POD并且它适合于void*:

template< typename Type >
struct is_small_pod
  : std::integral_constant<
        bool
      , std::is_pod< Type >::type::value
        && sizeof( Type ) <= sizeof( void* )
    >
{};
Run Code Online (Sandbox Code Playgroud)

我正在设置这样的值:

// void*& param;
if( detail::is_small_pod< Type >() )
{
    *static_cast< Type* >( &param ) = value;
} else {
    param = new Type( value );
}
Run Code Online (Sandbox Code Playgroud)

我是否正确实施此优化?我相信当值对齐与指针的对齐不兼容时(这可能是奇数角的情况),这将失败.这种情况是否可能,或者我只是过度思考它?我应该如何扩展我的元函数以检查兼容的对齐

eca*_*mur 8

类型的对齐不可能大于该类型的大小.

3.11对齐[basic.align]

[...] 对齐是一个实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数.

5.3.3 Sizeof [expr.sizeof]

2 - [...] n个元素数组的大小是元素大小的n倍.

因此,只有alignof(void *) < sizeof(void *)在大多数平台上都不是这样的情况下,您的代码才能破解.

为安全起见,您可以写:

template< typename Type >
struct is_small_pod
  : std::integral_constant<
        bool
      , std::is_pod< Type >::type::value
        && sizeof( Type ) <= sizeof( void* )
        && alignof( Type ) <= alignof( void* )
    >
{};
Run Code Online (Sandbox Code Playgroud)