在查看boost::aligned_storage的实现代码时,看到,其中的两个枚举量:
size和alignment,size是传入类型的sizeof, alignment则是其对齐边界。
alignment = (
alignment_ == std::size_t(-1)
? ::boost::detail::aligned_storage::alignment_of_max_align
: alignment_
)
默认情况下alignment_参数为-1,那么就来分析一下::boost::detail::aligned_storage::alignment_of_max_align。
其中只有一句:
alignment_of_max_align = ::boost::alignment_of<max_align>::value
alignment_of的定义很明确了,就是类型T的对齐边界。max_align意味这想透过此获得系统最大的对齐边界。
然而,max_align的实现似乎有问题。
在分析之前,我们看看一段测试代码,在vc7.1环境下,
cout << alignment_of<detail::max_align>::value << endl;
cout << aligned_storage<sizeof(int)>::alignment << endl;
输出
8
8
似乎系统的最大对齐边界就是8.我们在看max_align的实现:
union max_align
{
BOOST_PP_LIST_FOR_EACH_I(
BOOST_TT_CHOOSE_T
, ignored
, BOOST_TT_ALIGNMENT_TYPES
)
};
嗯,再去看关键宏定义的序列:
#define BOOST_TT_ALIGNMENT_TYPES BOOST_PP_LIST_APPEND(BOOST_TT_ALIGNMENT_BASE_TYPES, BOOST_TT_ALIGNMENT_STRUCT_TYPES)
#define BOOST_TT_ALIGNMENT_BASE_TYPES BOOST_PP_TUPLE_TO_LIST( 11, ( char, short, int, long, float, double, long double , void*, function_ptr, member_ptr, member_function_ptr))
在看function_ptr, member_ptr, member_function_ptr是如何定义的:
class alignment_dummy;
typedef void (*function_ptr)();
typedef int (alignment_dummy::*member_ptr);
typedef int (alignment_dummy::*member_function_ptr)();
好了,我们总结一下,max_align是上述的11种数据类型的union,这个union的大小在我们的测试中,为8.然而有一种情况被忽略了:
class A{};
class B : virtual A{};
cout << alignment_of<void (B::*)(int) >::value << endl;
输出是多少?
12
很显然,member_function_ptr并不能涵盖所有的成员函数指针,对于存在有虚基类的情况下,是不适合的。
那么,这个max_align的实现,算不算有问题呢?到目前为止,我还没有能够清理出实现代码,那些扩展宏实在恐怖,看得我头晕目眩。所以,我的疑问还只是疑问。