这是来自英特尔Embree code中的vec3fa.h。
struct __aligned(16) Vec3fa
{
typedef float Scalar;
enum { N = 3 };
union {
__m128 m128;
struct { float x,y,z; union { int a; float w; }; };
};
// other stuff in struct
};
外联盟在做什么?内心联盟对我来说更加神秘。 代码中永远不会引用a和w变量。
看起来这提供了一种方便,干净的方式来读取和写入具有适当别名的m128,x,y和z。它是如何工作的?
int是如何参与的?
答案 0 :(得分:6)
这些是anonymous unions(和结构)。他们所做的是定义结构或联合的匿名实例,并用于在访问成员时避免混乱。上面的代码与这个代码兼容:
struct __aligned(16) Vec3fa
{
typedef float Scalar;
enum { N = 3 };
union {
__m128 m128;
struct { float x,y,z; union { int a; float w; } u2; } s;
} u1;
// other stuff in struct
};
但现在成员访问更加复杂:
Vec3fa v; // offset from struct start ((char*)&member - (char*)&v):
v.u1.m128; // 0
v.u1.s.x; // 0
v.u1.s.y; // 4
v.u1.s.z; // 8
v.u1.s.u2.w; // 12
v.u1.s.u2.a; // 12
而不是库变体:
Vec3fa v; // offset from struct start ((char*)&member - (char*)&v):
v.m128; // 0
v.x; // 0
v.y; // 4
v.z; // 8
v.w; // 12
v.a; // 12
答案 1 :(得分:2)
int是如何参与的?
Intels Embree是一个光线跟踪内核库。在计算机图形学中,你可以想象有时需要使用4元素矢量来表示颜色和alpha,或者使用齐次坐标来表示位置。
https://en.wikipedia.org/wiki/RGBA_color_space https://en.wikipedia.org/wiki/Homogeneous_coordinates