我可以安全地复制矢量<array>吗?

Can I safely copy vector<array>?

本文关键字:array gt 安全 lt 复制 我可以      更新时间:2023-10-16

我有一个vector<array<float,3>>用作渲染的 3D 坐标列表。
我可以简单地使用带有sizeof(array<float,3>) * vector.size()的memcpy作为count参数吗? 矢量的记忆可以安全复制吗?

€dit:这是我的代码片段。 我的问题现在措辞有点错误。

vector<array<float,3>> vertexPositions;
//read VertexPositions, one line represents a vertex position and put them into vertexPositions with push_back();
D3D11_BUFFER_DESC bufferDesc;
//initialize Buffer Description;
D3D11_SUBRESOURCE_DATA bufferInitialData;
bufferInitialData.pSysMem = vertexPositions.data(); //pSysMem is a void* and expects a sequence of floats

pSysMem只是一个void*,结构有一个额外的大小参数,我将其设置为sizeof(array<float,3>) * vector.size()

矢量的内存可以安全复制吗?

是的,向量在这里不做任何特别的事情,元素的打包方式与数组相同。你可以很容易地看到这一点,因为假设data()返回一个指针,该指针可以作为数组访问(最多[0][myvec.size() - 1](,直到执行使该返回无效的操作(例如销毁或调整向量的大小(。

我希望浮标紧密包装(因为它们将被发送到 GPU(,这是否允许我这样做?

因此,这基本上意味着确保您存储在载体中的类型符合要求。(例如,您实际上想要 3 浮点 RGB 格式,而不是整数格式或 RGBA 或 RGBX 4 元素格式之一(。根据您使用的 API,您甚至可以直接为其提供矢量数据,而无需复制到单独的数组(例如ID3D11Device::CreateBuffer需要pInitialData,如果您在向量中存储正确的类型,则可以将pSysMem设置为myvector.data()(。

array<float,3>

是微不足道的可复制的,vector.data()是一个连续的块,是的,memcpy是安全的,但我认为这是不好的做法,我希望你有一个很好的理由不传递指针,复制向量而不是原始数据或使用std::copy

要检查类型是否易于复制,您可以使用 std::is_trivially_copyable

您可以使用std::array<float, 3> *,例如float[][3]的开头。您没有获取向量地址的其中之一。

std::vector<std::array<float,3>> vertexPositions;
//read VertexPositions, one line represents a vertex position and put them into vertexPositions with push_back();
D3D11_BUFFER_DESC bufferDesc;
//initialize Buffer Description;
D3D11_SUBRESOURCE_DATA bufferInitialData;
bufferInitialData.pSysMem = static_cast<void *>(vertexPositions.data()); //pSysMem is a void* and expects a sequence of floats