2016-06-23 19 views
4
struct Test { 
    void doAction() {} 
}; 

// Create and save into a void* 
void *ptr = new Test; 

// Real use through a Test* 
Test *t = static_cast<Test *>(ptr); 
t->doAction(); 

// Delete 
delete static_cast<Test *>(ptr); 

ptrはオブジェクトのアドレスを保存するためにのみ使用され、アドレスはオブジェクトの真のタイプに逆参照されます。厳密なエイリアシング規則でこれはいいですか?

したがって、関係のないタイプに逆参照されない限り、厳密なエイリアシングルールでも問題ありませんか?

+2

-fstrict-aliasingでGCCを使用してコンパイルします。 –

+4

はい、正しいタイプにキャストしている限り、問題ありません。さて、C++コードが(主に非同期コールバックで)Cコードと相互作用する場所の多くでこれが行われていることがわかります – Arunmu

答えて

5

厳密なエイリアシングは、ポインタ/参照によってオブジェクトにアクセスしようとしている場合にのみ適用されます。 void*でオブジェクトにアクセスしようとしていないので、厳密なエイリアシング規則は適用されません。ここで保護するルールは、という名前のルールで、ポインタを任意のタイプに変換してvoid*に戻すことができます。あなたがそれを元に戻すタイプは、正確には以前のタイプです)。

同様に、同じタイプのポインタはエイリアスできます。したがってtstatic_cast<T*>の結果はエイリアスすることが許可されているため、両方とも厳格なエイリアシングに違反しません。

関連する問題