当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2023-08-14 22:01:02 646观看
导读今天文章的主题灵感来自客户的一个问题:我在研究一个代码中的栈溢出问题。为了减小栈帧的大小,我尽可能多地删除了局部变量,但仍有很多栈空间无法解释。除了局部变量、参数、保存的寄存器和返回地址之外,栈上还有什么其他

今天文章的主题灵感来自客户的一个问题:Fxk28资讯网——每日最新资讯28at.com

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

我的回答是,嗯,还有结构化(SEH)的异常处理信息,但这通常不会占用太多栈空间,因此不会成为”大量”神秘栈使用的来源。Fxk28资讯网——每日最新资讯28at.com

我的猜测是,代码正在生成大量大型 C++ 临时对象。请考虑以下程序片段:Fxk28资讯网——每日最新资讯28at.com

Fxk28资讯网——每日最新资讯28at.com

有人会问了:”这段代码是如何编译的?函数Foo想要一个BigBuffer,而不是一个整数!” 然而编译它确实如此。Fxk28资讯网——每日最新资讯28at.com

这是因为编译器使用 BigBuffer 构造函数作为转换器。换句话说,编译器插入了以下临时变量:Fxk28资讯网——每日最新资讯28at.com

Fxk28资讯网——每日最新资讯28at.com

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

若要防止这种情况发生,请使用 explicit 关键字:Fxk28资讯网——每日最新资讯28at.com

Fxk28资讯网——每日最新资讯28at.com

通过此更改, 对 Foo(3) 的调用会引发编译器错误:Fxk28资讯网——每日最新资讯28at.com

Fxk28资讯网——每日最新资讯28at.com

总结

通过今天的文章,我终于理解了在何种情况下需要在构造函数上加 explicit 。
你呢?Fxk28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-5714-0.html警惕 C++ 中的隐式类型转换

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 让我们一起聊一聊反射

下一篇: Go的Net/Http有哪些值得关注的细节?

标签:
  • 热门焦点
Top