c++11新特性自用,move,forward,引用传递,uint32_t

对于值传递和引用传递
并不是所有的函数传递都必须用引用, 如果传递的只是普通类型(int, char)最好就使用值传递,这样开销比引用小, 但是如果传递的是对象, STL容器等最好就是传递引用, 常量引用更好,也就是 const vector &a。

move的作用: move可以将左值转化为右值,进行一个资源的转移,但是我们需要确定这个左值,之后不会再次使用,我们才可以进行这个操作来提升性能。

string foo="abcd";
	vector<string>v;
	v.push_back(foo);
	cout<<foo<<endl;

输出abcd

string foo="abcd";
	vector<string>v;
	v.push_back(move(foo));
	cout<<foo<<endl;

此时无法输出,这个foo无法继续使用
其实move本身是一个强制转换,作用便是将左值转换为右值,并无神奇之处,进行转移的过程,其实是类本身里面写的移动构造函数起的作用,通过延长右值的生命周期,通过引用将资源给新的变量,实现一个浅拷贝过程。【move所做的就是接收lvalue或者rvalue参数,并在不触发复制构造的情况下将其作为右值返回】

如果 处理临时变量用右值引用T &&, 处理普通变量用const引用const T&…那么代码量就有些大,所以都可以有以下的forward完美转发。
上面说的各种情况, 包括传const T &, T &&, 都可以由以下操作代替:

template<typename T1, typename T2>
void set(T1 && var1, T2 && var2){
  m_var1 = std::forward<T1>(var1);
  m_var2 = std::forward<T2>(var2);
}

那么forward就是上面一系列操作的集大成者.
如果外面传来了rvalue临时变量, 它就转发rvalue并且启用move语义.
如果外面传来了lvalue, 它就转发lvalue并且启用复制. 然后它也还能保留const.


c/c++中为了方便程序的移植性 。往往不直接采用int、char等基本数据类型。
size_t 一般当作计数器,就是一个unsinged int的重定义. 如sizeof函数返回值类型即为size_t。在不同位的机器中所占的位数也不同,size_t是无符号数
C/C++用 typedef 把 size_t 作为 unsigned int或 unsigned long 的别名,可以简单的理解为size_t 有如下两种定义

typedef unsigned int size_t
thpedef unsigned long size_t12

size_t类型是一个类型定义,通常将一些无符号的整形定义为size_t,在使用 size_t 类型时,编译器会根据不同系统来替换标准类型。每一个标准C实现应该选择足够大的无符号整形来代表该平台上最大可能出现的对象大小。在使用 size_t 类型时,编译器会根据不同系统来替换标准类型
在32位机器中定义为:typedef unsigned int size_t; (4个字节)
在64位机器中定义为:typedef unsigned long size_t;(8个字节)
使用 size_t 来代替 int 或 unsigned 可以保证在同一个平台中,始终得到得到一个数据类型或变量的字节大小,保证了程序对该数据类型或变量的统计方式始终一致,不会因为平台的改变而出现错误。

int32_t, uint32_t等的区别,简单点就是有符号和无符号,后者表示的正数范围更大。
C语言的基本类型就char, short, int 等。在看其他源码时经常碰到int32_t, int8_t这种形式的定义,其实他们就是基本类型的typedef重定义。
也就是不同平台下,使用以下名称可以保证固定长度。
1字节 int8_t —— char
2字节 int16_t —— short
4字节 int32_t —— int
8字节 int64_t —— long long

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值