c++ - 如何模拟 alignas(T)?

标签 c++ memory alignment memory-alignment

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

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

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

alignas(T) char memory[sizeof T];

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

最佳答案

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

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<T>永远不会大于 T (并且有足够的对齐,因为所需的对齐将 永远不要大于 T 的大小)。

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

关于c++ - 如何模拟 alignas(T)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6959261/

相关文章:

html - 在浏览器中定位内容以匹配重复的背景

css - 将不同大小的图像对齐到底部

c++ - 为什么 emplace_back() 会这样?

c++ - 如何将日期字符串解析为 c++11 std::chrono time_point 或类似的?

c - 在编译时避免变长堆栈数组

c - 如何在不使用 malloc 的情况下从函数返回数组?

c - c 中的 x64 内联汇编以对齐指令

c++ - SSE版本的差平方和算法的累积计算误差

c++ - 为什么 f(x).swap(v) 可以,但 v.swap(f(x)) 不行?

数组中的 C++ 对象 owerwritten