execl函数的参数指针需要释放怎么办_c++智能指针的一些小心思(包括std::move和std::forward完美转发)...

当涉及到函数的参数传递时,如果十分在乎性能,可以选择不用shared_ptr<>,因为引用计数涉及到原子操作会耗费性能。

当表示所有权的转移时,可以使用unique_ptr作为函数的参数。

正是因为c++11的右值引用和move语义,才给了c++创造智能指针的条件。std::move实际上就是将左值转化为右值引用&&,其实就是一个static_cast<T&&>. 当用 = 等于号赋值的时候,因为右边的值是一个右值引用类型,所以左边的对象在构造时,会选择重载了 = 号的移动构造函数,而不是拷贝构造函数。而这个类的移动构造函数和拷贝构造函数,很明显都需要你自己来写。(标准库的那些类模板当然都已经写好了)

enable_shared_from_this 的作用是在类的内部返回指向自身的智能指针,这通常是不可避免的。具体的用法是,用自己的类Fuck继承这个std::enable_shared_from_this<Fuck>,然后在类自身的成员函数内部,调用shared_from_this(),此函数将返回一个shared_ptr<Fuck>,他的作用在于和外部的share_ptr<Fuck>共享引用计数。为啥不直接shared_ptr<Fuck>(this),因为那样是两个非共享的引用计数在管理同一个对象,很容易自杀......

unique_ptr不允许拷贝构造,只允许移动构造。那为什么函数能够返回一个unique_ptr呢?因为按照常理来说,函数返回值的时候,必然会创造一个临时变量,也就是会涉及到新对象的构造和析构。但是c++允许编译器针对这种情况进行优化,称为RVO和NRVO,返回值优化和具名返回值优化。当函数返回值的时候,首先尝试move构造,如果不行,再copy构造,再不行就报错了。

c++11并没有引入make_unique,虽然vs2013编译器早就实现了make_unique,但是在以c++11为标准的编译器里该怎么实现呢?

template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args )
{
    return std::unique_ptr<T>( new T( std::forward<Args>(args)... ) );
}

说说完美转发 std::forward

和std::move无条件转换成右值引用不同的是,std::forward正如他的翻译一样,他将完美的保存参数的当前语义并“转发”到别的地方去。就如同上面 make_unique 的实现。注意,理解这个 std::forward 的同时,需要注意一个很重要的概念,那就是两个&连在一起,形如&&这样的符号,并不总是代表着右值引用,他跟 T&& 在一起的时候(通常作为函数参数),意义是“万能引用”。既可以接受一个左值引用&,也可以接受右值引用&&。接下来想,当传入函数的参数是一个右值,而你要在函数内使用此参数时,必定会被转换成左值(因为你用了个形参来接收他),也就是这时候这个参数丢失了他本身的语义。那怎么办呢,还好有std::forward来擦屁股,他的作用就是“完美”的保持这个参数的语义。其实保持lvalue还是rvalue只是一个作用,像上面代码这样,我不知道这个参数是啥的时候,就直接forward转发就行。也许知道std::move的你会问为什么需要完美转发,我用std::move(fuckxxx)当参数传入构造函数不就行了?有一说一,确实...问题就是你不知道....你什么也不知道,甚至连参数是几个都不知道,你还怎么转,所以大部分情况下,编写模板时,比如库作者用这些会比较多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值