C struct padding是否会使这种使用不安全?

Kom*_*ave 5 c memory size struct unions

假设我有一个结构,无论是联合还是其他:

    typedef struct {
        union {
            struct { float x, y, z; } xyz;
            struct { float r, g, b; } rgb;
            float xyz[3];
        } notAnonymous;
    } Vector3;
Run Code Online (Sandbox Code Playgroud)

我听说有些编译器通过创建字对齐边界来自动填充结构以增强性能.

据推测,这种协同作用意味着结构的大小不能保证是其组件字段大小的总和,因此xyzs下面的数组损坏和/或溢出发生了变化:

inline Vector3 v3Make(float x, float y, float z) { Vector3 v = {x,y,z}; return v; }
float xyzs[6];
*(Vector3*)&xyzs[3] = v3Make(4.0f,5.0f,6.0f);
*(Vector3*)&xyzs[0] = v3Make(1.0f,2.0f,3.0f);
Run Code Online (Sandbox Code Playgroud)

正确?

Car*_*rum 3

确实,编译器可以用它想要的任何类型的填充来放置我们的结构。在大多数编译器上,您可以使用#pragma packor__attribute__((packed))来避免填充。实际上,其中有三个 32 位字段,因此这可能不会成为问题。您可以通过使用sizeof结构类型或该类型的变量来检查并查看结果。

问题您试图将 a 分配Vector3float最后两行中的变量。这是不会被允许的。你可以侵入你想要做的事情:

*(Vector3 *)&xyzs[3] = v3Make(4.0f, 5.0f, 6.0f);
Run Code Online (Sandbox Code Playgroud)

但这看起来相当难看,更不用说令人困惑了。xyzs更改为数组Vector3而不是仅数组会好得多float