我正在编写一个围绕遗留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* >( ¶m ) = value;
} else {
param = new Type( value );
}
Run Code Online (Sandbox Code Playgroud)
我是否正确实施此优化?我相信当值对齐与指针的对齐不兼容时(这可能是奇数角的情况),这将失败.这种情况是否可能,或者我只是过度思考它?我应该如何扩展我的元函数以检查兼容的对齐?
类型的对齐不可能大于该类型的大小.
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)
| 归档时间: |
|
| 查看次数: |
1244 次 |
| 最近记录: |