IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> C++匿名表达式实现原理 -> 正文阅读

[游戏开发]C++匿名表达式实现原理

匿名函数是一种函子(functor),什么是 functor ?

According to Wikipedia, A function object or usually referred to as a functor is a construct that allows an object to be called as if it were an ordinary function.

functor 是一个函数对象,其成员函数重载了 () 算符,因此其能够像普通函数调用一样调用其成员函数

使用functor相比普通函数有什么优势?

One example of the advantages of using a functor over an ordinary function is that it can access the internal member variables and functions of that object.

使用functor 比普通函数的优势在于其可以访问内部成员变量(),通常这些成员变量可以用来保存上下文(context),而使用普通函数则需要定义全局变量才可以做到。

有了functor ,为什么还需要匿名函数?

匿名函数相比显示的定义一个类并重载其() 算符,代码编写显然要简单的多,且代码可读性更强。无需繁琐的重新定义一个类。

匿名函数是如何实现的?

当我们定义一个匿名函数时,可以看成是编译器在生成代码的时候帮我们内部定义了一个类,并重载了() 算符,因此可以看成是编译器帮我做了这些工作。利用 cppinsights.io 可以查看匿名函数的实现代码

比如当值拷贝捕获时

int v = 10;
auto f = [v](){
  return v + 1;
};

其对应的编译器生成代码为

int v = 10;
    
  class __lambda_8_14
  {
    public: 
	    inline /*constexpr */ int operator()() const
	    {
	      return v + 1;
	    }
    
    private: 
	    int v;
    
    public:
	    __lambda_8_14(int & _v) : v{_v} {}
  };

可以看到当定义一个匿名函数时,编译器为其创建了一个类,并重载了() 算符,

需要注意的是上述int operator()() 默认为const类型,即无法在该函数中修改捕获的变量(成员变量),需要加上mutable关键字来去除const限制 如下

int v = 10;
auto f = [v]() mutable {
  return v++;
};

再比如引用捕获

int v = 10;
auto f = [&v, a=1](){
  return 0;
};

对应为

class __lambda_8_14 {
    public: 
	    inline /*constexpr */ int operator()() const
	    {
	      return 0;
	    }
    
    private: 
	    int & v;
	    int a;
    
    public:
	    __lambda_8_14(int & _v, const int & _a) : v{_v}, a{_a}{}
  };

如下为捕获的所有可选项

[]	Capture nothing (or, a scorched earth strategy?)
[&]	Capture any referenced variable by reference
[=]	Capture any referenced variable by making a copy
[=, &foo]	Capture any referenced variable by making a copy, but capture variable foo by reference
[bar]	Capture bar by making a copy; don't copy anything else
[this]	Capture the this pointer of the enclosing class

参考链接

  1. https://towardsdatascience.com/c-basics-understanding-lambda-7df00705fa48
  2. https://cppinsights.io/
  3. https://www.cprogramming.com/c++11/c++11-lambda-closures.html
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 22:09:00  更:2022-03-13 22:09:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/23 23:05:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计