2016-06-23 4 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 wird nur zum Speichern der Adresse des Objekts verwendet, und die Adresse wird nur zum wahren Typ des Objekts dereferenziert.Ist das mit der strengen Aliasing-Regel in Ordnung?

Also, es sei denn, es ist auf einen nicht verwandten Typ dereferenziert, ist es ok mit der strengen Aliasing-Regel?

+2

Kompilieren mit GCC mit -Fstrict-Aliasing –

+4

Ja, es ist in Ordnung, solange Sie wissen, dass Sie in richtigen Typ Casting sind. Abgesehen davon würden Sie feststellen, dass dies an vielen Stellen geschieht, an denen C++ - Code mit C-Code interagiert (hauptsächlich bei asynchronen Callbacks). – Arunmu

Antwort

5

Striktes Aliasing wird nur angewendet, wenn Sie versuchen, über einen Zeiger/Verweis auf das Objekt zuzugreifen. Sie versuchen nicht, über eine void* auf das Objekt zuzugreifen, so dass die strenge Aliasing-Regel nicht einmal gilt (die Regel, die Sie hier schützt, ist die Regel static_cast, die es ermöglicht, einen Zeiger auf einen beliebigen Typ zu void* und zurück, so zu konvertieren Solange der Typ, den Sie zurückgeworfen haben, ist genau der Typ, den es vorher war).

In ähnlicher Weise dürfen Zeiger auf denselben Typ einen Aliasnamen haben. So dürfen t und das Ergebnis static_cast<T*> alias werden und damit beide strengen Aliasing nicht verletzen.

Verwandte Themen