Я только что узнал от Bug in VC++ 14.0 (2015) compiler?, что не следует делать предположения о том, как макет структуры окажется в памяти. Однако я не понимаю, как это распространено в большом количестве кода, который я видел. Например, Vulkan графики API выполняет следующие действия:Как нельзя делать предположения о структурах структуры C++?
Определяет STRUCT
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);
Затем, на GPU, он определяет UBO, чтобы соответствовать этой структуре ct:
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+assumptions+regarding+the+layout+of+structures+with+bit-fields)
Этот вопрос не относится к Vulkan или графическим API-интерфейсам, мне любопытно, что именно можно предположить и когда это просто использовать структуру как кусок памяти. Я понимаю структуру упаковки и выравнивание, но есть ли еще больше?
Благодаря
Нельзя использовать структуру для компилируемых доменов. Иногда это может работать некоторое время, но, делая привычку, вы, возможно, в конечном итоге должны много выполнять этот код, когда другие решения могут быть написаны один раз и не требуют регулярного обслуживания. если ваш план должен сделать это для обеспечения безопасности работы, вы можете попробовать это и посмотреть, насколько хорошо он работает для вас. –
Вы можете посмотреть [этот вопрос и ответ.] (Http://stackoverflow.com/questions/38428666/why-can-glbufferdata-buffer-structs-for-ubo-and-ssbo-when-c-does -not-define-s/38429253 # 38429253) –
Чтобы избежать предположений о макетах структуры, не используйте 'memcpy' в структурах (между прочим) –