2

我想将 Pimpl 成语与本地存储成语一起应用:


我的类型.h

class mytype {
 struct Impl;
 enum{ storage = 20; }
 char m_storage[ storage ];
 Impl* PImpl() { return (Impl*)m_storage; }
public:
 mytype();
 ~mytype();
 void myMethod(); 
};

我的类型.cpp

#include "mytype.h"
struct mytype::Impl {
int foo;
 void doMethod() { foo = (foo-1)*3; };
}

mytype::mytype() {
new (PImpl()) Impl(); // placement new
//check this at compile-time
static_assert( sizeof(Impl) == mytype::storage ); 
//assert alignment?
}

mytype::~mytype() {
PImpl()->~();
}
void mytype::myMethod() {
 PImpl()->doMethod();
}

我对这种方法唯一关心的是对齐m_storagechar不保证以与 int 相同的方式对齐。原子可能有更严格的对齐要求。我正在寻找比 char 数组更好的东西来声明存储,它使我能够定义(和断言)对齐值。你知道这样的事吗?也许一个boost库已经这样做了?

4

3 回答 3

4

boost::aligned_storage http://www.boost.org/doc/libs/1_43_0/libs/type_traits/doc/html/boost_typetraits/reference/aligned_storage.html应该可以解决问题。

您是否有理由不只是使用正常的 pimpl 方法?

于 2011-10-28T15:58:59.723 回答
3

这里通常的解决方案是使用需要系统上最多对齐的类型的联合(通常是双精度):

static int const requiredStorage = 20;
union
{
    unsigned char myStorage[requiredStorage];
    double dummyForAlignment;
};

如果您不确定要使用哪种类型,只需输入所有基本类型,再加上一些指针(指向数据、指向 void、指向函数)即可确定。

于 2011-10-28T16:08:35.830 回答
3

看看boost::aligned_storage。用法很简单:

#include <boost/aligned_storage.hpp>
#include <boost/type_traits/alignment_of.hpp>


typedef boost::aligned_storage<sizeof(ptime), boost::alignment_of<ptime>::value> storage_type;

using boost::posix_time::ptime;
storage_type unix_epoch_storage_;

new (unix_epoch_storage_.address()) ptime(date(1970, 1, 1));
于 2011-10-28T16:00:19.113 回答