5

一行代码值一千字 :) 这是我的问题:

/* Platform specific 16-byte alignment macro switch.
   On Visual C++ it would substitute __declspec(align(16)).
   On GCC it substitutes __attribute__((aligned (16))).
*/
#define ALIGN_16 ...

struct ALIGN_16 A {...};

A* ptr = new A;
A* ptr2 = new A[20];

assert(size_t(ptr) % 16 == 0);

for (int i=0; i<20; ++i)
    assert(size_t(ptr2+i) % 16 == 0);

assert(sizeof(A) % 16 == 0);

我可以期望所有断言都在支持 SSE 的平台上传递吗?谢谢你。

编辑。部分回答。我用 VS2008、GCC 和 ICC 做了一些测试。MS 编译器确实对齐了ptrptr2,但是 GCC 和 ICC 未能对齐ptr2

4

2 回答 2

4

C++ 的新操作是否可以保证地址返回的对齐?

换句话说,您可以使用该标准来证明您认为它应该有效的假设是正确的,但在实践中,它可能会在您的脸上爆炸。

Visual C++ 6 没有正确对齐doubles分配new,所以你去吧。

于 2010-12-15T00:44:25.087 回答
1

C++0x 提供了一个新结构(在[meta.type.synop] 20.7.6.6 其他转换中):

std::aligned_storage<Length, Alignment>

据我记得,它保证始终正确对齐。

第二个参数是可选的,并且默认为可能的最严格的要求(因此不精确它总是安全的,但如果您愿意尝试,您可以更紧凑地打包您的类型)。

除了错误之外,编译器一定会遵守要求。如果您没有 C++0x,则可以在tr1命名空间或Boost.

您是唯一可以测试您的特定编译器是否满足此请求的人:)

注意:在 上gcc-4.3.2,它被实现为:

template<std::size_t _Len, std::size_t _Align = /**/>
struct aligned_storage
{
  union type
  {
    unsigned char __data[_Len];
    struct __attribute__((__aligned__((_Align)))) { } __align;
  };
};
于 2010-12-15T08:32:00.917 回答