クラスに vtable があるかどうかをコンパイル時に検出する方法はありますか? クラスが 64 バイト境界に整列され、長さが 64 バイトであることを確認しようとしています。vtable を追加すると、クラス サイズが 128 バイトに増加します。
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
最終的に行うことです) 。