3

我需要为 4 个字节对齐的 2 个字节变量声明类型别名。

在 GCC、XL C/C++ (AIX)、aCC (HP-UX) 中,我可以使用以下代码:

typedef uint16_t AlignedType __attribute__ ((aligned (4)));

在 Windows 中,我可以使用:

typedef __declspec(align(4)) unsigned __int16 AlignedType;

如何在 SunStudio C++ 11 中声明相同类型?

“pragma align”不适合,因为它仅适用于全局或静态变量,并且需要变量名。

4

4 回答 4

2

从 Sun C 5.9 (Sun ONE Studio 12) 开始,支持对齐属性:

typedef uint16_t AlignedType __attribute__ ((aligned (4)));

不幸的是,C++ 不支持此属性(至少通过 Sun C++ 5.10)。

于 2012-01-26T16:41:42.767 回答
1

至少值得尝试:

typedef union {
  uint16_t value;
  uint32_t _dummy;
} AlignedType;

这当然会使访问变得更加痛苦,并且会终止直接分配,因此它可能会破坏您的整个代码库。此外,它纯粹基于这样的假设,即包括一个更大的类型,由于具有该大小,它被假定具有 32 位的“本机对齐”,使得union整体对齐 32 位。

于 2012-01-24T10:03:03.987 回答
0

从 Sun C++ 5.12 SunOS_sparc 2011/11/16 开始,根据 DRH 的响应,C++ 似乎支持 gcc 语法:

typedef uint16_t AlignedType8 __attribute__ ((aligned (8)));
typedef uint16_t AlignedType4 __attribute__ ((aligned (4)));
typedef uint16_t AlignedType2 __attribute__ ((aligned (2)));
cout << __alignof__(AlignedType8) << ' ' << __alignof__(AlignedType4) << ' ' << __alignof__(AlignedType2) << endl;

输出是:

8 4 2

于 2014-04-09T04:07:28.213 回答
0

对于将来的参考,当编译器赶上时,C++11 具有标准对齐属性,请参阅alignas([dcl.align] in N3242 )。

于 2012-01-24T14:53:44.553 回答