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)
正确?
确实,编译器可以用它想要的任何类型的填充来放置我们的结构。在大多数编译器上,您可以使用#pragma packor__attribute__((packed))来避免填充。实际上,其中有三个 32 位字段,因此这可能不会成为问题。您可以通过使用sizeof结构类型或该类型的变量来检查并查看结果。
问题是您试图将 a 分配Vector3给float最后两行中的变量。这是不会被允许的。你可以侵入你想要做的事情:
*(Vector3 *)&xyzs[3] = v3Make(4.0f, 5.0f, 6.0f);
Run Code Online (Sandbox Code Playgroud)
但这看起来相当难看,更不用说令人困惑了。xyzs更改为数组Vector3而不是仅数组会好得多float。
| 归档时间: |
|
| 查看次数: |
276 次 |
| 最近记录: |