您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > C/C++/C#

警惕 C++ 中的隐式类型转换

时间:2023-08-13 15:51:15  来源:  作者:漫漫开发路

今天文章的主题灵感来自客户的一个问题:

我在研究一个代码中的栈溢出问题。为了减小栈帧的大小,我尽可能多地删除了局部变量,但仍有很多栈空间无法解释。除了局部变量、参数、保存的寄存器和返回地址之外,栈上还有什么其他的东西呢?

我的回答是,嗯,还有结构化(SEH)的异常处理信息,但这通常不会占用太多栈空间,因此不会成为”大量”神秘栈使用的来源。

我的猜测是,代码正在生成大量大型 C++ 临时对象。请考虑以下程序片段:

有人会问了:”这段代码是如何编译的?函数Foo想要一个BigBuffer,而不是一个整数!” 然而编译它确实如此。

这是因为编译器使用 BigBuffer 构造函数作为转换器。换句话说,编译器插入了以下临时变量:

这样做是因为,只接受一个参数的构造函数有两个目的:它可以用作传统的构造函数(正如我们在 BigBuffer temp(3) 中看到的那样),或者它可以用来提供从参数类型到构造类型的隐式转换。在本例中,BigBuffer(int) 构造函数被用作从 int 到 BigBuffer 的转换。

若要防止这种情况发生,请使用 explicit 关键字:

通过此更改, 对 Foo(3) 的调用会引发编译器错误:

总结

通过今天的文章,我终于理解了在何种情况下需要在构造函数上加 explicit 。

你呢?

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

本文来自:《Beware the C++ implicit conversion》

 



Tags: C++   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
八个 C++ 开源项目,帮助初学者进阶成长
通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。1.ThreadPool一个简单的 C++1...【详细内容】
2024-03-22  Search: C++  点击:(21)  评论:(0)  加入收藏
为什么 Qt 成为 c++ 界面编程的第一选择
在C++界面编程的领域中,Qt一直是首选的框架之一,其强大的功能和广泛的应用使其成为开发者的不二选择。让我们深入探讨为何Qt能够如此成功,成为C++界面编程的瑰宝。1. 跨平台性:Q...【详细内容】
2023-12-13  Search: C++  点击:(204)  评论:(0)  加入收藏
深入学习 C++,内存管理
今天我们要学习内容是内存管理。学习任何编程语言都需要一定的时间和努力,对于C++也是如此。C++是一门功能丰富、底层控制能力强的编程语言,尤其适用于系统级开发、游戏开发、...【详细内容】
2023-12-12  Search: C++  点击:(184)  评论:(0)  加入收藏
解锁 C++ 并发编程的钥匙:探索 Atomic 变量
最近在用c++搞项目,因为多线程要做一个类似cnt的保护,今天学习了c++的原子操作。探索c++的原子类型std::atomic 类型是 C++ 提供的一种机制,用于实现多线程之间的安全共享数据...【详细内容】
2023-12-06  Search: C++  点击:(227)  评论:(0)  加入收藏
小心处理 C++ 静态变量中的陷阱
函数中的 static 变量static 变量的作用C++ 中 static 关键字的最后一个用途是在函数内创建局部变量,这些变量在其作用域内退出和进入时保持其值。函数内的 static 变量类似...【详细内容】
2023-12-03  Search: C++  点击:(188)  评论:(0)  加入收藏
深入理解 C++:extern 关键字的妙用与陷阱
extern 关键字定义和用法extern 关键字似乎应该是 static 的反义词,用于为其前面的名称指定外部链接,并且在某些情况下确实可以这样使用。例如,默认情况下,const 和 typedef 具...【详细内容】
2023-11-22  Search: C++  点击:(153)  评论:(0)  加入收藏
探索 C++20 的新领域:深入理解 static 关键字和核心语言特性测试宏
static 关键字(1) static 的多种用途在 C++ 中,static 关键字有几种看似无关的用途。为该关键字“过载”部分动机是为了避免在语言中引入新的关键字。(2) static 数据成员和...【详细内容】
2023-11-21  Search: C++  点击:(174)  评论:(0)  加入收藏
用 C++ 实现线性拟合
简介线性拟合是一种常见的数据分析方法,用于找到一条最佳拟合直线来描述数据点的趋势。在C++中,我们可以使用最小二乘法来实现线性拟合。最小二乘法是一种通过最小化残差平方...【详细内容】
2023-10-29  Search: C++  点击:(311)  评论:(0)  加入收藏
 C++ 实现线性拟合
