【嵌入式八股4】C++:引用、模板、哈希表与 I/O

1. 左值引用与右值引用

左值与右值的定义

  • 左值:指那些可以在表达式后取得地址的对象。换句话说,左值代表一个可以出现在赋值号(=)左边的值,也可以被修改。例如,变量、数组元素、以及通过引用或指针访问的对象都属于左值。

    例如:int a = 10; 其中 a 是左值。

  • 右值:指那些无法在表达式后取得地址的临时对象或字面量。右值代表一个临时值,它只能出现在赋值号的右边,不能直接修改。常见的右值包括数字常量、字符串常量、临时变量、以及通过表达式返回的临时对象。

    例如:int a = 10; 其中 10 是右值。

右值引用与 C++11

C++11引入了右值引用的概念,使用 && 来表示右值引用,允许程序员更方便地操作右值并实现移动语义完美转发

int&& r = 42; // 创建一个右值引用

2. 移动语义与完美转发

移动语义

std::move 是一个函数模板,它将给定的对象转换为右值,通常用于表示移动而非复制对象的所有权。通过 std::move,我们可以避免昂贵的对象复制操作,从而提高程序的性能。

int main() {
    std::vector<int> source = {1, 2, 3, 4, 5};

    // 使用std::move将source的所有权转移到destination
    std::vector<int> destination = std::move(source);

    // source现在为空,已经移动到destination
    std::cout << "Size of source: " << source.size() << std::endl; // 输出 0
    std::cout << "Size of destination: " << destination.size() << std::endl; // 输出 5

    return 0;
}

完美转发

std::forward 是另一个函数模板,主要用于在函数参数转发时保持其原始类型。与 std::move 类似,但 std::forward 可以根据传入的参数类型(左值或右值)自动转发。

在模板函数中,std::forward 使得我们能够精确地转发参数,保持参数的类型和生命周期,从而避免不必要的拷贝操作。

// 接受右值引用的函数
void processValue(int&& x) {
    std::cout << "Processing rvalue: " << x << std::endl;
}

// 使用std::forward转发参数
template<typename T>
void forwardFunction(T&& arg) {
    processValue(std::forward<T>(arg)); // 完美转发
}

int main() {
    int value = 42;

    // 传递左值
    forwardFunction(value);

    // 传递右值
    forwardFunction(std::move(value));

    return 0;
}

std::forward 的优势

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式八股/模拟面试拷打 文章被收录于专栏

一些八股模拟拷打Point,万一有点用呢

全部评论
接好运
点赞 回复 分享
发布于 02-28 16:13 陕西
接好运
点赞 回复 分享
发布于 03-06 20:01 山东

相关推荐

03-01 14:10
门头沟学院 C++
本人intj,倾向于创新性和策划类工作26届一本软件工程目前进度:C++,qt和opengl学了一个月的样子,基本知识学得差不多了,但是学的都是很基础的东西,大概轮廓的样子,不是很多。目前打算找开源项目学习一下,准备再过半个月找相关实习。AIGC其实去年就在关注了,但是当时感觉资源很少,暂时搁浅。最近感觉相关资源多了很多。但是目前进度为0。目前观望的是图形视频生成,stablediffusion,midjourney等。(AI)产品经理,想过这方面,但是现在还不太了解这个职位,还有需要什么项目经验,而且听说很吃学历和实习经历。个人想法/纠结点:1.其实我对c++那方面不是很感兴趣,后续还要继续背八股和算法题,个人感觉是有点痛苦的。但其实我对高数,线代等学科分数都是90+,个人感觉还是可以,但是实践到代码(刷leetcode或者写项目等)上还是感觉有点难受的。本人耐心也不是很够,debug挺难受。(不过这个在学纯后端的时候比较明显,现在学qt方面好很多)2.沉没成本高。原计划打算3月中旬前开始找C++实习。计划是春招找一段实习,秋招找二段。如果我现在打算重新学AIGC这个领域预计会耗费我半个月~一个月的时间。也许会错过春招。3.个人觉得兴趣很重要。想看什么职位适合我,我也感兴趣,其实某种程度两者也是相辅相成的。自我评价,审美能力和创造创新能力和策划规划能力可能算我的优势吧。#计算机专业# #编程#&nbsp;&nbsp;#计算机# #ai# #图形学# #如何一边实习一边秋招# #C# #无实习如何秋招上岸# #春招启动,你开始投递了吗?# #实习好累,可以辞职全力准备秋招吗# #牛客创作赏金赛# #ai智能作图# #牛客AI配图神器#
点赞 评论 收藏
分享
02-25 10:29
已编辑
门头沟学院 Java
奇瑞 底盘研发 7500左右
点赞 评论 收藏
分享
头像
02-21 16:31
长沙理工大学
大家好,今天分享一个很贴合目前校招时间段的提问:Up你好,本人双非本科大四,软件工程专业。大学前两年因为感觉前端好学,岗位也多选择学习前端。但那时比较懒散,课也多,所以前端也没有学多好。后来互联网寒冬,觉得出去不好找工作。就在大三下开始准备考研,但在去年10月份放弃考研(因为家里的一些事故,一个半月没有复习考研),处理好后,剩70多天感觉考不上值得上的学校。所以干脆准备就业,但感觉前端这个方向特别凉,于是换成了Linux&nbsp;c++方向(为此拒绝了一个前端实习)10月底到现在复习了c语言,学习了C++语法,特性,包括STL这些。学习了Linux系统编程进程线程,网络编程tcp/udp,多路转接,l...
牛客230000345号:毕业入坑两年,提点参考的东西吧,建议边找边备研,学历才是第一生产力,后期如果你要职业发展,这是最基本的几个了,工作和晋升除了项目经验,不就是比的派个人学历、吹牛能力和一堆头衔了(晋升的话,派系很重要)。 工作方面,不了解服务端,但是你可以看招聘,其实相比来说qt在客户端和服务端都可以用到,而且跨平台兼容性好,而且qt不就是c+++吗(学好c++,用哪个框架都不头痛),qt不只是给你个UI界面,封装的很多东西都是可以借鉴的。看你想去哪个城市,现在长沙软件行情不好,真心建议没上岸可以去深圳看看,长沙这边工资对标深圳砍半(眼泪流下来),长沙不少大一点私企面试的也开始卷学历卷项目(双非泪奔),如果想去国企你要能吹当然也可以(其实国企也就那12%的公积金了,并不稳定,但是稳定穷是肯定的)。 想去好一点的,建议把基础打牢,学历一定要提高(长期发展一定要,国内还是不少地方学历论的),如果有实习期建议能参与公司项目就参与,不然只会被拷打,最好从项目或者demo里把设计模式、指针、特性、模板、多线程实现并发并行、通讯协议、数据库这些基本的学会一部分,建议再学学qml和Linux,最好学一点嵌入式(Linux用在嵌入式板挺多的),掌握一门脚本语言(Python,Python,Python)和git或者svn代码管理,没签合同(不是三方),你还是校招生,校招只有一次(当然也可以说是本科一次,硕士一次,博士一次),用了错过就没有了,好多公司最喜欢招应届生了,一张白纸(又便宜又容易被PUA)。 最后,其实纠结这么多,不如第一份工作就选你最喜欢的编程语言、框架和操作系统,反正都是牛马,也不一定只吃一家喂的草
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务