Sto costruendo un'animazione dinamica & sistema di rendering e vorrei usare Boost.Units per rappresentare le grandezze fisiche per ottenere la bella sicurezza dimensionale. Tuttavia, dovrò passare le matrici di quantitativi attorno a funzioni che non sanno nulla Boost, quali: comandi tampone riempimentoCome digitare-pun Aumentare le matrici di quantità per il tipo sottostante?
OpenGL. Questi semplicemente prendono uno
const void *
e si aspettano di trovare un array di valorifloat
odouble
durante il dereferenziamento. Leggono i dati.Funzioni di algebra lineare (come
gemm
ogesv
) da diverse implementazioni di BLAS e LAPACK. Questi in genere prendono unofloat *
odouble *
in un determinato array. Entrambi leggono e scrivono sui dati.
so che boost::units::quantity<U, T>
ha un membro const T& value()
che dà accesso diretto riferimento al T
valore contenuto. Ho anche verificato che uno boost::units::quantity<U, T>
è una struttura di layout standard con esattamente un membro di dati non statici, di tipo T
.
Quindi, supponiamo che per un boost::units::quantity<U, T> q
, vale quanto segue:
static_cast<const void*>(&q) == static_cast<const void*>(&q.value())
sizeof(q) == sizeof(T)
La mia domanda è: dato un array boost::units::quantity<U, T> a[100];
, è sicuro:
Passa
&a[0].value()
a una funzione che prevede di leggere un array di 100 oggetti di tipoT
all'indirizzo?Passa
reinterpret_cast<T*>(&a[0])
a una funzione che scriverà 100 valori sequenziali di tipoT
all'indirizzo?
Sono ben consapevole che questo è probabilmente un comportamento indefinito, ma adesso devo seguire la "praticità batte purezza" (1) principio. Anche se questo è UB, è quello che farà la cosa prevista o morderà in modi imprevisti? Dal momento che questo potrebbe essere specifico per il compilatore: ho bisogno di questo per MSVC moderno (da VS 2015).
E se questo non è sicuro, c'è un modo per farlo in modo sicuro? Con "questo" che si riferisce a "utilizzando Boost.Units con OpenGL e con crunchers di numeri che hanno solo un'interfaccia C," senza copia dei dati inutilmente.
(1) Adattato dal Zen of Python.
Penso dove dici UB vuoi dire IB? Perché nessuno dovrebbe mai scrollarsi di dosso UB. – sehe