Могу ли я безопасно скопировать вектор <array>? - PullRequest
2 голосов
/ 20 января 2020

У меня есть vector<array<float,3>> для использования в качестве списка 3D-координат для моего рендеринга.
Могу ли я просто использовать memcpy с sizeof(array<float,3>) * vector.size() в качестве аргумента 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()

Ответы [ 3 ]

5 голосов
/ 20 января 2020

Безопасно ли копировать память вектора?

Да, вектор здесь не делает ничего особенного, и элементы будут упакованы так же, как и для массива , Это легко увидеть, потому что, скажем, data() возвращает указатель, доступ к которому можно получить как массив (от [0] до [myvec.size() - 1]) до тех пор, пока не будет выполнена операция, которая делает недействительным этот возврат (например, уничтожение или изменение размера вектора).

Я хочу, чтобы поплавки были плотно упакованы (поскольку они будут отправлены в графический процессор), позволяет ли это мне это сделать?

По сути, это означает, что тип, который вы храните в векторе , соответствует требованиям. (например, что вам на самом деле нужен формат RGB с 3-мя числами, а не один из целочисленных форматов или 4-элементный формат RGBA или RGBX). В зависимости от используемого вами API, вы, возможно, даже можете передать ему векторные данные напрямую, без копирования в отдельный массив (например, ID3D11Device::CreateBuffer занимает pInitialData, и если вы сохраняете правильный тип в векторе , вы можете просто установить pSysMem на myvector.data()).

4 голосов
/ 20 января 2020

array<float,3> легко копируется, vector.data() является непрерывным блоком, да, это безопасно для memcpy, но я бы посчитал это плохой практикой, надеюсь, у вас есть веская причина не передавать указатель, копировать вектор вместо необработанных данных или используйте std::copy вместо.

Чтобы проверить, можно ли копировать типы тривиально, вы можете использовать std :: is_trivially_copyable

2 голосов
/ 20 января 2020

Вы можете использовать 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
...