【发布时间】:2015-02-15 16:59:30
【问题描述】:
我有以下课程:
class SSVec
{
public:
float values[8];
}
我有一个对象SSVec obj,我将float* 指针obj.values 传递给另一个函数。在代码的其他地方,我得到了这个 float* 指针,然后将它转换回 SSVec* 指针。
这可能以 C++ 标准定义的行为方式吗?大多数情况下,这将适用于静态转换,但我的猜测是它实际上是未定义的行为。
原因是float* 指针被传入和传出一个DLL,它对SSVec 一无所知。我保证传递的指针总是指向一个 SSVec::value[8] 对象成员。
该类可能更复杂,但它不派生自任何东西,没有虚函数,并且仅包含 POD 类型。 values是第一个成员
问题可以重新表述:通过static_cast,类地址和第一个成员地址是否保证相同?
【问题讨论】:
-
它是可能没有未定义的行为,但仅限于一些非常有限的情况。其中一种受限情况是,如果
SSVec是 POD 类型,那么您可以从指针中减去values成员的偏移量。 -
这是
std::array<float,8>的重新实现吗? -
@leemes : 大致但带有 SSE/AVX 内在优化。
-
@leemes :另外,它必须通过混合编译器的 DLL 边界