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

Rai*_*dex 2 c++ arrays vector memcpy

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

€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
Run Code Online (Sandbox Code Playgroud)

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

Fir*_*cer 5

vector 的内存可以安全复制吗?

是的,向量在这里没有任何特殊作用,元素的打包方式与数组的打包方式相同。您可以很容易地看到这一点,因为 saydata()返回一个指针,该指针可以作为数组([0]最多[myvec.size() - 1])访问,直到执行使该返回无效的操作(例如,破坏或调整向量的大小)。

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

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