有没有办法在编译时检测一个类是否有vtable?我试图确保 一个类对齐到64个字节的边界,并且是64个字节的长度。添加一个vtable将类大小增加到128字节。编译时检测vtable
class __attribute__((aligned(64))) C
{
private:
int64_t iValue;
char iPadding[64 - sizeof(int64_t)];
};
这很好。然而,
class __attribute__((aligned(64))) C
{
public:
virtual ~C() {}
private:
int64_t iValue;
char iPadding[64 - sizeof(int64_t)];
};
拧东西了。
答案:aligned
也垫,不只是控制位置。 __declspec(align())
似乎也这样做!
编辑:仍然竹子。在检查C
的构造函数后,检查this
是否可以被64和throw
整除,如果它不是,我收到异常。最初我虽然可能需要处理堆栈上的C
实例,但在将其更改为基于堆的对齐检查仍然失败后。我只是回到工厂功能,调用posix_memalign
,并在原地new
(这可能是什么std::aligned_storage
最终会做什么)
iPadding []的目的是什么?只是为了填补你的类,所以如果你有一个他们的数组,他们的iValue成员将始终在一个64字节的边界? – phonetagger
使用C++ 11,您也可以使用['std :: aligned_storage'](http://en.cppreference.com/w/cpp/types/aligned_storage)来对齐您的类。 – ipc
@James:alignment可以添加填充,因为这就是编译器可以确保数组元素对齐的方式。 –