| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Item 5: Prefer auto to explicit type declarations. -> 正文阅读 |
|
[大数据]Item 5: Prefer auto to explicit type declarations. |
这次是对 Effective Modern C++ Item 5 的学习笔记。 C++ 显示声明可能会产生例如变量未初始化、申明类型冗长、无法形成闭包、截断等问题,通过使用 auto 可以很好解决这些问题。 避免变量未初始化
x1 未初始化,其值可能是未定义的,这导致程序中可能隐藏着 bug。使用 auto 声明的变量未初始化将导致编译报错。 简化变量申明考虑下面的代码,通过解引用迭代器初始化局部变量:
使用 auto 简化上述代码:
申明闭包类型在 Item 2 中介绍过 auto 可以通过类型推到得到实际的类型,考虑下面的代码片段:
C++14 lambda 函数参数也可以使用 auto,代码简化如下:
使用 auto 的 derefLess 是一个闭包类型。也可以使用 std::function 得到闭包类型:
auto 申明的持有闭包的变量和闭包有相同的类型,并且仅使用闭包需要的内存大小。而 std::function 声明持有闭包的变量有一个固定大小内存,一旦内存大小不足,则需要申请堆内存来存储闭包。因此, std::function 申明的对象要比 auto 申明的对象占更多的内存,由于约束内嵌的使用和提供间接函数的调用,通过 std::function 对象来调用一个封装体比通过 auto 对象要慢。也就是说,std::function 方法通常体积比 auto 大且慢,还有可能导致内存不足的异常。 避免类型截断auto 还有一个避免内存截断的优点,考虑下面的代码片段:
v.size() 返回类型是 std::vector::size_type ,一个无符号整数类型,很多程序员可能会写出上面的代码。std::vector::size_type 在 32 位机器上是 4个字节,但在 64 位机器上则为 8 字节,但是 unsigned 固定为 4 字节。上面的代码在 32 位机器上运行没有什么问题,但移植到 64 位机器上则会导致类型截断的问题。 避免类型不匹配auto 还具有一个非常隐蔽的效果,看下面的代码:
看上去没有什么问题?我们很有可能写出以上的迭代代码,但是 unordered_map 的 key 是 const的,即 hash map 中 std::pair 的类型是 std::pair<const std::string, int>。下面的代码将产生编译报错:
不知道这个隐蔽的背景知识的情况下,使用 auto 替代则会避免上述问题:
上面介绍了几条使用 auto 的优势, 使用 auto 也有 Item 2 和 Item 6 介绍的使用陷阱,但是可以通过 Item 4 介绍的一些方法可视化其类型推导结果,auto 还是非常值得使用的。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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年11日历 | -2024/11/24 13:54:53- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |