可以将一个双重数组转换为由双精度数构成的结构体吗?
这将打印出"1 2 3"。但是它能保证在任何编译器上都能正常工作吗?
编辑:根据9.2.21:指向标准布局结构体对象的指针,经过适当的reinterpret_cast转换,指向其初始成员(...),反之亦然。
如果我用下面的代码替换我的代码:
那么它就能保证正常工作了,对吗?我知道很多人可能不觉得这样的代码美观,但是使用结构体来处理数据有其优势,不需要复制输入数组的数据。我可以在结构体中定义成员函数来计算标量和向量乘积、距离等,这样会使我的代码比使用数组更易于理解。
那么呢?
这个也保证能工作吗?或者编译器会在数据成员之后添加一些内容,使得 `sizeof(A) > 3*sizeof(double)`?有没有一种可移植的方法来防止编译器这样做?
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)`?有没有一种可移植的方法来防止编译器这样做?