首页 > 编程语言 >Google C++ 风格指南记录

Google C++ 风格指南记录

时间:2023-08-10 17:36:13浏览次数:55  
标签:指南 std Google emplace 右值 C++ 引用 forward 构造函数

最近在看谷歌的 C++ 风格指南发现了一些有意思的知识点,遂记录下

1. 第六章第二小节介绍了右值引用

只在定义移动构造函数与移动赋值操作时使用右值引用. 不要使用 std::forward.

定义:

右值引用是一种只能绑定到临时对象的引用的一种, 其语法与传统的引用语法相似. 例如, void f(string&& s); 声明了一个其参数是一个字符串的右值引用的函数.

优点:

用于定义移动构造函数 (使用类的右值引用进行构造的函数) 使得移动一个值而非拷贝之成为可能. 例如, 如果 v1 是一个 vector<string>, 则 auto v2(std::move(v1)) 将很可能不再进行大量的数据复制而只是简单地进行指针操作, 在某些情况下这将带来大幅度的性能提升.

右值引用使得编写通用的函数封装来转发其参数到另外一个函数成为可能, 无论其参数是否是临时对象都能正常工作.

右值引用能实现可移动但不可拷贝的类型, 这一特性对那些在拷贝方面没有实际需求, 但有时又需要将它们作为函数参数传递或塞入容器的类型很有用.

要高效率地使用某些标准库类型, 例如 std::unique_ptrstd::move 是必需的.

缺点:

右值引用是一个相对比较新的特性 (由 C++11 引入), 它尚未被广泛理解. 类似引用崩溃, 移动构造函数的自动推导这样的规则都是很复杂的.

结论:

只在定义移动构造函数与移动赋值操作时使用右值引用, 不要使用 std::forward 功能函数. 你可能会使用 std::move 来表示将值从一个对象移动而不是复制到另一个对象.
  上文说到 std::forward,那么 forward 是干啥的呢?   答:std::forward 用于完美转发参数,确保将参数传递给对象的构造函数时保持其原始的左值/右值属性   std::forward 经常被拿出与 std::move 比较,这个我在另一篇文章有介绍: 它常常与 std::emplace_back 一起使用,下面是个代码示例,
#include <iostream>
#include <utility>
#include <vector>

class MyObject {
 public:
  MyObject(int value) : value(value) {
    std::cout << "Constructor: " << value << std::endl;
  }

 private:
  int value;
};

class MyContainer {
 public:
  // emplace 函数用于构造元素
  template <typename... Args>
  void emplace(Args&&... args) {
    // 使用 std::forward 完美转发参数到构造函数
    objects.emplace_back(std::forward<Args>(args)...);
  }

 private:
  std::vector<MyObject> objects;
};

int main() {
  MyContainer container;

  int value = 42;

  // 使用 emplace 构造 MyObject 对象
  container.emplace(value);
}

std::emplace_back可以在容器内部直接构造对象,避免了额外的拷贝和移动操作,提高了性能。

使用 std::emplace_back 需要注意下面的一些事项:

  1. 理解参数: std::emplace_back允许你在容器的末尾构造元素,而不是传递一个已构造的对象。因此,要确保你提供的参数与元素的构造函数参数匹配,以便正确地构造对象。

  2. 避免不必要的拷贝和移动: 使用std::emplace_back时,不会发生拷贝或移动操作,因为元素是直接在容器内部构造的。这可以提高性能,但也意味着你不应该传递一个已经构造好的对象,而是提供构造对象所需的参数。

  3. 注意引用折叠: 当使用std::forward进行参数的完美转发时,要注意引用折叠的情况。确保传递参数时保持原始的左值/右值属性。

  4. 异常安全性: 在std::vector等动态容器中,std::emplace_back可能会触发重新分配内存。要确保在重新分配内存时不会导致资源泄漏或对象的不一致状态。推荐使用RAII(Resource Acquisition Is Initialization)等技术来保证异常安全性。

  5. 构造函数的异常: 如果元素的构造函数抛出异常,容器会保持原状,不会插入新元素。确保你的构造函数在异常发生时不会引起资源泄漏,并正确处理异常情况。

  6. 避免迭代器失效: 在插入元素时,要注意可能会导致迭代器失效,因为容器可能会重新分配内存。如果需要保存迭代器,请在插入操作之前保留或更新迭代器。

  7. 移动语义的使用: 如果参数为右值引用,确保你在移动构造时正确地使用std::move。要遵循移动语义的原则,确保源对象在移动后处于有效但未定义的状态。

  8. 了解容器的特性: 不同的容器(如std::vectorstd::liststd::deque等)可能有不同的行为,例如动态分配内存的频率和方式。了解容器的特性有助于更好地使用std::emplace_back

   

