• boost中max_align的实现疑问(转)


    转自 : http://blog.csdn.net/wingfiring/article/details/632756

    在查看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的大小在我们的测试中(VC7.1),为8.然而有一种情况被忽略了:
    class A{};
    class B : virtual A{};
    cout << alignment_of<void (B::*)(int) >::value << endl;
    输出是多少?
    12
    很显然,member_function_ptr并不能涵盖所有的成员函数指针,对于存在有虚基类的情况下,是不适合的。
    那么,这个max_align的实现,算不算有问题呢?到目前为止,我还没有能够清理出实现代码,那些扩展宏实在恐怖,看得我头晕目眩。所以,我的疑问还只是疑问。

  • 相关阅读:
    php防止刷流量攻击
    PHP序列化变量的4种方法
    php递归操作目录 递归对参数转义
    php 图像裁剪(自定义裁剪图片大小)
    jquery实现点击文字后变成文本框且可修改
    mysql查看表注释和字段注释的方法
    php 获取中文字符串首字母
    Nginx.conf配置
    光盘作为yum源
    win7下安装mongodb
  • 原文地址:https://www.cnblogs.com/winkyao/p/2781681.html
Copyright © 2020-2023  润新知