我刚从VC++ 14.0(2015)编译器中的Bug中学到了什么?那个人不应该假设结构的布局最终会在内存中出现.但是,我不明白我见过很多代码中的常见做法.例如,Vulkan图形API执行以下操作:
定义结构
struct {
glm::mat4 projection;
glm::mat4 model;
glm::vec4 lightPos;
} uboVS;
Run Code Online (Sandbox Code Playgroud)
然后填补其领域:
uboVS.model = ...
uboVS....
Run Code Online (Sandbox Code Playgroud)
然后通过memcpy将结构(在主机内存中)复制到设备内存:
uint8_t *pData;
vkMapMemory(device, memory, 0, sizeof(uboVS), 0, (void **)&pData);
memcpy(pData, &uboVS, sizeof(uboVS));
vkUnmapMemory(device, memory);
Run Code Online (Sandbox Code Playgroud)
然后到GPU,它定义了一个UBO来匹配该结构:
layout (binding = 0) uniform UBO
{
mat4 projection;
mat4 model;
vec4 lightPos;
} ubo;
Run Code Online (Sandbox Code Playgroud)
然后,在GPU方面,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+中的第一个示例位域)
这个问题并不是特定于Vulkan或图形API,我很好奇人们可以假设什么,以及什么时候只使用结构作为一块内存.我理解结构打包和对齐,但还有更多吗?
谢谢