我正在构建一个动态动画&渲染系统,我想用Boost.Units来表示物理量来获得很好的尺寸安全性。然而,我将不得不将数组的数量传递给对Boost一无所知的函数,例如:如何输入数字将数量数组加到底层类型?
OpenGL缓冲区填充命令。这些简单地取
const void *
,并期望在解引用它时找到一个float
或double
值的数组。他们读取数据。来自BLAS和LAPACK的不同实现的线性代数函数(例如
gemm
或gesv
)。这些通常将float *
或double *
作为给定的数组。他们都读取和写入数据。
我知道boost::units::quantity<U, T>
有const T& value()
构件给人以包含T
值直接引用访问。我还验证了boost::units::quantity<U, T>
是一个标准布局结构,只有一个非静态数据成员,类型为T
。
所以,让我们假设一个boost::units::quantity<U, T> q
,以下成立:
static_cast<const void*>(&q) == static_cast<const void*>(&q.value())
sizeof(q) == sizeof(T)
我的问题是:给出一个数组boost::units::quantity<U, T> a[100];
,是安全的:
将
&a[0].value()
传递给一个函数,该函数需要读取地址为?的地址为T
的100个对象的数组。通过
reinterpret_cast<T*>(&a[0])
函数将写入100个连续值类型T
在地址?
我深知这可能是未定义行为,但现在我必须遵循“实用性节拍纯洁” (1)原则。即使这是UB,它会做预期的事,还是会以不可预知的方式咬人?由于这可能是编译器特定的:我需要这个用于现代MSVC(来自VS 2015)。
如果这不安全,是否有办法真正安全地做到这一点? “this”指的是“使用OpenGL和带有C接口的数字加法器使用Boost.Units”,没有不必要地复制数据。
(1)从Zen of Python改编。
我想,你说UB你的意思是IB?因为没有人应该摆脱UB。 – sehe