假设我们有一些结构

struct S
{
  double a, b;
  ~S(); // S doesn't have to be POD
};

此类结构的对齐方式通常应为8,因为其最大包含类型的大小为8。

现在,假设我们要声明一个占位符结构来保存S的值:
struct Placeholder
{
  char bytes[ sizeof( S ) ];
};

现在,我们要将其放置在另一个类中:
class User
{
  char someChar;
  Placeholder holder;
public:
  // Don't mind that this is hacky -- this just shows a possible use but
  // that's not the point of the question
  User() { new ( holder.bytes ) S; }
  ~User() {  ( ( S * )( holder.bytes ) )->~S(); }
};

问题是,Placeholder现在在User中未正确对齐。由于编译器知道Placeholder由字符组成,而不是由double组成,因此通常会使用1的对齐方式。

有没有一种方法可以声明Placeholder,其对齐方式与C++ 03中的S对齐?请注意,S不是POD类型。我也了解C++ 11具有alignas,但是尚不通用,所以我宁愿不要指望它。

更新:只是为了澄清,这适用于任何S-我们不知道它包含什么。

最佳答案

我相信boost::aligned_storage可能正是您想要的。它以这种方式使用联合技巧,使您的类型无关紧要(只需使用sizeof(YourType)告诉它如何对齐)即可确保对齐正确进行。

关于c++ - 对应该在C++中保存结构的缓冲区使用正确的对齐方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17859273/

10-11 22:33
查看更多