首页 > 解决方案 > 将数据从未对齐的结构数组移动到c ++中的对齐数组

问题描述

将数据从 CameraSpacePoint 数组移动到 PointXYZ 数组的最佳方法是什么?

struct CameraSpacePoint
{
    float X;
    float Y;
    float Z;
};

 __declspec(align(16))
 struct PointXYZ
 {
      float x;
      float y;
      float z;
 };

 constexpr int BIG_VAL = 1920 * 1080;

 CameraSpacePoint  camera_space_points[BIG_VAL];
 PointXYZ          points_xyz[BIG_VAL];

我的解决方案:

CameraSpacePoint* camera_space_points_ptr = &camera_space_points[0];
PointXYZ*         points_xyz_ptr          = &points_xyz[0];

for (int i = 0; i < BIG_VAL; ++i)
{
    memcpy(points_xyz_ptr++, camera_space_points_ptr++, sizeof(CameraSpacePoint));
}

这是最有效的方法吗?

标签: c++memoryoptimization

解决方案


与往常一样,可读性和可维护性胜过其他问题。写下你的意思,不要修复不是问题的东西:在优化之前测量。

std::transform(camera_space_points, std::end(camera_space_points), points_xyz,
    [](auto c){
        return PointXYZ{c.X, c.Y, c.Z};
    });

这是您应该始终默认编写的内容。通过他们的汇编输出快速基准测试,这几乎等同于memcpy版本。

更直观地说,优化器非常擅长对简单代码进行微优化,例如复制一大块内存,手动优化几乎没有更好的选择。


推荐阅读