18年7月5日

1、linux下查看可执行文件大小的命令

 ls -lh 文件名
 du -h 文件名

需要记下的一个数据,可以后面用到

435M ScenesServer
254M SessionServer

2、继承的优缺点

优点
1、新的实现很容易,因为大部分是继承而来的 
2、很容易修改和扩展已有的实现 
缺点
1、打破了封装,因为基类向子类暴露了实现细节,高耦合。 
2、白盒重用,因为基类的内部细节通常对子类是可见的 
3、当父类的实现改变时可能要相应的对子类做出改变 
4、不能在运行时改变由父类继承来的实现

何时考虑使用继承:
1、子类是一种特殊的类型,与父类是"is a"的关系,而不只是父类的一个角色。
2、子类的实例不需要变成另一个类的对象。
3、子类扩展,而不是覆盖或者使父类的功能失效

3、继承与组合的区别

优点:
1、不破坏封装,整体类与局部类之间松耦合,彼此相对独立。
2、当前对象只能通过所包含的那个对象去调用其方法,所以所包含的对象的内部细节对当前对象时不可见的
3、当前对象可以在运行时动态的绑定所包含的对象。可以通过set方法给所包含对象赋值

4、shared_ptr的实现和优缺点

//优点就不细说了,主要是不用手动释放内存,方便使用
//缺点,1、性能,使用了计数器,2、存在循环引用的问题,3、类型转换麻烦

//循环引用问题
class B;
class A
{
public:// 为了省去一些步骤这里 数据成员也声明为public
    shared_ptr<B> pb;
    void doSomthing()
    {
    }

    ~A()
    {
        cout << "kill A\n";
    }
};

class B
{
public:
    shared_ptr<A> pa;
    ~B()
    {
        cout <<"kill B\n";
    }
};

int main(int argc, char** argv)
{
    shared_ptr<A> sa(new A()); //
    cout << "sa.use_count():" << sa.use_count() << endl;
    shared_ptr<B> sb(new B());
    cout << "sb.use_count():" << sb.use_count() << endl;
    if(sa && sb)
    {
        sa->pb=sb;
        sb->pa=sa;
    }
    cout<<"sa use count:"<<sa.use_count()<<endl;
    cout<<"sb use count:"<<sb.use_count()<<endl;
    return 0;
}

所以在使用基于引用计数的智能指针时,要特别小心循环引用带来的内存泄漏,循环引用不只是两方的情况,只要引用链成环都会出现问题。当然循环引用本身就说明设计上可能存在一些问题,如果特殊原因不得不使用循环引用,那可以让引用链上的一方持用普通指针(或弱智能指针weak_ptr)即可。
其实在项目的代码中有一例子,GateUser跟GatewayTask关联了,就是连接socket在被放入zOkay线程之前,会实例化GateUser,并且会互相指向对方成员中指针,如果使用shared_ptr就有问题了

void GatewayTask::addToContainer()
{
    pUser = new GateUser(this->accid, this);
    //GateUser下面是有个GatewayTask *gatewayTask;
    //GatewayTask下面有个GateUser *pUser;
    //全部省略
}   

5、设计模式举一例

6、快排
快排是一种交换排序,思想是,对一个序列arr,首先是要确定一个枢轴,首先随机的认为arr[pivotkey] = arr[0],一趟排序是附设两个指针low和high,它们的大小分别为0和arr.size() - 1,首先从high所指的位置开始查找第一个小于pivotkey位置的元素,并且和prvotkey交换,然后low向前查找第一个大于arr[pivotkey],并且交换,重复直到low == high位置,算法如下:

//确定枢轴
int Partition(std::vector<int> &arr, int low, int high)
{
    if(arr.empty())
        return 0;
    int pivotkey = 0;
    while(low <= high)
    {
        while(low < high && arr[high] >= arr[pivotkey])
            --high;
        arr[low] = arr[high];
        while(low < high && arr[low] <= arr[pivotkey])
            ++low;
        arr[high] = arr[low]; 
    }
    arr[low] = arr[pivotkey];
    return low;
}

//快速排序
void QuickSort(std::vector<int> &arr, int low, int high)
{
    if(arr.empty())
        return;
    int pivotkey = 0;
    while(low < high)
    {
        pivotkey = Partition(arr, low, high)
        QuickSort(arr, low, pivotkey - 1);
        QuickSort(arr, pivotkey + 1, high);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值