C++ programming

std::move()详解

Posted on:

std::move 是将对象的状态或所有权从一个对象转移到另一个对象。它的源码在 /usr/include/c++/11/bits/move.h : 以上代码中的 std::remove_reference 源码位于 /usr/include/c++/11/type_traits 从源码可以看出,std::move 并不移动任何东西,它只是一个强制类型转换,将一个左值引用强制转换为右值引用,以便于使一个右值引用能够指向该左值, 简单地说,move 相当于一个类型转换:static_cast<T&&>(lvalue)。 内存拷贝和内存搬运是一个即耗费时间又耗费空间的工作,c++ 11 中引入 std::move 以及 右值引用 都是为了避免拷贝内存或搬运内存以加快运行速度,提高程序效率。 std::move 将左值转换为右值从而避免了内存拷贝,本文开头所说的将对象的状态或所有权从一个对象转移到另一个对象,也只有转移没有内存拷贝,内存搬运。 需要强调的是,被 move 后的对象的状态是不确定的,在 C++ 标准中有如下描述: 17.6.5.15 Moved-from […]

C programming / C++ programming

左值引用和右值引用

Posted on:

引用在本质上是一个别名,可以通过引用修改变量的值,在函数传参时传引用可以避免拷贝以提高运算速度,其实现原理和指针类似。在 C++ 11 引入右值引用之前,所有引用都指的是左值引用: int x = 3, y = 5; int & ref = x; //正确 int & ref = 5; //编译失败, 左值引用不能指向右值 const int & r […]

C++ programming

C++ 中的左值和右值

Posted on:

左值和右值在 C++11 之后变得十分重要,它是理解 move/forward 等新语义的基础。 不能简单地从字面意义来理解,左值就是赋值号 “=” 左边的值, 右值就是赋值号 “=” 右边的值。 2. 左值可以出现在赋值号的右边作为右值来使用,只有可修改的左值(modifiable)可以被赋值,也就是可以出现在赋值号左边。 例如 x = y; 数组名是不可修改的左值。下面代码中数组名 arr 不可被修改,所以 arr = &x 错误。 右值只能出现在赋值号右边, 3 = 5, […]

C programming

C 语言中的变参数函数

Posted on:

如果你曾经使用过 C 语言编程,你可能想知道标准函数如 printf() 和 scanf() 如何在函数调用中接受可变数量的参数。这些能够接受可变数量参数的函数被称为变参函数。 你可能会时不时地需要编写一个变参函数,标准库 <stdarg.h> 可以帮助你编写自己的变参函数。 例如下图所示,如果你需要一个能够对 n 个数字进行求和的函数,其中 n 可以是大于1的任意数字,你可能不想编写多个求和函数,而是在这种情况下需要一个变参函数。 int sum_of_ 2_ numbers(int x, int y) { return x+y; } int sum_of_ […]