1

それを継承するオブジェクトの配置を指示する基本クラスが必要です。これは、ヒープの割り当て方法と、カスタム配列テンプレートでの配列の割り当て方法を制御できるため、ヒープに対しては正常に機能します。ただし、C++ に関する限り、クラスの実際のサイズはまったく変わりません。つまり、派生クラスのポインターでポインター演算を実行すると、間違った場所にスキップします。それが問題の1つです。

問題 2 は、スタックの配置です。スタック全体を 16 バイトでアラインされたポインターに直接強制する方法はないようです。

これらに影響を与える唯一のことは、vc++ および g++ コンパイラ固有の設定ですが、ここでの問題は、アライメントを常に手動で修正する必要がないことです。それは、苦痛は言うまでもなく、エラーが発生しやすいに違いありません。

ある種のスマート ポインターを作成することもできますが、それによってさらに多くの問題が発生します。

基本クラスだけを揃えると、子クラスも揃えられますか? もしそうなら、それは私の問題のほとんどを解決するでしょうが、そうであるとは思えません (私はこれを試してみます)。

4

3 に答える 3

3

基本クラスに特定のアラインメント要件がある場合、派生クラスは少なくともそのアラインメントを持ちます (独自のメンバーにより、より厳密なアラインメント要件が適用される可能性があります)。それ以外の場合、コンパイラは、基本メンバーへのアクセスがそれらの要件を満たすことを保証できませんでした。

ただし、スタック アラインメントのために移植可能にできることは実際には何もありません。これは、コンパイラとコンパイラのプラットフォーム ABI 要件によって完全に処理されます。ご指摘のとおり、コンパイラ オプションまたはプラグマを使用すると、ある程度の制御が可能になる場合がありますが、移植性はありません。

于 2009-11-07T07:40:24.327 に答える
0

PARISC HPUX でも同様の問題があり、アトミック コンストラクトは 4 バイトのアトミック クリアであり、16 バイトのアラインメントが必要でした。

次のように 4 バイトの量を宣言することで、ごまかすことができます。

struct Stupid_HPUX
{
   int 4byteLockWordInHere[4] ;
};

実行時に使用する適切なものを選択します。あなたの問題については、同様のことができます

ユニオン rawMemory
{
   int blah[(sizeof(yourtype) + 16)/4] ;
   char c[1] ;
} う;

次に、必要な場所を修正するために、実行時に決定されたアドレスで新しい配置を使用します。

于 2009-11-07T15:07:41.353 に答える