1. 返回值优化RVO
例如下面的两种返回的实现机制:
方式A:
V3D V3D::add(const V3D &a)
{
V3D r;
r.x = x + a.x;
r.y = y + a.y;
r.z = z + a.z;
return r;
}
方式B:
V3D V3D::add(const V3D &a)
{
return V3D(x + a.x, y + a.y, z + a.z);
}
方式B只会调用一次构造函数,但是上面的方式A要调用构造,复制和析构函数。此方式可以推广到很多形式,而且事实上好处还不止如此。原理是(return location): V3D(x + a.x, y + a.y, z + a.z);这个表达式建立了一个临时对象,而函数就直接把他返回咯(inline操作也是一种可选的办法)
参见 <<More Effective C++>> https://www.safaribooksonline.com/library/view/more-effective-c/9780321545190/
2. 返回"有效"的引用
V3D& Mat3D::pos()
{
m_pos.setTo(10,11,13);
return m_pos;
}
上面的代码中的 m_pos是类成员变量。所以可以返回它的引用,但是在使用的时候要注意用引用来存放返回值,代码:
V3D& pos = mat.pos();
否则很可能出现拷贝构造的消耗。这里的pos引用实际上不会影响m_pos的析构。所以不要用指针存放就好。
3. 使用 SIMD 优化,例如
#include <emmintrin.h>
union simdT
{
float arrF4[4] = {4.0f, 16.0f, 64.0f, 256.0f };
__m128 m128;
};
simdT ta;
simdT tb;
tb.m128 = _mm_sqrt_ps(ta.m128);
4.可以看看这篇文章
5. 注意 cpu调度 cache line 的机制
6. VS中子类中重新override的函数调用父类中的在cpp文件中显示定义的内联成员函数会报对应函数符号找不到的问题。然后将内联函数显示的在.h文件中实现,这时候就没有报上述错误。然后在将代码还原为 cpp文件中显示定义的内联 的形式,后面编译和运行都没问题(debug与release都 OK)。有点神奇。具体有什么操作能造成相关的影响呢?可能就是在使用子类的地方也include了父类的.h文件。但是我将其注释掉之后,依然是OK的。上述问题是发生在我把所述的程序当做static lib来被其他方用的时候出现的。