我只是从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)
{}
我的猜测是,本文中的代码正在创建一个空向量,然后将其填充为浮点数,或者在定义中采用了某些假设。这仅仅是语法上的差异还是我缺少的更基本的东西?道歉,似乎是一个基本问题,但我找不到任何类似的问题。 。 。这可能太基本了!但是我只是想先理解它。
谢谢, 稻
答案 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);
}
使用数组,您可以将一个参数中的所有三个成员传递给其他函数(作为指向第一个元素的指针),使用单独的成员,则必须将它们分别传递(嗯,有很多方法可以解决,但他们要么需要额外的努力,要么会变得“肮脏” ...)。