小编Has*_*iri的帖子

如何不对C++结构布局做出假设?

我刚从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,我很好奇人们可以假设什么,以及什么时候只使用结构作为一块内存.我理解结构打包和对齐,但还有更多吗?

谢谢

c++ struct structlayout vulkan

5
推荐指数
2
解决办法
322
查看次数

标签 统计

c++ ×1

struct ×1

structlayout ×1

vulkan ×1