我想将Pimpl习语应用于本地存储习惯用语:
mytype.h
class mytype {
struct Impl;
enum{ storage = 20; }
char m_storage[ storage ];
Impl* PImpl() { return (Impl*)m_storage; }
public:
mytype();
~mytype();
void myMethod();
};
mytype.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_storage
的对齐。 char
不能保证以与int应该相同的方式对齐。原子可能具有更严格的对齐要求。我正在寻找比char数组更好的东西来声明存储,这使我能够定义(和断言)对齐值。你知道那种吗?也许升级库已经做到了这一点?
答案 0 :(得分: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方法?
答案 1 :(得分: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));
答案 2 :(得分:3)
这里通常的解决方案是使用需要类型的联合 您系统上的大多数对齐方式(通常为双倍):
static int const requiredStorage = 20;
union
{
unsigned char myStorage[requiredStorage];
double dummyForAlignment;
};
如果你不确定使用哪种类型,只需输入所有基本类型 类型,加上一些指针(数据,虚空,函数)确定。