计算c++11 lambada表达式的大小

lambada表达式是什么?

详解:lambada表达式详解

我们知道lambada其实是一个匿名函数 ,

它属于 可调用对象 类型。在 C++ 中,lambda 表达式会生成一个隐式定义的类,这个类重载了 operator(),使得该对象可以像函数一样被调用。 

虽然c++标准中lambada表达式并不是一个class,但是我们可以把lambada表达式看作是一个匿名类

检验:

我们通过is_class来判断(这是编译器隐式定义的类,并不代表lambada就是一个class)

#include <iostream>
using namespace std;int main() 
{int index = 10;int *p = &index;auto a = [ ]() {for (int i = 1; i <= index; i++) {cout << "hello world" << endl;}cout << *p << endl;};//cout << sizeof(a) << endl;if (std::is_class<decltype(a)>::value == true)  cout << "yes" << endl;return 0;
}

运行结果:

lambada表达式的大小

我们已经知道了lambada表达式是一个匿名类,那么我们就可以通过内存对齐来探讨lambada表达式的大小了

无捕获

auto a = []() {};
auto b = [](int k) {};
cout << sizeof(a) << endl;   //打印1
cout << sizeof(b) << endl;   //打印1

可以看到和形参无关,无捕获参数相当于一个空类的大小 

有捕获但未使用

int index = 10;
int *p = &index;
auto a = [=]() {};  //值捕获
auto b = [&]() {};  //引用捕获
cout << sizeof(a) << endl;  //打印1
cout << sizeof(b) << endl;  //打印1 

虽然捕获了外界所有对象但是并未使用,则还是空类的大小

有捕获且使用

#include <iostream>
using namespace std;int main() {int index = 10;int *p = &index;char ch = 'a';auto a = [ = ]() {cout << index;};   auto b = [&]() {cout << index;};auto c = [ = ]() {	cout << index << *p << endl;};auto d = [&]() {cout << index << *p << endl;};auto e = [&]() {cout << ch << endl;};cout << sizeof(a) << endl; //值捕获 使用int   打印4cout << sizeof(b) << endl; //引用捕获 使用int 打印8 cout << sizeof(c) << endl; //值捕获 使用int int* 内存对齐 打印16cout << sizeof(d) << endl; //引用捕获 使用 int int* 内存对齐 打印16cout << sizeof(e) << endl; //引用捕获 使用 char  打印 8return 0;
}

运行结果:

可以看出值捕获是都在我们认知之内,也就是和我们期望的相同。
引用捕获 使用int或者char 竟然也有8个字节 不难想到引用捕获的是地址, 而值捕获是拷贝的副本,
 

总结

引用捕获:实际是捕获对象的地址  计算大小是 使用参数指针的内存对齐后的大小
值捕获:捕获是拷贝的副本 计算大小时 遵循使用参数的内存对齐后的大小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARMv8-A MacOS调试环境搭建

文章目录 简介安装qemu交叉编译工具链C语言插件 gdb调试测试代码添加调试配置 JLink 调试树莓派 简介 本节主要介绍基于Visual Studio Code在MacOS下调试环境的搭建&#xff0c;Linux发行版上的过程也类型&#xff0c;它主要使用到以下工具链&#xff1a; aarch64 架构的交叉…

React - useActionState、useFormStatus与表单处理

参考文档&#xff1a;react18.3.1官方文档 一些概念&#xff1a; React 的 Canary 和 Experimental 频道是 React 团队用于发布和测试新功能的渠道。 useActionState useActionState 是一个可以根据某个表单动作的结果更新 state 的 Hook。 const [state, formAction, isPe…

解决docker拉取镜像失败问题

下载镜像 [roottest-server-01 ~]# docker pull nginx Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": read tcp 192.168.40.180:37356->54.227.20.253:443: read: connection reset by peer报错&#xff1a;E…

java Random随机数

Randoms是什么 在Java中&#xff0c;Random类是用于生成伪随机数的工具。它位于java.util包中。以下是一些使用Random类生成不同类型的随机数的方法&#xff1a; 1 创建 Random 类的实例 2 生成一个随机的int值&#xff08;范围从Integer.MIN_VALUE到Integer.MAX_VALUE&#…

ollama-webui - Ollama的ChatGPT 风格的 Web 界面

更多AI开源软件&#xff1a; 发现分享好用的AI工具、AI开源软件、AI模型、AI变现 - 小众AI小众AI&#xff1a;发现分享好用的AI工具、AI开源软件、AI模型。收录了AI搜索引擎&#xff0c;AI绘画工具、AI对话聊天、AI音频工具、AI图片工具、AI视频工具、AI内容检测、AI法律助手、…

【算法练习】852. 山脉数组的峰顶索引

题目链接&#xff1a;852. 山脉数组的峰顶索引 根据题目用复杂度用O(long n)的方法解决问题&#xff0c;我们可以想到用二分查找解决&#xff1a; class Solution { public:int peakIndexInMountainArray(vector<int>& arr) {int left0,rightarr.size()-1;while(left…

LLM - 多模态大模型的开源评估工具 VLMEvalKit 部署与测试 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144353087 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 VLMEva…

