[C++] 编程实践之1: Google的C++代码风格4:来自Google的奇技

使用匿名binder实现client向server端的死亡通知 匿名binder的一个常见使用场景分析。 阅读详情

##来自Google的奇技
  Google用了很多自己实现的技巧/工具使C++代码更加简装,我们使用C++的方式可能和你在气他地方见到的有所不同。
###所有权与智能指针

动态分配出的对象最好有单一且固定的所有主(owner),且通过智能指针传递所有权(ownership)。

定义:

  • 所有权是一种登记/管理动态内存和其它资源的技术。动态分配出的对象的所有主是一个对象或者函数,后者负责确保当前者无用时就自动销毁前者。所有权有时候可以共享,那么就由最后一个所有主来负责销毁它。甚至也可以不同共享,在代码中直接把所有权传递给其它对象。
  • 其实您可以把智能指针当成一个重载了*和->的“对象”来看。智能指针类型被用来自动化所有权的登记工作,来确保执行销毁义务到位。std::unique_ptr是C++11新推出的一种智能指针类型,用来表示动态分配出的对象的“独一无二”的所有权;当std::unique_ptr离开作用域,对象就会被销毁。不能复制std::unique_ptr,但是可以把它移动给新所有主。std::shared_ptr同样表示动态分配对象的所有权,但是可以被共享,也可以被复制;对象的所有权由所有复制者共同拥有,最后一个复制者被销毁时,对象也会随着被销毁。

优点:

  • 如果没有清晰、逻辑条理所有权安排,不可能管理好动态分配的内存。
  • 传递对象的所有权,其开销比复制来的小,如果可以复制的话。
  • 传递所有权也比“借用”指针或者引用来的简单,毕竟它大大省去了两个用户一起协调对象生命周期的工作。
  • 如果所有权逻辑有条理,有文档且不乱来的话,可读性很棒。
  • 可以不用手动完成所有权的登记工作,大大简化了代码,也免去了一大波错误之烦恼。
  • 对于const对象来说,智能指针简单易用,也比深度复制高效。

缺点:

  • 不得不用指针(不管是智能指针还是原生指针)来表示和传递所有权。指针予以可要比值语义复杂得多了,特别实在API里:你不仅要操心所有权,还要顾及别名,生命周期,可变性(mutability)以及其它大大小小的问题。
  • 其实值语义的开销经常被高估,所以就所有权的性能来说,可不能光只考虑可读性以及复杂性。
  • 如果API依赖所有权的传递,就会害得客户端不得不用单一的内存管理模型。
  • 销毁资源并回收的相关代码不是很明朗。
  • std::unique_ptr的所有关传递原理是C++11的move语法,后者毕竟是刚刚刚推出的,容易迷惑程序员。
  • 如果原本的所有权设计已经够完善了,那么若要引入所有权共享机制,可能不得不重构整个系统。
  • 所有有关共享机制的登记工作在运行时进行,开销可能相当不小。
  • 某些极端情况下,所有权被共享的对象永远不会被销毁,比如引用死循环(cyclic reference)。
  • 智能指针并不能够替代原生指针。

决定:

  • 如果必须使用动态分配,倾向于保持分配者的所有权。如果其他地方要使用这个对象,最好传递它的拷贝,或者传递一个不用改变所有权的指针或者引用。倾向于使用std::unique_ptr来明确所有权传递,例如:
std::unique_ptr<Foo> FooFactory();
void FooConsumer(std::unique_ptr<Foo> ptr);

避免使用共享所有权。如果对性能要求很高,并且操作的对象是不可变的(比如说std::shared_ptr),这时可以用共享所有权来避免昂贵的拷贝操作。如果确实要使用共享所有权,倾向于使用std::shared_ptr。

  • 不要在新代码中使用"scoped_ptr ‘’,除非你必须兼容老版本的C++,总是用std::unique_ptr代替std::auto_ptr。

###cpplint

使用cpplint.py检查风格错误。

cpplint.py是一个用来分析源文件,能够检查出多种风格错误的工具。它并不完美,甚至还会漏报和误报,但它仍然是一个非常有用的工具。在行尾加 // NOLINT,或者上一行加 // NOLINTNEXTLINE,可以忽略报错。
  某些项目会指导你如何使用他们的项目工具运行cpplint.py。如果你参与的项目没有提供,你可以单独下载cpplint.py。

