现代C++(Modern C++)和高性能并行编程与优化

现代C++(Modern C++)和高性能并行编程与优化

前言

我创作这篇博客的目的是记录学习技术过程中的笔记。希望通过分享自己的学习经历,能够帮助到那些对相关领域感兴趣或者正在学习的人们。

1.学C++从CMake学起

2.RAII与智能指针

2.1 三五法则

  1. 如果一个类定义了解构函数,那么您必须同时定义或删除拷贝构造函数和拷贝赋值函数,否则出错。
  2. 如果一个类定义了拷贝构造函数,那么您必须同时定义或删除拷贝赋值函数,否则出错,删除可导致低效。
  3. 如果一个类定义了移动构造函数,那么您必须同时定义或删除移动赋值函数,否则出错,删除可导致低效。
  4. 如果一个类定义了拷贝构造函数或拷贝赋值函数,那么您必须最好同时定义移动构造函数或移动赋值函数,否则低效。

2.2 as_const和move函数

std::as_const

  • 目的:用于将一个对象转换为常量引用,以确保该对象在后续的代码中不会被修改。

  • 用法:通常用于希望在不修改原始对象的情况下访问其成员或方法。

  • 示例

    #include 
    #include 
    
    void printValue(const int& value) {
        std::cout << value << std::endl;
    }
    
    int main() {
        int a = 10;
        printValue(std::as_const(a)); // a 被视为常量
        return 0;
    }
    

std::move

  • 目的:用于将一个对象的资源“移动”到另一个对象,而不是复制。这通常用于优化性能,尤其是在处理大对象时。

  • 用法std::move 将其参数转换为右值引用,以允许调用移动构造函数或移动赋值运算符。通过使用move函数,可以明确地告诉编译器某个对象的资源可以被“移动”,从而提高程序的性能。

  • 示例

    #include 
    #include 
    #include 
    
    int main() {
        std::vector vec1 = {1, 2, 3};
        std::vector vec2 = std::move(vec1); // 资源从 vec1 移动到 vec2
    
        std::cout << "vec2 size: " << vec2.size() << std::endl; // 输出: vec2 size: 3
        std::cout << "vec1 size: " << vec1.size() << std::endl; // 输出: vec1 size: 0
        return 0;
    }
    

这两个函数只是负责转换类型,实际产生移动/拷贝效果的是在类的构造/赋值函数里。

2.3 成员都是安全的类型:五大函数,一个也不用声明

  • 如果你的类所有成员,都是安全的类型,那么五大函数都无需声明(或声明为 = default),你的类自动就是安全的。
  • 最好的判断方式是:如果你不需要自定义的解构函数,那么这个类就不需要担心。
  • 因为如果用到了自定义解构函数,往往意味着你的类成员中,包含有不安全的类型。
  • 一般无外乎两种情况:
    1. 你的类管理着资源。------------------------>删除拷贝函数,然后统一用智能指针管理
    2. 你的类是数据结构。------------------------>如果可以,定义拷贝和移动

3.模板元编程与函数式编程

3.1 SFINAE

SFINAE是C++模板编程中的一个重要概念,它是“Substitution Failure Is Not An Error”的缩写,意为“替换失败不是错误”。

原理:

在C++中,当编译器尝试实例化一个模板时,如果在替换模板参数的过程中遇到错误(例如,某个类型不支持某个操作),编译器不会立即报错,而是将这个模板实例化从候选列表中移除,继续尝试其他可能的重载或特化。

#include 
#include 

// 用于整数类型的函数模板
template ::value>::type>
void foo(T value) {
    std::cout << "Integer value: " << value << std::endl;
}

// 用于非整数类型的函数模板
template ::value>::type>
void foo(T value) {
    std::cout << "Non-integer value: " << value << std::endl;
}

int main() {
    int num = 10;
    double dbl = 3.14;

    foo(num);
    

你可能感兴趣的:(软件,c++,开发语言)