gpt4 book ai didi

c++ - 将双数组转换为 double 结构

转载 作者:可可西里 更新时间:2023-11-01 16:04:40 26 4
gpt4 key购买 nike

可以将 double 组转换为由 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: A pointer to a standard-layout struct object, suitably converted ? using a reinterpret_cast, points to its initial member (...) and vice versa.

如果我用

替换我的代码
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";
}

那么它就可以保证工作了。正确的?我知道很多人不会觉得这种审美令人愉悦,但是使用结构并且不必复制输入数组数据是有好处的。我可以在该结构中定义成员函数来计算标量和 vector 乘积、距离等,这将使我的代码比使用数组更容易理解。

怎么样

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)?是否有任何可移植的方法来防止编译器这样做?

最佳答案

不,不能保证。

唯一禁止任何编译器在 xy 之间,或 yz 之间插入填充的东西是常识。任何语言标准中都没有禁止它的规则。

即使没有填充,即使A 的表示与double[3] 的表示完全相同,它仍然无效。该语言不允许您假装一种类型实际上是另一种类型。您甚至不允许处理 struct A { int i; 的实例。 }; 就好像它是一个 struct B { int i; };.

关于c++ - 将双数组转换为 double 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31082389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com