【发布时间】:2015-09-13 22:49:52
【问题描述】:
可以将双精度数组强制转换为双精度结构吗?
struct A
{
double x;
double y;
double z;
};
int main (int argc , char ** argv)
{
double arr[3] = {1.0,2.0,3.0};
A* a = static_cast<A*>(static_cast<void*>(arr));
std::cout << a->x << " " << a->y << " " << a->z << "\n";
}
这打印出1 2 3。但它是否保证每次都能与任何编译器一起工作?
编辑:根据
9.2.21:指向标准布局结构对象的指针,经过适当转换?使用 reinterpret_cast,指向其初始成员 (...),反之亦然。
如果我用
替换我的代码struct A
{
double & x() { return data[0]; }
double & y() { return data[1]; }
double & z() { return data[2]; }
private:
double data[3];
};
int main (int, char **)
{
double arr[3] = {1.0,2.0,3.0};
A* a = reinterpret_cast<A*>(arr);
std::cout << a->x() << " " << a->y() << " " << a->z() << "\n";
}
那么它保证工作。正确的?我知道很多人不会觉得这种美学上令人愉悦,但是使用结构并且不必复制输入数组数据是有优势的。我可以在该结构中定义成员函数来计算标量和向量积、距离等,这将使我的代码比使用数组更容易理解。
怎么样
int main (int, char **)
{
double arr[6] = {1.0,2.0,3.0,4.0,5.0,6.0};
A* a = reinterpret_cast<A*>(arr);
std::cout << a[0].x() << " " << a[0].y() << " " << a[0].z() << "\n";
std::cout << a[1].x() << " " << a[1].y() << " " << a[1].z() << "\n";
}
这是否也可以保证工作或者编译器可以在数据成员之后放置一些东西以便sizeof(A) > 3*sizeof(double)?是否有任何可移植的方式来防止编译器这样做?
【问题讨论】:
-
任何人都可以编写编译器,所以这是一个棘手的问题。为什么不指定您要使用的编译器?我的猜测是所有主要的编译器都处理这个问题并且它确实有效。
-
由于data structure alignment,很可能不会(如果您不仅想在那里使用双倍的话)
-
你违反了严格的别名规则。
标签: c++ arrays struct language-lawyer static-cast