memcpy的pod结构数组到数组

use*_*335 2 c++

struct Point
{
    double X;
    double Y;
};
Run Code Online (Sandbox Code Playgroud)

Q1)是以下便携式(编译器/机器)

Point point = { 1.1, 2.2 };
double arr[2] = {};
memcpy(arr, point, sizeof(double)*2);
Run Code Online (Sandbox Code Playgroud)

Q2)结构数组相同

Point *pPoints = new Point[numPoints];
double *pArr = new double[2*numPoints];
memcpy(pArr, pPoints, sizeof(double)*2*numPoints);
Run Code Online (Sandbox Code Playgroud)

在Windows/MSVC上,我期待两者都能成功.

编辑:我不是为每个可能的结构/类别问这些问题; 我要求结构"Point"的这种特殊情况(注意:只有2个pod,没有virtualmember/user构造函数/用户构造函数).这可能是一个C问题,它与编译器的结构对齐和内存布局有关.

到目前为止,我已经知道c/c ++标准没有对Point的布局强制执行任何操作,因此我必须使用静态断言来确保它,对吗?

mah*_*mah 8

您的代码假设为sizeof(struct Point) == 2*sizeof(double);.这是一个危险的假设,因为当你编写和测试代码时它会成立,但运气真实,而不是定义.运气有跑出去的习惯:)

最有可能在这种情况下你永远不会有问题(因为定义struct Point不太可能改变,机器对齐问题也不太可能在这种类型的可移植性).话虽如此,基于代码的代码是一种可怕的模式.