当我将glm :: vec3 *转换为double *时会发生什么?

时间:2015-10-09 11:00:35

标签: c++ arrays casting glm-math

我正在尝试理解我提供的框架并慢慢调试它。在我的情况下,我有一个vec3数组,用指针记忆

vec3 *cx =....;

首先,每当我尝试通过调试检查glm :: vec3的内容时,我会看到许多值:x,r,s,y,g,t,z,b,p。我不知道为什么我有这些成员,根据文档我看到glm :: vec3是一个内部结构:

if(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW)
    value_type x, y, z;
elif(GLM_COMPONENT == GLM_COMPONENT_MS_EXT)
    union 
    {
        struct{value_type x, y, z;};
        struct{value_type r, g, b;};
        struct{value_type s, t, p;};
    };
 else//(GLM_COMPONENT == GLM_COMPONENT_GLSL_NAMES)
     union {value_type x, r, s;};
     union {value_type y, g, t;};
     union {value_type z, b, p;};
endif//GLM_COMPONENT

我不知道在我正在研究上面选择哪一个选项的巨大框架中的哪个位置。我不知道所有这些成员的意思。 我只知道通过调试我看到了所有这些值,但是,和其他vec3一样,我使用x,y,z值进行计算。 在此之后,我想知道如果我将一个vec3数组转换为双数组,实际会发生什么。在实践中:

double * cast = (double*)cx;

它给了我什么?

为了理解,我试图这样做:

vec3 boh(1.0);
vec3 boh2(2.0);
vec3 * try = new vec3[2];
try[0] = boh;
try[1] = boh2;
double* try2 = (double*)try;

我意识到尝试指向第一个vec3,即boh1,所以如果我去调试,我会看到所有x,r,s,y,g,t,z,b, p设为1.0。同样,try2应指向与boh1相关的“某事”,但调试显示try2的值为0.0078125018480932340。那么,究竟发生了什么?

1 个答案:

答案 0 :(得分:0)

正式地说,这是未定义的行为。这一切都取决于glm::vec3结构包含的内容。

我会参考glm reference pages。它们清楚地解释了glm::vec3是什么以及如何使用它。