Я только что узнал от Ошибка в компиляторе VC ++ 14.0 (2015)? что не следует делать предположений о том, как макет структуры окажется в памяти. Однако я не понимаю, насколько это обычная практика во многих кодах, которые я видел. Например, графический API Vulkan выполняет следующие действия:
Определяет структуру
struct {
glm::mat4 projection;
glm::mat4 model;
glm::vec4 lightPos;
} uboVS;
Затем заполняет свои поля:
uboVS.model = ...
uboVS....
Затем просто копирует структуру (в памяти хоста) в память устройства через memcpy:
uint8_t *pData;
vkMapMemory(device, memory, 0, sizeof(uboVS), 0, (void **)&pData);
memcpy(pData, &uboVS, sizeof(uboVS));
vkUnmapMemory(device, memory);
Затем, переходя к графическому процессору, он определяет UBO, соответствующий этой структуре:
layout (binding = 0) uniform UBO
{
mat4 projection;
mat4 model;
vec4 lightPos;
} ubo;
Тогда на стороне графического процессора ubo всегда будет соответствовать uboVS.
Это такое же неопределенное поведение? Разве этот код не полагается на то, что структура uboVS должна быть выложена точно так, как определено, или на обе стороны (скомпилированный код C ++ и скомпилированный шейдер SPIR-V), чтобы в основном генерировать один и тот же другой макет структуры? (аналогично первому примеру в https://www.securecoding.cert.org/confluence/display/c/EXP11-C.+Do+not+make+assumings+regarding+the+layout+of+структуры+с+битовымиполями)
Этот вопрос не относится к Vulkan или графическим API, мне любопытно, что именно можно предположить и когда можно просто использовать структуру как кусок памяти. Я понимаю упаковку и выравнивание структур, но есть ли что-то еще?
Спасибо
memcpy
в структурах (среди прочего) - person M.M   schedule 30.08.2016