高效的swap

原始版本:

template<typename T>
void swap(T& a, T& b)
{
    T tmp(a);
    a = b;
    b = tmp;
}

此版本不重视效率,当交换的两个对象比较大时,需要更高效的交换,因此应该提供1)public swap成员函数,让它高效的置换两个对象,并提供nono-member swap,调用之

///////////////////////////////////////////////////////////////////////////////
//
//  FileName    :   swap_item25.h
//  Version     :   0.10
//  Author      :   Ryan Han
//  Date        :   2013/07/26 13:13:55
//                    2013/10/30 08:27:50
//  Comment     :
//    ½«WidgetÉùÃ÷Ò»¸öswapµÄpublicº¯Êý×öÕæÕýµÄÖû»¹¤×÷£¬È»ºó½«std::swapÌØ»¯
///////////////////////////////////////////////////////////////////////////////

#ifndef _SWAP_ITEM25_H_
#define _SWAP_ITEM25_H_

#include <iostream>
using namespace std;

class WidgetImpl {
    public:
        WidgetImpl(int a = 1, int b = 2, int c = 3);
        /*WidgetImpl(int a = 1, int b = 2, int c = 3) : x(a), y(b), z(c){
            cout << "WidgetImpl constructor called." << endl;
        }*/

        ~WidgetImpl(){
            cout << "WidgetImpl de-constructor called." << endl;
        }

        void WidgetPrint(){
            cout << "x = " << x << " y = " << y << " z = "<< z << endl;
        }
    private:
        int x, y, z;
};

class Widget {
    public:
        Widget(int a = 1, int b = 2, int c = 3) : pImpl(new WidgetImpl(a, b, c)){
            cout << "Widget constructor called." << endl;
            ;
        }

        ~Widget(){
            cout << "Widget de-constructor called." << endl;
            delete pImpl;
        }

        Widget(const Widget& rhs) {
            pImpl = new WidgetImpl(*(rhs.pImpl));
        }

        Widget& operator=(const Widget& rhs){
            *pImpl = *(rhs.pImpl);
        }

        void WidgetPrint(){
            pImpl->WidgetPrint();
            //non friend class can‘t access private data
            //cout << (*pImpl).x << endl;
        }

        //has to use because only member function could access private member pImpl
        void swap(Widget& other){
            using std::swap;
            swap(pImpl, other.pImpl);
        }
    private:
        WidgetImpl* pImpl;
};

//inline to avoid duplicate definition
//http://www.cnblogs.com/dracohan/p/3401660.html
namespace std {
    template <>
    inline void swap<Widget>(Widget& a, Widget& b){
        cout << "specialized swap was called" << endl;
        a.swap(b);
    }
}

#endif
///////////////////////////////////////////////////////////////////////////////
//
//  FileName    :   swap_item25.cpp
//  Version     :   0.10
//  Author      :   Ryan Han
//  Date        :   2013/07/26 13:13:55
//                    2013/10/30 08:27:50
//  Comment     :
//
///////////////////////////////////////////////////////////////////////////////

#include "swap_item25.h"
#include <iostream>
using namespace std;

WidgetImpl::
WidgetImpl(int a, int b, int c) : x(a), y(b), z(c){
            cout << "WidgetImpl constructor called." << endl;
        }
///////////////////////////////////////////////////////////////////////////////
//
//  FileName    :   swap_item25.cpp
//  Version     :   0.10
//  Author      :   Ryan Han
//  Date        :   2013/07/26 13:13:55
//                    2013/10/30 08:27:50
//  Comment     :
//
///////////////////////////////////////////////////////////////////////////////

#include "swap_item25.h"
#include <iostream>
using namespace std;

int main()
{
    Widget a;
    Widget b(4,5,6);

    a.WidgetPrint();
    b.WidgetPrint();

    swap(a, b);

    a.WidgetPrint();
    b.WidgetPrint();

    int* pinta = new int(5);
    int* pintb = pinta;

    cout << "*pinta is: " << *pinta << endl;
    cout << "*pintb is: " << *pintb << endl;

    return 0;
}

高效的swap

