9

SSE 最適化メンバーを含むクラスでの 16 バイト アラインメントの問題を解決しようとしています (そして解決しました)。しかし、私を悩ませているのは、オンラインで見つけた例の大部分に、完全に冗長に見えるが多くの場所で繰り返されているコード行が含まれていることです。

public:
void* operator new (size_t size)throw (std::bad_alloc)
{
    void * p = _aligned_malloc(size, 16);
    if (p == 0)  throw std::bad_alloc();
    return p; 
}

void operator delete (void *p)
{
    Camera* pC = static_cast<Camera*>(p);
    _aligned_free(p);
}

問題の行は

Camera* pC = static_cast<Camera*>(p);

pC は決して参照されず、関数の最後で範囲外になるため、それを行うポイントは何ですか? 私は行を取り出してみましたが、まったく違いがないように見えますが、その行は多くの例に表示されます! 本当に明らかな何かが欠けているのでしょうか、それとも異常なコード行が盲目的に例から例へとコピーされ、多くの「チュートリアル」で流行していますか?

4

2 に答える 2

2

オブジェクトは、デストラクタに入るとすぐにその有効期間を終了するため、このポインタを使用して多くのことを行うことはできません。この行Camera* pC = static_cast<Camera*>(p);は安全に削除できます。この行がチュートリアルに存在する唯一の理由は、多くの人が実際にどのように機能するかを考えずに、あちこちにコードをコピー アンド ペーストするだけだからです。

あなたの意志のためのきれいで正しいコードは次のdelete()ようになります:

void operator delete (void *p)
{
    _aligned_free(p);
}
于 2012-07-25T10:07:23.427 に答える
0

あなたの質問に対する多くのコメントで説明されているように、次の行は実際には冗長です。

Camera* pC = static_cast<Camera*>(p);  // Just an unused variable

pが以前の型であったとしても(他の可能性は、、Camera*のようなサブクラスです)、は既に呼び出されているはずなので、 ではまだ多くのことを行うことはできません。その後に呼び出されます。Canon*Sony*Nikon*pCCamera::~Camera()operator delete

PS: ポインタを特定のクラスにキャストするような慣習には遭遇していませんが、チュートリアルでそのようなアドバイスに遭遇した場合は、それを変更することをお勧めします。

于 2012-07-25T09:54:17.810 に答える