MySQL | 尚硅谷 | 第12章_MySQL数据类型精讲

MySQL笔记&#xff1a;第12章_MySQL数据类型精讲 文章目录 MySQL笔记&#xff1a;第12章_MySQL数据类型精讲第12章_MySQL数据类型精讲 1. MySQL中的数据类型2. 整数类型2.1 类型介绍2.2 可选属性2.2.1 M2.2.2 UNSIGNED2.2.3 ZEROFILL 2.3 适用场景2.4 如何选择&#xff1f;演示…

Java 文件IO

一、什么是文件IO 文件是一个广义的概念&#xff0c;操作系统将很多资源都抽象成文件&#xff0c;这篇文章讲解文件特指硬盘上的文件 在硬盘上存在很多文件和目录&#xff0c;它们以一种N叉树的结构存储 注意&#xff1a;文件夹也是一种文件&#xff0c;它是一种目录文件 二、…

Rnnoise和SpeexDsp两种降噪方式有什么区别?

在蒙以CourseMaker 7.0软件中&#xff0c;增加了两种降噪模式&#xff0c;一种是Rnnoise&#xff0c;一种是SpeexDsp&#xff0c;这两种降噪模式有什么区别呢&#xff1f; Rnnoise 基于神经网络。当噪声与 rnnoise 的模型训练的噪声匹配时&#xff0c;它的效果非常好。比如说&…

搭建Discuz论坛

lnmp l&#xff1a;linux操作系统 n&#xff1a;nginx前端页面 m&#xff1a;mysql数据库&#xff0c;账号密码等等都是保存在这个数据库里面 p&#xff1a;php------nginx擅长处理的是静态页面&#xff0c;页面登录账户&#xff0c;需要请求到数据库&#xff0c;通过php把动态…

鸿蒙分享(四):弹窗简单封装

代码仓库&#xff1a;https://gitee.com/linguanzhong/share_harmonyos 鸿蒙api:12 引用的harmony-utils地址&#xff1a;OpenHarmony三方库中心仓 引用的harmony-dialog地址&#xff1a;OpenHarmony三方库中心仓 引用的loading-dialog地址OpenHarmony三方库中心仓 import…

厦门凯酷全科技有限公司抖音电商服务的卓越典范

在短视频和直播带货迅速崛起的时代&#xff0c;厦门凯酷全科技有限公司&#xff08;以下简称“凯酷全科技”&#xff09;以其专业的服务、创新的精神以及对市场的深刻理解&#xff0c;在抖音电商领域中脱颖而出&#xff0c;成为众多品牌商家信赖的选择。本文将深入探讨凯酷全科…

扫二维码进小程序的指定页面

草料二维码解码器 微信开发者工具 获取二维码解码的参数->是否登陆->跳转 options.q onLoad: function (options) {// console.log("options",options.q)if (options && options.q) {// 解码二维码携带的链接信息let qrUrl decodeURIComponent(optio…

MitelMiCollab 身份绕过导致任意文件读取漏洞复现(CVE-2024-41713)

0x01 产品描述: Mitel MiCollab 是一个企业协作平台,它将各种通信工具整合到一个应用程序中,提供语音和视频通话、消息传递、状态信息、音频会议、移动支持和团队协作功能。0x02 漏洞描述: Mitel MiCollab 的 NuPoint 统一消息 (NPM) 组件中存在身份验证绕过漏洞,由于输入…

电子商务人工智能指南 6/6 - 人工智能生成的产品图像

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…

如何在 Ubuntu 上安装开源监控工具 Uptime Kuma

简介 Uptime Kuma&#xff08;或简称 Kuma&#xff09;是一个开源监控工具&#xff0c;用于监控 HTTP、HTTPS、DNS 等协议的服务。Uptime Kuma 提供多种功能&#xff0c;如多语言支持、多个状态页面、代理支持等。 接下来&#xff0c;我将一步一步教大家如何进行安装和部署&am…

国城杯2024——Curve

相关知识链接&#xff1a;https://tangcuxiaojikuai.xyz/post/187210a7.html #sagemath from Crypto.Util.number import *def add(P, Q):(x1, y1) P(x2, y2) Qx3 (x1*y2 y1*x2) * inverse(1 d*x1*x2*y1*y2, p) % py3 (y1*y2 - a*x1*x2) * inverse(1 - d*x1*x2*y1*y2, p…

第三部分:进阶概念 8.事件处理 --[JavaScript 新手村:开启编程之旅的第一步]

JavaScript 事件处理是 Web 开发中不可或缺的一部分&#xff0c;它允许开发者响应用户的交互行为&#xff08;如点击、键盘输入等&#xff09;或浏览器的行为&#xff08;如页面加载完成&#xff09;。通过事件处理&#xff0c;我们可以使网页更加动态和互动。以下是关于 JavaS…

STM32WB55 FUS烧录

FUS固件下载 Firmware Update Service&#xff08;FUS&#xff09;是一种用于在STM32WB微控制器上更新固件的功能。FUS下载是指通过FUS服务进行固件更新的过程。通过FUS下载&#xff0c;您可以通过无线方式将新的固件加载到STM32WB设备中&#xff0c;而无需使用传统的有线编程方…