###总结

  1. 把智能指针当成对象来看待的话,就很好领会它与所指对象之间的关系了。
  2. 原来Rust的Ownership思想是受到了C++智能指针的很大启发。
  3. scoped_ptr和auto_ptr已经过时,现在是shared_ptr和unique_ptr的天下了。
  4. 按本文来说,似乎除了智能指针,还有气他所有权机制,值得留意。
  5. Arch Linux用户注意了,AUR有对cpplint打包。
C++:C++代码风格指南--Google(未完待续) 所谓「前置声明」(forward declaration)是类、函数和模板的纯粹声明,没伴随着其定义. 阅读详情

相关推荐

cpplint.py文件

cpplint.py 是一个用来分析源文件, 能检查出多种风格错误的工具. 它不并完美, 甚至还会漏报和误报, 但它仍然是一个非常有用的工具. 在行尾加 // NOLINT, 或在上一行加 // NOLINTNEXTLINE, 可以忽略报错.

clang-tidy

clang-tidy 使用

Accowo的博客 5719

机器学习第四个算法ANN(人工神经网络)

我是在14年9月刚读研的时候听到一个说法叫“类人脑算法”很火热,之后搞了很长一段时间相关的蓄水池算法等,但大都没有摸到门路而中途放弃了。现今看来,还是缺少一些知识背景,也不善于在网络上学习,随时间推移,也逐渐明白这是机器学习的一小部分,并且逐渐发展的名称叫做人工神经网络的算法,如果网络层较多,又会有个别名,叫做深度学习。其中个用到的最著名的算法是背向传输算法(backpropagation),而这个

legalhighhigh的博客 1万+

Python Coala库:代码质量检查与自动化修复的利器

更多Python学习内容:ipengtao.com在软件开发过程中,代码质量至关重要。高质量的代码不仅易于维护和扩展,还能减少错误和提升效率。为了确保代码质量,我们常常需要依赖代码分析工具。Python的Coala库就是这样一个强大的工具,它能够帮助开发者进行代码质量检查和自动化修复。Coala库简介Coala是一个多语言的代码分析工具,它通过可扩展的插件体系结构支持各种语言的代码检查和修复。无论...

GitHub_miao的博客 512

手把手教你用ROS2控制PX4无人机画个圆:从C++代码到Gazebo仿真全流程解析

本文详细解析了如何使用ROS2控制PX4无人机实现圆形轨迹飞行,涵盖从C++代码编写到Gazebo仿真的全流程。重点介绍了Offboard模式下的控制算法实现、圆形轨迹生成的数学原理,以及解决通信延迟和坐标系转换等常见问题的实用技巧。通过实战案例,帮助开发者快速掌握无人机轨迹跟踪仿真的核心技术。

weixin_30839881的博客 95

ch32v103xx 烧写

烧写方式 串口uart, usb,swd(wch link)但不建议按此使用,参官方说明。

qq_39239990的博客 637

C++代码质量提升指南-工具篇

如何提升C++代码质量? 5种提升C++代码质量的方法 C++代码质量提升指南 提高C++代码质量的10个技巧 C++代码质量优化

性感的小君君 924

Understand-Anything:AI驱动的代码知识图谱,实现项目全局洞察与高效导航

在软件开发中,理解复杂代码库的结构和依赖关系是提升开发效率的关键。传统代码阅读方式往往陷入局部视角,难以快速把握系统全貌。知识图谱技术通过将代码实体(如文件、类、函数)及其关系(调用、继承、依赖)可视化,为代码理解提供了全局视角。这项技术的核心价值在于将静态代码转化为动态、可交互的认知地图,极大降低了系统学习与维护成本。在实际工程中,它广泛应用于新成员快速入职、遗留系统梳理、架构影响分析等场景。本文介绍的Understand-Anything工具,正是基于这一理念,通过多智能体分析管道,自动构建代码的结构图

weixin_42615290的博客 880

C++ Google代码风格

C++ Google代码风格0 index(扉页)0.0 声明0.1 译者前言0.2 背景headers(头文件)1.1 Self-contained 头文件1.2. #define 保护1.3. 前置声明1.4. 内联函数1.5. #include 的路径及顺序译者(acgtyrant)笔记scoping(作用域)2. 作用域2.1. 命名空间2.2. 匿名命名空间和静态变量2.3. 非成员函数...

