c++ 一些顺手的优化机制

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来被其他方用的时候出现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值