解决堆栈对齐问题的char数组

时间:2010-10-06 20:50:10

标签: c++ c

请参阅:Placement new issue

简单的问题,这会解决对齐问题吗?

union
{
    char real_array[sizeof(T)*size];
    T    fake_array[size];
};

3 个答案:

答案 0 :(得分:6)

是的,这应解决对齐问题。虽然没有必要让fake_array成为一个数组。只需一个T类型的成员即可。

这实际上是一种相当广泛使用的技巧,用于强制某些数组上的特定对齐。

作为一个迂腐的旁注:匿名工会只存在于C ++中,但不存在于C中。

答案 1 :(得分:1)

我不这么认为,如果你回头看看你发布的链接就说'好吧我终于明白了,它可能会从一个错误的地址开始。' 您仍然无法控制联盟第一个成员的地址。

答案 2 :(得分:1)

是的,即使是下面更简单的结构也可以解决问题。

union
{
    char real_array[sizeof(T)*size];
    T    dummy;
};

我认为ISO标准下面的引用足以保证其有效。

  

按顺序提供一项特殊保证   简化工会的使用:如果一个   POD-union包含几个POD结构   共享一个共同的初始序列,   如果是这个的对象   POD-union类型包含其中之一   POD结构,允许   检查共同的初始序列   任何POD结构成员;

但是,如果您使用非POD类,您可能会想知道是否存在导致未定义行为的漏洞......(但我敢打赌它可以与任何编译器一起使用)。