标签:指南,std,Google,emplace,右值,C++,引用,forward,构造函数
From: https://www.cnblogs.com/strive-sun/p/17620966.html

相关文章

  • Java 数据类型和变量的完整指南
    目录一、字面常量1.1什么常量?1.2常见的六种常量类型二、数据类型2.1什么是数据类型?2.2基本数据类型:2.3引用数据类型三、变量3.1什么是变量?3.2变量的命名规则3.3变量的作用域3.4变量的被final修饰四.类型转换4.1什么是类型转换?4.2自动类型转换4.3强制类型转换4.4注意事项4.5类型提升......
  • 【专题】2023全民学习力洞察与数字营销指南报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33404原文出处:拓端数据部落公众号学习能力是将知识资源转化为知识资本的能力。它包括对所学内容的兴趣和热情,有助于更深入理解和掌握知识,提高个人的认知和思维能力。阅读原文,获取专题报告合集全文,解锁文末158份学习教育行业相关报告。教育和娱乐......
  • .NET JIT脱壳指南与工具源码
    title:.NETJIT脱壳指南与工具源码date:2019-08-08updated:2023-04-09lang:zh-CNcategories:-[.NET逆向]tags:-.NET-逆向工程-脱壳-JITtoc:true文章首发于https://wwh1004.com/net-jit-unpack-guide-and-source/本文介绍了.NET下的JIT层加密点与脱壳技巧......
  • manacher(马拉车)算法C++详解
    马拉车的定义马拉车本质是对中心扩展法(暴力算法)的优化。马拉车是干什么的Manacher算法帮助我们在给定的字符串中找到最长的回文子串。为了简单起见,我们先只处理有奇数个字符的字符串,关于偶数个字符的字符串,在文章最后会给出解法。我们的处理思路和暴力算法基本一致,那就是从左......
  • C/C++基础知识点
    C和C++的区别C++是C的超集,C是面向过程化的结构性语言,而C++是面向对象的编程语言C语言更偏向于底层,使用较为灵活,可移植性强,而C++更偏向于上层,可扩展性强,对于大型项目往往使用C++C++在C语言的基础上提出了STL标准模板库,函数模板等特性static关键字的作用隐藏,凡事变量前添加s......
  • c++枚举详细介绍以及具体用法
    C++中的枚举(Enumeration)是一种用于定义命名常量集合的数据类型。枚举可以提高代码的可读性和可维护性,让您可以使用有意义的名称来表示特定的取值,而不必使用原始的数字常量。枚举的基本语法:enumEnumName{Value1,Value2,//...};EnumName是枚举类型的名称......
  • C/C++开发者必备 如何获取系统环境变量的方法
    获取系统环境变量在C/C++中是一项简单的任务。下面展示了一个纯C语言实现的方法。```c#include<stdio.h>#include<stdlib.h>intmain(void){char*pathVar;pathVar=getenv("PATH");printf("pathVar=%s",pathVar);return0;}```需要注意的是,`getenv()`函数定义......
  • 我的第一篇博客--C++课程设计
    目录前言一、题目1.数位之和2.数字排序3.字符串匹配二、问题分析1.数位之和2.数字排序3.字符串匹配三、具体代码1.数位之和2.数字排序3.字符串匹配总结前言这是我的第一篇博客,内容便是最近所做的课程设计,之后也会每天和大家分享一下刷题笔记,以及AC后的代码,希望大家的批评指正,分享大......
  • 用户空间协议栈设计和netmap综合指南
    本文分享自华为云社区《用户空间协议栈设计和netmap综合指南,将网络效率提升到新高度》,作者:LionLong。协议概念1.1、七层网络模型和五层网络模型应用层: 最接近用户的一层,为用户程序提供网络服务。主要协议有HTTP、FTP、TFTP、SMTP、DNS、POP3、DHCP等。表示层: 数据的表示......
  • 实践指南-前端性能提升 270%
    一、背景当我们疲于开发一个接一个的需求时,很容易忘记去关注网站的性能,到了某一个节点,猛地发现,随着越来越多代码的堆积,网站变得越来越慢。本文就是从这样的一个背景出发,着手优化网站的前端性能,并总结出一套开发习惯,让我们在日常开发时,也保持高性能,而不是又一次回过头来优化性能......