简介线性拟合是一种常见的数据分析方法,用于找到一条最佳拟合直线来描述数据点的趋势。在C++中,我们可以使用最小二乘法来实现线性拟合。最小二乘法是一种通过最小化残差平方...【详细内容】
2023-10-29  Search: C++  点击:(212)  评论:(0)  加入收藏
为什么在 C++14 中删除了 get 函数?
C++14是C++编程语言的一个重要版本,它在语言特性和功能上进行了多项改进和扩展。然而,与此同时,C++14版本也删除了一些旧有的函数和特性,其中包括get函数。本文将深入探讨为何在...【详细内容】
2023-09-19  Search: C++  点击:(323)  评论:(0)  加入收藏
▌简易百科推荐
C++常见避坑指南
C++ 从入门到放弃?本文主要总结了在C++开发或review过程中常见易出错点做了归纳总结,希望借此能增进大家对C++的了解,减少编程出错,提升工作效率,也可以作为C++开发的避坑攻略。...【详细内容】
2024-04-03  腾讯技术工程    Tags:C++   点击:(4)  评论:(0)  加入收藏
C++ 之父反驳白宫警告:自诞生第一天起,C++ 的目标就一直是提高安全性
整理 | 郑丽媛上个月,美国白宫国家网络主任办公室(ONCD)在一份主题为《回到基础构件:通往安全软件之路》的 19 页 PDF 报告中,呼吁开发人员停止使用容易出现内存安全漏洞的编程语...【详细内容】
2024-03-25    CSDN  Tags:C++   点击:(4)  评论:(0)  加入收藏
八个 C++ 开源项目,帮助初学者进阶成长
通过参与或阅读开源项目的源代码,你可以获得丰富的实践机会。实际的项目代码比简单的教程更具挑战性,可以帮助你深入理解 C++ 的各种概念和技术。1.ThreadPool一个简单的 C++1...【详细内容】
2024-03-22  AI让生活更美好  微信公众号  Tags:C++   点击:(21)  评论:(0)  加入收藏
C# 中15个值得收藏的开源项目推荐
在开源的世界里,C# 编程语言也占有一席之地。这些开源项目涵盖了多个领域,从框架、库到工具,它们为C#开发者提供了丰富的资源和工具,帮助他们更高效地开发、测试和部署应用程序...【详细内容】
2024-03-20  程序员编程日记  微信公众号  Tags:C#   点击:(30)  评论:(0)  加入收藏
C#异步编程:Task.Run vs. async-await,掌握基础与高级用法
概述:C#中的异步编程有两主要方式:Task.Run用于在后台线程执行同步操作,而async-await更适用于清晰表达异步流程。基础用法展示了它们的简单应用,高级用法则演示了它们的结合使...【详细内容】
2024-03-09  架构师老卢  今日头条  Tags:C#   点击:(23)  评论:(0)  加入收藏
C++多线程编程:解锁性能与并发的奥秘
今天我们将深入探讨C++中的多线程编程,揭示多线程如何解锁性能潜力,提高程序的并发性能。什么是多线程?在计算机科学中,多线程是指一个进程(程序的执行实例)中的多个线程同时执行...【详细内容】
2024-02-03     AI让生活更美好  Tags:C++   点击:(69)  评论:(0)  加入收藏
C++代码优化攻略
今天我们将深入探讨C++性能优化的世界。在当今软件开发的浪潮中,高性能的代码是必不可少的。无论是开发桌面应用、移动应用,还是嵌入式系统,性能都是关键。1. 选择合适的数据结...【详细内容】
2024-01-26  AI让生活更美好  微信公众号  Tags:C++   点击:(114)  评论:(0)  加入收藏
C# 线程本地存储为什么线程间值不一样
为什么用 ThreadStatic 标记的字段,只有第一个线程拿到了初始值,其他线程都是默认值,让我能不能帮他解答一下,尼玛,我也不是神仙什么都懂,既然问了,那我试着帮他解答一下,也给后面类...【详细内容】
2024-01-26  一线码农聊技术  微信公众号  Tags:C#   点击:(67)  评论:(0)  加入收藏
C++质数检测器的设计与实现​
质数,作为数学中的一个基本概念,一直以其独特的性质吸引着众多研究者和爱好者。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的数。在实际应用中,质数检测也扮演着...【详细内容】
2024-01-15  鲨鱼编程  微信公众号  Tags:C++   点击:(111)  评论:(0)  加入收藏
C# 登顶!超越Java或非空想
整理丨诺亚出品 | 51CTO技术栈(微信号:blog51cto)近日,TIOBE编程社区公布年度编程语言,此次摘得这一桂冠的是C#。这也是C#在TIOBE二十多年评选历史中首次赢得这一年度大奖。C#虽...【详细内容】
2024-01-15    51CTO  Tags:C#   点击:(114)  评论:(0)  加入收藏
站内最新
站内热门
站内头条