时间: 2025-01-06 18:48:32

高效的swap的相关文章

【原创】C++之自定义高效的swap(1)

1 问题背景 当交换两个包含了指针成员的类,我们最想看到的是直接交换其指针.但是当我们调用std::swap标准库这个模板函数时,通常它都会复制3个指针指向的对象作为交换所用,缺乏效率.如下: 1 namespace std{ 2 template<typename T> 3 void swap(T& a, T& b) //std::swap的典型实现 4 { 5 T temp(a); //一次拷贝,两次赋值 6 a = b; 7 b = temp; 8 } 9 } 上面的代码

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

swap() 函数实现的方法

swap()函数总结: 一.利用临时变量 1.引用(交换任意类型) template <typename T> void swap(T& x,T& y) { T tmp; tmp = y; y = x; x = tmp; } 2.泛型指针() void swap(void* a,void* b ) { int tmp; tmp = y; y = x; x = tmp; } 二. 不用临时变量交换 1.数学运算 1)乘 void swap (int& x,int&

Effective C++ 条款25

考虑写出一个不抛出异常的swap函数 本节讲解如何自定义一个高效的swap函数 对于std名空间中的swap缺省函数如下所示 namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp; } } class WidgetImpl{ public: -- private: int a,b,c; //数据很多,复制意味时间很长 std::vector<double>

Effictive C++知识点复习

1.尽量以const.enum.inline替换#define或者宁可以编译器替换预处理器eg:#define NUM_RATIO 1.653由于NUM_RATIO在编译器开始处理源码之前都被预处理器移走,因而当常量在编译时出错,只会提示到1.653.对于程序员并不知道1.653在哪个文件中存放.故追踪会浪费时间.即所使用的名称并未进入记号表中.解决方法:用一个常量替换上面的宏const double NumRatio = 1.653;注意:两个常量定义时的写法2.若在头文件定义一个常量的字符串

linux kernel如何处理大端小端字节序

最近在做将kernel由小端处理器(arm)向大端处理器(ppc)的移植的工作,现在kernel进入console稳定工作,基本工作已经完成,不过移植中有很多心得还是需要总结下,今天先将kernel对于大小端字节序的处理来总结下. 之前写过大小端字节序的思考,文章链接地址:http://blog.csdn.net/skyflying2012/article/details/42065427. 根据之前的理解,字节序可以认为是处理器主观的概念,就像人如何去看待事物一样,处理器分大端和小端,对于内存

linux kernel 如何处理大小端

暂时在用MPC8309,不太清楚大小端内核是什么时候给转的. 今天看了关于readl和writel具体实现的文章 今天就主要来分析下readl/writel如何实现高效的数据swap和寄存器读写.我们就以readl为例,针对big-endian处理器,如何来对寄存器数据进行处理. kernel下readl定义如下,在include/asm-generic/io.h #define readw(addr) __le32_to_cpu(__raw_readw(addr)) __raw_readl是最

swap function &amp; copy-and-swap idiom

在C++中,众所周知在一个资源管理类(例如含有指向堆内存的指针)中需要重新定义拷贝构造函数.赋值运算符以及析构函数(Big Three),在新标准下还可能需要定义移动构造函数和移动赋值运算符(Big Five).但实际上,这条规则还可以有一个小扩展.就是在资源管理类中,往往需要重新定义自己的swap函数来作为优化手段. 1. swap函数 首先考察如下例子,假设类HasPtr中含有一个指向string的指针 *ps 和一个int类型值value. class HasPtr { public: .

CAS(Compare And Swap)分析

CAS(Compare And Swap)指的是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令.这个指令会对内存中的共享数据做原子的读写操作. 简单介绍一下这个指令的操作过程:首先,CPU会将内存中将要被更改的数据与期望的值做比较.当这两个值相等时,CPU才会将内存中的数值替换为新的值,否则便不做操作.最后,CPU 会将当前变量的真实值返回.这一系列的操作是原子的. CAS是一种乐观锁的思路,它相信在它修改之前,没有其它线程去修改它.而synchronized是一种悲观锁,它认