C ++向量类别定义

时间:2018-07-29 17:34:57

标签: c++

我只是从C ++开始,我正在努力阅读我正在研究的文章中的自定义矢量类中的一些代码。作者写为:

class vec3
{
 public:
  vec3() {}
  vec3(float e0, float e1, float e2)
  {
    e[0] = e0;
    e[1] = e1;
    e[2] = e2;
  }

(...)

但是到目前为止,我只看到了定义了它所保存的数据类型的类定义,例如:

class vec3
{
 public:
  float m_x;
  float m_y;
  float m_z;

  vec3(float x, float y, float z) : m_x(x), m_y(y), m_z(z)
  {}

我的猜测是,本文中的代码正在创建一个空向量,然后将其填充为浮点数,或者在定义中采用了某些假设。这仅仅是语法上的差异还是我缺少的更基本的东西?道歉,似乎是一个基本问题,但我找不到任何类似的问题。 。 。这可能太基本了!但是我只是想先理解它。

谢谢, 稻

2 个答案:

答案 0 :(得分:0)

在您发布的代码中,您正确地知道在任何地方都没有变量/system/lib/libcrypto.so的声明。我不确定这是否是因为您没有在书中发布那部分代码,还是为了简洁起见,书中省略了那一部分。

e不知道书作者的含义的情况下,我不想建议代码完成。可以声明e的几件事与您发布的代码兼容。

答案 1 :(得分:0)

  

它将e定义为浮点数组[e[3]]。

添加了此信息后,三个单独的成员与一个数组之间就没有相关的区别。最后,这两个变体将需要相同数量的内存,并且在大多数情况下,编译器生成的(优化!)代码将完全相同:

float getY()
{
    return m_y;
    // will result in address of object + offset to m_y
}

float getY()
{
    return e[1];
    // will result in address of object + offset to e + offset to second element
    // as both offsets are constant, they will be joined to one single summand
    // and we are back at first variant...
}

使用数组但不能使用单独的成员可以做的几件事之一就是循环,如下所示:

float magnitude()
{
    float sum = 0.0F;
    for(auto f : e)
        sum += f*f;
    return sqrtf(sum);
}

但是,对于这样的短循环,很可能会展开循环,并且再次生成的代码与单独的成员变量等效的可能性很高:

float magnitude()
{
    return sqrtf(m_x * m_x + m_y * m_y + m_z * m_z);
}

使用数组,您可以将一个参数中的所有三个成员传递给其他函数(作为指向第一个元素的指针),使用单独的成员,则必须将它们分别传递(嗯,有很多方法可以解决,但他们要么需要额外的努力,要么会变得“肮脏” ...)。