baidu_28926495的博客 1623

四足机器人关节电机FOC控制实战:从磁编码器校准到SVPWM调试避坑指南

本文详细解析了四足机器人关节电机FOC控制实战,涵盖磁编码器校准、电流环调试和SVPWM波形优化等关键环节。通过MIT Cheetah案例展示如何解决21倍电气误差问题,并提供相序自动校正、PI参数整定等实用代码片段,帮助工程师避开永磁同步电机(PMSM)控制中的常见陷阱。

weixin_29281915的博客 489

第3.4章 机器人第三方库实战总结(四):G2O优化库从入门到实战(附SLAM实例代码)

自定义边同样是满足复杂应用需求的重要手段。自定义边时,需要明确边所连接的顶点类型以及边所表示的误差项的计算方式。假设我们要定义一条边,用于约束两个上述自定义顶点之间的相对位姿和传感器偏移量关系。我们可以这样定义边类:public:// 计算误差// 计算雅可比矩阵// 读盘和存盘函数,这里暂不实现。

行知SLAM 357

Google C++编程规范 (中文版)

点击下面的超级链接即可: Google 开源项目风格指南  C++ 风格指南 - 内容目录 0. 扉页 0.1 译者前言 0.2 背景 1. 头文件 1.1. Self-contained 头文件 1.2. #define 保护 1.3. 前置声明 1.4. 内联函数 1.5. #include 的路径及顺序 译者 (YuleFox) 笔...

Hhrock的博客 3万+

学Simulink——基于 Simulink 的 滑模控制(SMC)

本文详细介绍了基于Simulink的Buck变换器滑模控制(SMC)设计与实现方法。首先阐述了传统PI控制在负载突变时的不足,以及滑模控制具有强鲁棒性和快速响应的优势。通过建立Buck变换器的连续状态方程,推导了含积分项的滑模面和控制律,并采用边界层法抑制抖振。文章分步骤讲解了Simulink模型搭建过程,包括主电路、控制器实现和负载扰动模拟模块。仿真结果表明,在负载1A↔5A阶跃时,SMC控制输出电压波动仅0.08V,恢复时间0.35ms,远优于传统PI控制。同时给出了工程实践中的参数选择建议和数字实现技

amy_mhd的博客 253

【整理】Google代码风格(C++)——来自 Google 的奇技

from http://code.google.com/p/google-styleguide/ 版本: 3.133 原作者: Benjy Weinberger Craig Silverstein Gregory Eitzmann Mark Mentovai Tashana Landray 翻译: YuleFox yospaly 项目主页: Google Style ...

盐与黑胡椒的博客 383

银河麒麟操作系统最佳实践专栏介绍

本专栏聚焦国产银河麒麟操作系统(桌面版/服务器版)的实战应用,提供系统安装、配置优化、应用部署、故障排查等实用指南。内容基于真实操作场景,涵盖Linux通用技术(如RAID配置、环境变量管理)、服务器系统专项(如数据库迁移、驱动安装、安全加固)及桌面系统技巧(如PXE安装、镜像封装)。面向IT运维、开发者和国产化转型人员,突出实战性和差异化,帮助用户规避常见问题,提升系统管理效率。所有教程均配有详细步骤和截图,确保可操作性,并持续更新适配新版系统。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 530

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

4. 来自 Google 的奇技

4. 来自 Google 的奇技<br />Google 用了很多自己实现的技巧 / 工具使 C++ 代码更加健壮, 我们使用 C++ 的方式可能和你在其它地方见到的有所不同.4.1. 智能指针<br />Tip<br />如果确实需要使用智能指针的话, scoped_ptr 完全可以胜任. 你应该只在非常特定的情况下使用 std::tr1::shared_ptr, 例如 STL 容器中的对象. 任何情况下都不要使用 auto_ptr.<br />“智能” 指针看上去是指针, 其实是附加了语义的对象. 以

Richarll的专栏 534

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Google C++ Style文档及常用代码规范(三):来自 Google 的奇技、其他 C++ 特性、规则特例、结束语

