【问题标题】:How can I simulate alignas(T)?如何模拟 alignas(T)?
【发布时间】:2011-10-21 00:23:59
【问题描述】:

我有一个数组,用作T 类型对象的底层内存:

char memory[sizeof T];
.
.
.
new(memory) T(whatever);

如何确保 memoryT 对象正确对齐?在 C++0x 中我只能说:

alignas(T) char memory[sizeof T];

但 Visual Studio 2010 尚不支持该特定功能。

【问题讨论】:

    标签: c++ memory alignment memory-alignment


    【解决方案1】:

    通常的(可移植的)解决方案是将内存声明与T 中需要最多对齐的任何内置类型放在一个联合中。 最简单的方法是使用与所有可能的联合 候选人:

    union MaxAlign
    {
        int                 i     ;
        long                l     ;
        long long           ll    ;
        long double         ld    ;
        double              d     ;
        void*               p     ;
        void (*             pf)() ;
        MaxAlign*           ps    ;
    } ;
    
    union
    {
        MaxAlign dummyForAlignment;
        unsigned char memory[sizeof(T)];
    } rawT;
    

    我还没有听说过,更不用说遇到,一台机器,上面的 还不够。通常,只需double 就足够了。 (这绝对是 在 Intel 和 Sparc 上已经足够了。)

    在某些极端情况下,这可能会导致分配的内存比 必要的,例如如果T 只包含一两个char。大部分的 时间,这真的无所谓,也不值得担心,但如果 是的,可以使用以下内容:

    namespace MyPrivate {
    
    template< typename T, bool isSmaller >
    struct AlignTypeDetail ;
    
    template< typename T >
    struct AlignTypeDetail< T, false >
    {
        typedef T type ;
    } ;
    
    template< typename T >
    struct AlignTypeDetail< T, true >
    {
        typedef char type ;
    } ;
    
    template< typename T, typename U >
    struct AlignType
    {
        typedef typename AlignTypeDetail< U, (sizeof( T ) < sizeof( U )) >::type
                            type ;
    } ;
    }
    
    template< typename T >
    union MaxAlignFor
    {
        typename MyPrivate::AlignType< T, char >::type        c ;
        typename MyPrivate::AlignType< T, short >::type       s ;
        typename MyPrivate::AlignType< T, int >::type         i ;
        typename MyPrivate::AlignType< T, long >::type        l ;
        typename MyPrivate::AlignType< T, long long >::type   ll ;
        typename MyPrivate::AlignType< T, float >::type       f ;
        typename MyPrivate::AlignType< T, double >::type      d ;
        typename MyPrivate::AlignType< T, long double >::type ld ;
        typename MyPrivate::AlignType< T, void* >::type       pc ;
        typename MyPrivate::AlignType< T, MaxAlign* >::type   ps ;
        typename MyPrivate::AlignType< T, void (*)() >::type  pf ;
    } ;
    

    在这种情况下,MaxAlignFor&lt;T&gt; 永远不会大于 T (并且有足够的对齐,因为所需的对齐将 永远不要大于T的大小)。

    请注意,标准并未正式保证这些。但它 将在实践中发挥作用。

    【讨论】:

    • @Mehrdad 它说 VC++ 不支持某个功能。它并不是说这是唯一使用的编译器。
    • @JamesKanze:对不起,我评论错了。请参阅下面的帖子。
    【解决方案2】:

    搜索vc++ align 显示this page:使用__declspec(align(#))

    【讨论】:

    • 正如前面的__ 明确指出的那样,它是编译器特定的扩展。
    • @JamesKanze:这已经晚了 3 年,但我还是会提到它......它确实在问题中说 Visual C++ :)
    • @JamesKanze:抱歉,我实际上是用手机评论的,但我没有意识到我评论错了帖子。我在您的帖子下的回复是为了在这里回复您的评论。
    【解决方案3】:

    如果 T 是标准布局并且联合格式良好,则

    union
    {
       T t;
       char memory[sizeof T];
    };
    

    应该对齐。

    【讨论】:

      【解决方案4】:

      要么在堆上分配内存(有对齐保证),要么使用boost::aligned_storage

      【讨论】:

        猜你喜欢
        • 2013-09-28
        • 2011-01-15
        • 1970-01-01
        • 2022-06-15
        • 1970-01-01
        • 2016-12-16
        • 2019-05-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多