Ho valori interi che vengono utilizzati per accedere ai dati in archivi dati non collegati, ad esempio, handle. Ho scelto di avvolgere gli interi in una struttura per avere oggetti fortemente tipizzati in modo che i diversi numeri interi non possano essere mescolati. Sono, e devono essere, POD. Questo è quello che sto usando:L'accesso alla matrice della struttura POD come matrice del suo singolo membro viola l'aliasing rigoroso?
struct Mesh {
int handle;
};
struct Texture {
int handle;
};
ho array di queste maniglie, come ad esempio: Texture* textureHandles;
.
A volte ho bisogno di passare una serie di maniglie come int*
a più parti generiche del codice. In questo momento sto utilizzando:
int* handles = &textureHandles->handle;
che richiede essenzialmente un puntatore al primo elemento della struct e lo interpreta come un array.
La mia domanda è fondamentalmente se questo è legale, o se viola il rigoroso aliasing per manipolare int* handles
e Texture* textureHandles
puntando alla stessa memoria. Penso che questo dovrebbe essere consentito poiché il tipo sottostante (int
) è accessibile allo stesso modo in entrambi i casi. La prenotazione che ho è legata al fatto che accedo a più strutture prendendo l'indirizzo di un membro all'interno di una struttura.
Come un'estensione alla mia prima domanda, sarebbe il seguente essere ok?
int* handles = reinterpret_cast<int*>(textureHandles);
Si desidera utilizzare le strutture per ottenere tipi forti e quindi si desidera castare il tipo per ottenere int. Hai il peggio di entrambi i mondi. –
@NeilKirk Solo le funzioni molto specifiche useranno array int * grezzi. Il resto utilizzerà le strutture digitate. Sono semplicemente lì per evitare errori quando si usano le maniglie nel caso generale. – rasmus
Penso che dovresti dirci di più sul tuo progetto attuale in quanto il tuo design è molto strano. –