风格指南的重点在于提供一个通用的编程规范, 这样大家可以把精力集中在实现内容而不是表现形式上. 我们展示的是一个总体的的风格规范, 但局部风格也很重要, 如果你在一个文件中新加的代码和原有代码风格相去甚远, 这就破坏了文件本身的整体美观, 也让打乱读者在阅读代码时的节奏, 所以要尽量避免.不是标准 C++ 的组成部分. 更重要的是, 它们根据数据大小动态分配堆栈内存, 会引起难以发现的内存越界 bugs: “在我的机器上运行的好好的, 发布后却莫名其妙的挂掉了”.所以拿不准时,干脆用更大的类型。

MAVER1CK的博客 1299

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Google 编程风格:C++、Python、JavaScript、Shell、TypeScript

Google 编程风格:C++、Python、JavaScript、Shell、TypeScript

freeking101的博客 5万+

C++ 风格指南 5 来自 Google 的奇技

scoped_ptr 和 auto_ptr 已过时. 现在是 shared_ptr 和 unique_ptr 的天下了.

nuliliq的博客 476

C C++最新谷歌C++编程规范_谷歌编程规范,血与泪的总结

Google 经常会发布一些开源项目, 意味着会接受来自其他代码贡献者的代码. 但是如果代码贡献者的编程风格与 Google 的不一致, 会给代码阅读者和其他代码提交者造成不小的困扰. Google 因此发布了这份自己的编程风格指南, 使所有提交代码的人都能获知 Google 的编程风格.翻译初衷:规则的作用就是避免混乱. 但规则本身一定要权威, 有说服力, 并且是理性的. 我们所见过的大部分编程规范, 其内容或不够严谨, 或阐述过于简单, 或带有一定的武断性.

2401_84976030的博客 1434

GoogleCpp风格指南 4)Google奇技

4 来自Google的奇技 Google-Specific Magic Google用了很多自己的实现技巧/工具使 C++代码更加健壮, 我们使用C++的方式可能和你在其他地方见到的有所不同; [Removed] 4.1 智能指针 Tip 如果确实需要使用智能指针的话, scoped_ptr完全可以胜任; 你应该只在非常特定的情况下使用 std::tr1::shared

Fix it 990

C++ 编码风格精简

头文件: 1.头文件防多重定义define格式:___H_ 2.能使用前置声明尽量不用头文件包含 3.只有当函数只有 10 行甚至更少时才将其定义为内联函数(注意虚函数,递归函数,以及使用了循环语句的函数) 4.复杂的内联函数的定义, 放在后缀名为 -inl.h 的头文件中 5.定义函数时,输入参数永远放在输出参数之前 6.项目内头文件应按照项目源代码目录树结构排列 7.exampl

hgl868的专栏 1355

Google C++ 编码风格精简

头文件: 1.头文件防多重定义define格式:___H_ 2.能使用前置声明尽量不用头文件包含 3.只有当函数只有 10 行甚至更少时才将其定义为内联函数(注意虚函数,递归函数,以及使用了循环语句的函数) 4.复杂的内联函数的定义, 放在后缀名为 -inl.h 的头文件中 5.定义函数时,输入参数永远放在输出参数之前 6.项目内头文件应按照项目源代码目录树结构排列 7.exampl

MOKA 676

Google C++编码规范

无规范不成代码,本文章收录google C++编码规范。道出在编码过程中你要怎么做, 为啥这么做

Lucky_Cpper的博客 2794

谷歌C++编程规范

Google 经常会发布一些开源项目, 意味着会接受来自其他代码贡献者的代码. 但是如果代码贡献者的编程风格与 Google 的不一致, 会给代码阅读者和其他代码提交者造成不小的困扰. Google 因此发布了这份自己的编程风格指南, 使所有提交代码的人都能获知 Google 的编程风格.翻译初衷:我们翻译时也是尽力保持严谨, 但水平所限, bug 在所难免. 有任何意见或建议, 可与我们取得联系.中文版和英文版一样, 使用 开源许可.中文版修订历史:2008-07 1.0 : 出自 YuleFox 的

qq_41854911的博客 6198
上一篇: [C++] 编程实践之1: Google的C++代码风格3:类
下一篇: [C++] 编程实践之1: Google的C++代码风格5:其它C++特性
魔豆Magicbean
博客等级 码龄19年 146粉丝 742原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值