当前位置: 首页 > news >正文

C++11常用新特性/使用场景

C++11常用新特性/使用场景

  • 1. `auto` 类型推导 (Type Inference)
  • 2. 范围 for 循环 (Range-based for loop)
  • 3. Lambda 表达式 (Lambda Expressions)
  • 4. `nullptr` 空指针常量
  • 5. 智能指针 (`std::unique_ptr, std::shared_ptr, std::weak_ptr`)
  • 6. Rvalue 引用与移动语义 (Rvalue References & Move Semantics)
  • 7. `constexpr` 常量表达式
  • 8. 强类型枚举 (enum class)
  • 9. `override` 和 `final` 说明符
  • 10. `using` 类型别名 (Type Aliases)


C++11 是 C++ 语言的一个重要里程碑,引入了大量新特性,极大地提升了开发效率、代码安全性和程序性能。以下是一些最常用且影响深远的新特性:

1. auto 类型推导 (Type Inference)

  • 优点:
    • 简化代码: 无需显式写出冗长或复杂的类型名,尤其是在处理模板、迭代器或 Lambda 表达式时。
    • 提高可维护性: 如果变量的初始化表达式类型改变,auto 会自动适应,减少手动修改的需要。
    • 减少错误: 避免因手动写错类型名而导致的编译错误。
  • 使用方法: 使用 auto 关键字代替具体的类型名,编译器会根据初始化表达式推导出变量的实际类型。
    auto i = 42; // i 被推导为 int
    auto d = 3.14; // d 被推导为 double
    std::vector<std::string> names = {"Alice", "Bob"};
    auto it = names.begin(); // it 被推导为 std::vector<std::string>::iterator
    auto lambda = [](int x){ return x * 2; }; // lambda 被推导为闭包类型
    
  • 使用场景:
    • 声明变量,特别是类型名很长或由模板实例化产生时。
    • 配合范围 for 循环(见下文)。
    • 声明 Lambda 表达式变量。
  • 对比旧版本提升: C++98/03 中必须显式声明每个变量的完整类型,对于像 std::map<std::string, std::vector<int>>::const_iterator 这样的类型,书写既繁琐又容易出错。auto 让这一切变得简单。

2. 范围 for 循环 (Range-based for loop)

  • 优点:
    • 简洁易读: 极大简化了遍历容器或数组的代码。
    • 不易出错: 无需手动管理迭代器或索引,避免了常见的边界错误(如 begin()end() 没写对,索引越界)。
  • 使用方法: for (声明 : 范围),其中“声明”定义了每次迭代中用于访问元素的变量,“范围”通常是一个容器、数组或任何支持 begin()end() 方法的对象。
    std::vector<int> numbers = {1, 2, 3, 4, 5};
    for (int num : numbers) {std::cout << num << " "; // 依次输出 1 2 3 4 5 (拷贝元素)
    }
    std::cout << std::endl;std::map<std::string, int> scores = {{"Alice", 90}, {"Bob", 85}};
    for (auto& pair : scores) { // 使用引用避免拷贝,且可修改pair.second += 5; // 给每个人的分数加 5std::cout << pair.first << ": " << pair.second << std::endl;
    }int arr[] = {10, 20, 30};
    for (const auto& x : arr) { // 使用常量引用,只读不拷贝std::cout << x << " ";
    }
    std::cout << std::endl;
    
  • 使用场景: 任何需要遍历序列(数组、std::vector, std::list, std::map, std::string 等)中所有元素的情况。
  • 对比旧版本提升: C++98/03 中遍历容器通常需要写迭代器循环 for(auto it = c.begin(); it != c.end(); ++it) 或索引循环 for(size_t i = 0; i < v.size(); ++i),代码更长,更容易出错。范围 for 更加直观和安全。

3. Lambda 表达式 (Lambda Expressions)

  • 优点:
    • 内联匿名函数: 可以在需要函数对象(如算法的回调、线程的入口)的地方直接定义一个短小的匿名函数。
    • 代码局部性: 将小段逻辑直接写在使用它的地方,提高代码可读性。
    • 捕获上下文: 可以方便地“捕获”其定义作用域内的变量,供函数体内部使用。
  • 使用方法: [捕获列表](参数列表) -> 返回类型 { 函数体 }
    • 捕获列表: 控制如何访问外部变量([] 不捕获,[&] 引用捕获,[=] 值捕获,[var] 值捕获var[&var] 引用捕获var[this] 捕获this指针等)。
    • 参数列表: 和普通函数一样。
    • -> 返回类型: 可选,如果函数体明显能推导出返回类型,可以省略。
    • 函数体: 函数的执行逻辑。
    std::vector<int> v = {1, 5, 2, 8, 3};
    int threshold = 4;// 使用 Lambda 对 vector 排序 (降序)
    std::sort(v.begin(), v.end(), [](int a, int b) {return a > b; // 返回 true 表示 a 应排在 b 前面
    }); // v 现在是 {8, 5, 3, 2, 1}// 使用 Lambda 查找第一个大于 threshold 的元素
    auto it = std::find_if(v.begin(), v.end(), [threshold](int x) {return x > threshold; // 捕获了外部变量 threshold
    });
    if (it != v.end()) {std::cout << "First element greater than " << threshold << ": " << *it << std::endl; // 输出 8
    }// 值捕获外部变量,创建一个简单的计数器 Lambda
    int count = 0;
    auto counter = [count]() mutable { // mutable 允许修改值捕获的变量count++;return count;
    };
    std::cout << counter() << std::endl; // 输出 1
    std::cout << counter() << std::endl; // 输出 2
    std::cout << count << std::endl; // 输出 0 (外部 count 未变)
    
  • 使用场景:
    • 作为标准库算法(std::sort, std::find_if, std::for_each 等)的谓词或操作。
    • 创建简单的回调函数。
    • 启动线程 (std::thread) 时传递执行体。
    • 需要一个临时、一次性的函数对象时。
  • 对比旧版本提升: C++98/03 中需要定义一个函数或者一个函数对象(仿函数,即重载了 operator() 的类/结构体)来达到类似目的,代码冗长且分散。Lambda 表达式极大地简化了这类场景。

4. nullptr 空指针常量

  • 优点:
    • 类型安全: nullptr 是一个特殊的指针类型 (std::nullptr_t),而不是整数 0。这解决了 NULL (通常是 #define NULL 0) 可能带来的类型混淆问题。
    • 明确意图: 清晰地表示这是一个空指针,而不是整数零。
  • 使用方法: 直接使用 nullptr 关键字。
    void foo(int x) { std::cout << "foo(int)" << std::endl; }
    void foo(char* p) { std::cout << "foo(char*)" << std::endl; }int* ptr1 = nullptr;
    char* ptr2 = nullptr;// foo(NULL); // 在 C++98/03 中可能编译错误 (二义性) 或调用 foo(int)
    foo(nullptr); // 清晰地调用 foo(char*)
    
  • 使用场景: 任何需要表示空指针的地方,替代旧的 NULL0
  • 对比旧版本提升: C++98/03 的 NULL 通常是整数 0,在函数重载时可能导致意想不到的行为(如上例)。nullptr 具有明确的指针类型,消除了这种二义性,提高了代码的健壮性。

5. 智能指针 (std::unique_ptr, std::shared_ptr, std::weak_ptr)

  • 优点:
    • 自动资源管理 (RAII): 智能指针在其生命周期结束时(例如离开作用域)自动释放其管理的资源(通常是动态分配的内存),极大地减少了内存泄漏的风险。
    • 明确所有权:
      • std::unique_ptr: 独占所有权,同一时间只有一个 unique_ptr 可以指向资源,轻量级。
      • std::shared_ptr: 共享所有权,通过引用计数管理资源,只有当最后一个 shared_ptr 销毁时资源才被释放。
      • std::weak_ptr: 配合 shared_ptr 使用,提供对资源的非拥有(弱)引用,用于打破循环引用。
  • 使用方法:
    #include <memory> // 需要包含头文件// unique_ptr: 独占所有权
    std::unique_ptr<int> p1(new int(10));
    // std::unique_ptr<int> p2 = p1; // 编译错误:不允许拷贝
    std::unique_ptr<int> p3 = std::move(p1); // 允许所有权转移 (p1 变为空)
    if (p3) { // 检查是否拥有资源*p3 = 20;std::cout << *p3 << std::endl; // 输出 20
    }
    // p3 离开作用域时,自动 delete 内部的 int// 推荐使用 make_unique (C++14, 但很多 C++11 编译器也支持或可自己实现)
    auto p4 = std::make_unique<std::string>("Hello");// shared_ptr: 共享所有权
    std::shared_ptr<std::string> sp1 = std::make_shared<std::string>("World"); // 推荐方式
    std::cout << "Use count: " << sp1.use_count() << std::endl; // 输出 1
    {std::shared_ptr<std::string> sp2 = sp1; // 拷贝,引用计数增加std::cout << "Use count: " << sp1.use_count() << std::endl; // 输出 2std::cout << *sp2 << std::endl; // 输出 World
    } // sp2 离开作用域,引用计数减少
    std::cout << "Use count: " << sp1.use_count() << std::endl; // 输出 1
    // sp1 离开作用域时,引用计数变为 0,资源被释放// weak_ptr: 观察 shared_ptr,不增加引用计数,用于检查资源是否存在及打破循环引用
    std::weak_ptr<std::string> wp1 = sp1;
    if (auto locked_sp = wp1.lock()) { // 尝试获取一个 shared_ptr// 如果资源还存在,locked_sp 是一个有效的 shared_ptrstd::cout << "Resource still exists: " << *locked_sp << std::endl;
    } else {std::cout << "Resource has been deleted." << std::endl;
    }
    
  • 使用场景:
    • 管理任何通过 new 分配的内存。
    • 管理其他需要显式释放的资源(如文件句柄、网络连接,通过自定义删除器)。
    • 在复杂的数据结构(如图、树)中管理节点间的关系,特别是需要共享或可能产生循环引用时。
  • 对比旧版本提升: C++98/03 严重依赖手动 newdelete,非常容易忘记 delete 导致内存泄漏,或者 delete 多次导致程序崩溃。智能指针是现代 C++ 资源管理的核心,遵循 RAII 原则,让代码更安全、简洁。std::auto_ptr(C++98)有所有权转移的怪异行为且不安全,已被 std::unique_ptr 完全取代。

6. Rvalue 引用与移动语义 (Rvalue References & Move Semantics)

  • 优点:
    • 避免不必要的拷贝: 对于临时对象(右值)或者明确不再需要的对象(通过 std::move),可以“移动”其内部资源(如指向内存的指针)给新对象,而不是执行深拷贝。这对于大型对象(如 std::vector, std::string)能极大地提升性能。
    • 实现完美转发: 在模板编程中精确地传递参数的原始值类别(左值或右值),这对于编写通用的工厂函数或包装器至关重要。
  • 使用方法:
    • Rvalue 引用: 使用 && 声明,例如 Type&& rvalue_ref
    • 移动构造函数/赋值运算符: 类可以定义 ClassName(ClassName&& other)ClassName& operator=(ClassName&& other) 来实现移动语义。
    • std::move: 将一个左值显式转换为右值引用,表示“我不再需要这个对象了,你可以拿走它的资源”。
    • std::forward: 在模板中用于保持参数的值类别进行转发。
    #include <utility> // for std::movestd::string source = "Very long string data .........";
    std::vector<std::string> vec;// vec.push_back(source); // C++98: 拷贝 source 的内容到 vector 内部// C++11: 使用移动语义 (如果 vector 有空间,可能仍需拷贝,但这里演示转移)
    // std::move(source) 将 source 转为右值引用,允许 vector 的 push_back(string&&) 重载
    // "偷走" source 内部的指针,source 自身变为空或其他有效但未定义的状态
    vec.push_back(std::move(source));// source 现在不应再被使用,除非重新赋值
    // std::cout << source << std::endl; // 行为未定义或为空std::cout << vec[0] << std::endl; // 输出 "Very long string data ........."// 移动构造函数示例 (简化)
    class ResourceManager {
    public:int* data;ResourceManager(size_t size) : data(new int[size]) {}~ResourceManager() { delete[] data; }// 移动构造函数ResourceManager(ResourceManager&& other) noexcept // noexcept 很重要: data(other.data) {other.data = nullptr; // 将源对象的指针置空,防止它析构时删除资源}// 移动赋值运算符... (类似)// 禁用拷贝构造和拷贝赋值ResourceManager(const ResourceManager&) = delete;ResourceManager& operator=(const ResourceManager&) = delete;
    };ResourceManager r1(1000);
    ResourceManager r2 = std::move(r1); // 调用移动构造函数,高效转移资源
    // r1.data 现在是 nullptr
    
  • 使用场景:
    • 实现自定义类的移动构造和移动赋值,特别是当类管理堆内存或其他资源时。
    • 优化函数返回值(现代编译器通常会自动进行返回值优化 RVO/NRVO,但移动语义是备选方案)。
    • 将对象(尤其是大对象)存入容器或传递给函数时,如果源对象之后不再需要,使用 std::move 提高效率。
    • 编写需要完美转发参数的模板函数。
  • 对比旧版本提升: C++98/03 中,临时对象或即将销毁的对象通常也需要进行成本高昂的深拷贝。移动语义提供了一种标准化的、高效的资源转移机制,是 C++11 性能提升的关键因素之一,尤其影响了标准库容器和字符串的实现。

7. constexpr 常量表达式

  • 优点:
    • 编译期计算: 允许在编译时执行函数和初始化变量,结果可以直接用在需要常量表达式的地方(如数组大小、模板参数、枚举值等)。
    • 提升运行时性能: 将计算从运行时提前到编译期。
    • 增强表达力: 可以用函数形式定义复杂的常量,而不仅仅是字面量。
  • 使用方法: 使用 constexpr 关键字修饰变量、函数或构造函数。C++11 对 constexpr 函数限制较多(通常只有单一 return 语句),C++14 及以后放宽了限制。
    constexpr int factorial(int n) {return (n <= 1) ? 1 : (n * factorial(n - 1));
    }constexpr int N = 5;
    int arr[factorial(N)]; // OK: factorial(5) 在编译期计算为 120constexpr int calculated_size = N * N + factorial(3); // 编译期计算 25 + 6 = 31struct Point {constexpr Point(int x_val, int y_val) : x(x_val), y(y_val) {}constexpr int getX() const { return x; }constexpr int getY() const { return y; }
    private:int x, y;
    };constexpr Point p1(10, 20);
    constexpr int x_coord = p1.getX(); // 编译期计算
    int another_arr[x_coord]; // OK: 数组大小是编译期常量 10
    
  • 使用场景:
    • 定义编译期常量,特别是需要通过简单计算得出的。
    • 编写需要在编译期执行的工具函数(如简单的数学运算、位操作)。
    • 用于模板元编程。
  • 对比旧版本提升: C++98/03 中,编译期常量主要依赖宏、enum hack 或 const 变量(且必须用常量表达式初始化)。constexpr 提供了更强大、更类型安全的方式来执行编译期计算,使得更多逻辑可以从运行时移到编译期。

8. 强类型枚举 (enum class)

  • 优点:
    • 作用域限制: 枚举成员的作用域被限制在枚举类内部,避免了命名冲突。
    • 类型安全: 不能隐式转换为整数,也不能与其他枚举类型比较(除非显式转换)。
    • 可指定底层类型: 可以指定枚举使用的整数类型(如 uint8_t)。
  • 使用方法: 使用 enum class (或 enum struct) 关键字定义。
    enum class Color { Red, Green, Blue };
    enum class Status { Pending, Running, Completed, Failed };Color c = Color::Red;
    Status s = Status::Running;// if (c == s) {} // 编译错误:不同类型的枚举不能比较
    // int colorValue = c; // 编译错误:不能隐式转换为 intint colorValue = static_cast<int>(c); // 需要显式转换// 指定底层类型为 unsigned char
    enum class Signal : unsigned char { On, Off };
    Signal sig = Signal::On;
    
  • 使用场景: 任何需要定义一组相关常量的地方,特别是当希望避免命名冲突和隐式类型转换时。
  • 对比旧版本提升: C++98/03 的传统 enum 将其成员暴露在父作用域中,很容易导致不同枚举间的命名冲突。同时,它们会隐式转换为整数,降低了类型安全性。enum class 完美解决了这两个问题。

9. overridefinal 说明符

  • 优点:
    • override: 明确表示派生类中的函数意图覆盖基类的虚函数。如果基类没有对应的虚函数或函数签名不匹配,编译器会报错,防止意外创建新函数而非覆盖。
    • final:
      • 用于虚函数:阻止派生类进一步覆盖此虚函数。
      • 用于类:阻止其他类从此类继承。
    • 提高代码清晰度和安全性: 让继承关系和覆盖意图更明确,减少维护时的错误。
  • 使用方法:
    class Base {
    public:virtual void print() { std::cout << "Base::print()" << std::endl; }virtual void process() { std::cout << "Base::process()" << std::endl; }virtual ~Base() = default;
    };class Derived : public Base {
    public:// 明确覆盖 Base::print,如果 Base::print 签名变化或不是 virtual,会报错void print() override { std::cout << "Derived::print()" << std::endl; }// 此函数阻止其在 Derived 的派生类中被再次覆盖void process() override final { std::cout << "Derived::process() (final)" << std::endl; }
    };// 此类不能被继承
    class FinalDerived final : public Derived {
    public:void print() override { std::cout << "FinalDerived::print()" << std::endl; }// void process() override {} // 编译错误:process 在 Derived 中是 final
    };// class MoreDerived : public FinalDerived {}; // 编译错误:FinalDerived 是 final
    
  • 使用场景: 在面向对象编程中使用继承和虚函数时,强烈推荐使用 overridefinal 用于控制继承体系的设计,当不希望某个类被继承或某个虚函数被进一步覆盖时使用。
  • 对比旧版本提升: C++98/03 中,覆盖虚函数时如果签名写错(例如 const 忘了加),编译器不会报错,而是会创建一个新的虚函数,导致多态行为不符合预期,这种错误很难发现。override 能在编译期捕获这类错误。final 提供了以前没有的标准化的方式来限制继承和覆盖。

10. using 类型别名 (Type Aliases)

  • 优点:
    • 更清晰的语法: using NewName = OldType; 的语法比 typedef OldType NewName; 更自然、易读,特别是对于函数指针和模板类型。
    • 模板别名: 可以方便地为模板创建别名。
  • 使用方法:
    // 替代 typedef
    using Integer = int;
    using StringVec = std::vector<std::string>;
    using FuncPtr = void (*)(int);Integer i = 10;
    StringVec names;
    FuncPtr fp = nullptr;// 模板别名 (typedef 很难做到)
    template<typename T>
    using Matrix = std::vector<std::vector<T>>;Matrix<double> m; // m 是 std::vector<std::vector<double>> 类型
    
  • 使用场景:
    • 为复杂类型(如STL容器、函数指针)创建更简洁或更具语义的别名。
    • 在模板编程中创建模板别名。
  • 对比旧版本提升: typedef 的语法在处理复杂类型(尤其是函数指针和模板)时显得笨拙和不直观。using 提供了统一且更易于理解的语法,特别是其对模板别名的支持是 typedef 无法直接做到的。

除了以上这些,C++11 还引入了 初始化列表 (std::initializer_list) 使得用 {...} 初始化容器和对象更加方便和统一;并发编程支持 (std::thread, std::mutex, std::atomic, std::future 等) 标准化了多线程编程;变长模板 (Variadic Templates) 允许模板接受不定数量的参数等等。这些特性共同构成了现代 C++ 的基础,使得 C++ 语言更加强大、安全和易用。

相关文章:

C++11常用新特性/使用场景

C11常用新特性/使用场景 1. auto 类型推导 (Type Inference)2. 范围 for 循环 (Range-based for loop)3. Lambda 表达式 (Lambda Expressions)4. nullptr 空指针常量5. 智能指针 (std::unique_ptr, std::shared_ptr, std::weak_ptr)6. Rvalue 引用与移动语义 (Rvalue Reference…...

React 自定义Hook之usePrevious

概要 本文提供一个获取useState状态变化之前旧值的Hook方法usePrevious&#xff0c;以及该方法的基本实现思路&#xff0c; 实现包括TS版和普通JS版。 基本思路 usePrevious的核心原理&#xff0c;在于React Hooks的执行顺序和引用对象&#xff08;ref&#xff09;的持久化特…...

LicheeRV Nano 与Ubuntu官方risc-v 镜像混合

LicheeRV Nano 官方给的镜像并没有unbutu, unbutu官方有一个基于 LicheeRV Dock的镜像&#xff0c;想象能否将二者混合 &#xff08;1&#xff09;刷 LicheeRV Dock的镜像 nano无法启动 &#xff08;2&#xff09;将nano的boot分区替换掉 LicheeRV Dock的rootfs以外的分区也…...

Eureka搭建

1.注册中心server端 1.1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency><groupId>org.springframework.cloud</…...

2025-2030:视频联网平台的六大技术演进趋势

一、多模态感知融合&#xff1a;从二维图像到全息数字孪生 2025年的视频联网平台正突破传统视觉边界&#xff0c;向多物理场协同感知进化&#xff1a; 光谱维度&#xff1a;上海电力的"慧眼X"系统已集成可见光&#xff08;8K60fps&#xff09;红外&#xff08;6405…...

软考高级系统架构设计师-第13章 软件可靠性基础知识

【本章学习建议】 根据考试大纲,本章主要考查系统架构设计师单选题,预计考2分左右,案例分析偶尔会考到,对应第二版教材第9章,侧重于概念知识,考查知识点多来源于教材。 13.1 软件可靠性基本概念 13.1.1 软件可靠性定义 软件可靠性(Software Reliability)是软件产品在…...

博客系统-RabbitMQ

前言 RabbitMQ介绍 ⽤⼾注册完成之后,系统会给⽤⼾发送⼀封邮件通知 但是邮件发送成功失败并不影响我们⽤⼾注册成功.我们可以采⽤RabbitMQ来进⾏服务的解耦 RabbitMQ是⼀个开源的消息代理和队列服务器&#xff0c;⼴泛⽤于实现消息队列和事件通知.它⽀持多种消息 协议&#…...

面试题:循环引用两个节点相互引用,如何判断哪个用 shared_ptr?哪个用 weak_ptr?

目录 1.引言 2.原理 3.所有权模型与指针选择 4.复杂场景的决策策略 5.注意事项 6.总结 1.引言 当两个对象通过 shared_ptr 相互引用时&#xff0c;会产生循环引用问题&#xff0c;导致内存泄漏。因为这两个对象的引用计数永远不会变为 0&#xff0c;即使它们在程序的其他…...

go语言优雅关机和优雅重启笔记

一、优雅关机 生活化例子 餐馆关门&#xff1a;你去餐馆吃火锅&#xff0c;刚坐下点完菜&#xff08;客户端发请求&#xff09;&#xff0c;餐馆老板突然接到通知要停电&#xff08;收到关机指令&#xff09;。老板很贴心&#xff0c;先停止接待新客人&#xff08;停止接收新请…...

Python赋能去中心化电子商务平台:重构交易生态的新未来

Python赋能去中心化电子商务平台:重构交易生态的新未来 近年来,传统电子商务平台由于依赖中心化的服务器架构,面临数据隐私泄露、平台垄断、交易中介费用高昂以及信任危机等诸多挑战。而随着区块链和Web 3.0理念的快速普及以及零信任安全架构、边缘计算等新兴技术的不断成熟…...

山东大学软件学院项目实训-基于大模型的模拟面试系统-Token过期重定向问题

项目结构 ├── assets/ # 静态资源&#xff08;CSS/图片&#xff09; ├── components/ # Vue 组件 ├── layouts/ # 布局模板 ├── pages/ # 自动生成路由 ├── plugins/ # 插件&#xff08;如 axios 拦截器&#xff09; …...

树莓派系统中设置固定 IP

在基于 Ubuntu 的树莓派系统中&#xff0c;设置固定 IP 地址主要有以下几种方法&#xff1a; 方法一&#xff1a;使用 Netplan 配置&#xff08;Ubuntu 18.04 及以上版本默认使用 Netplan&#xff09; 查看网络接口名称 在终端输入ip link或ip a命令&#xff0c;查看当前所使…...

JBoss + WildFly 本地开发环境完全指南

JBoss WildFly 本地开发环境完全指南 本篇笔记主要实现在本地通过 docker 创建 JBoss 和 WildFly 服务器这一功能&#xff0c;基于红帽的禁制 EAP 版本的重新分发&#xff0c;所以我这里没办法放 JBoss EAP 的 zip 文件。WildFly 是免费开源的版本&#xff0c;可以在红帽官网找…...

网络原理 - 应用层, 传输层(UDP 和 TCP) 进阶, 网络层, 数据链路层 [Java EE]

目录 应用层 1. 应用层的作用 2. 自定义应用层协议 3. 应用层的 "通用协议格式" 3.1 xml 3.2 json 3.3 protobuffer (pd) 传输层 1. UDP 1.1 无连接 1.2 不可靠传输 1.3 面向数据报 1.4 全双工 1.5 缓冲区 1.6 UDP 数据报 2. TCP 2.1 有连接 …...

百级Function架构集成DeepSeek实践:Go语言超大规模AI工具系统设计

一、百级Function系统的核心挑战 1.1 代码结构问题 代码膨胀现象&#xff1a;单个文件超过2000行代码路由逻辑复杂&#xff1a;巨型switch-case结构维护困难依赖管理失控&#xff1a;跨Function依赖难以追踪 // 传统实现方式的问题示例 switch functionName { case "fu…...

全同态加密医疗数据分析集python实现

目录 摘要一、前言二、全同态加密与医疗数据分析概述2.1 全同态加密(FHE)简介2.2 医疗数据分析需求三、数据生成与预处理四、系统架构与流程4.1 系统架构图五、核心数学公式六、异步任务调度与(可选)GPU 加速七、PyQt6 GUI 设计八、完整代码实现九、自查测试与总结十、展望…...

字节头条golang二面

docker和云服务的区别 首先明确Docker的核心功能是容器化&#xff0c;它通过容器技术将应用程序及其依赖项打包在一起&#xff0c;确保应用在不同环境中能够一致地运行。而云服务则是由第三方提供商通过互联网提供的计算资源&#xff0c;例如计算能力、存储、数据库等。云服务…...

关于进程状态

目录 进程的各种状态 运行状态 阻塞状态 挂起状态 linux中的进程状态、 进程状态查看 S状态&#xff08;浅睡眠&#xff09; t 状态&#xff08;追踪状态&#xff09; T状态&#xff08;暂停状态&#xff09; ​编辑 kill命令手册 D状态&#xff08;深度睡眠&#…...

操作系统是如何运行的?

硬件中断 在我们使用键盘的时候&#xff0c;操作系统要怎么知道键盘上有数据了呢&#xff1f;硬件中断&#xff01; 硬件中断过程如图所示&#xff1a; 按照图中所示&#xff0c;外设直接与CPU进行交互&#xff0c;但是之前对于冯诺依曼体系架构的学习可知&#xff0c;外设要…...

【智驾中的大模型 -3】VLA 在自动驾驶中的应用

1.前言 在上一篇文章中&#xff0c;我们深入探讨了 VLM 模型在自动驾驶中的应用。VLA&#xff08;Very Large Architecture&#xff0c;大型架构&#xff09;和 VLM&#xff08;Very Large Model&#xff0c;非常大模型&#xff09;在 AI 领域皆指向超大规模的神经网络模型&am…...

Go语言中的sync.Map与并发安全数据结构完全指南

1. 引言 在Go语言的世界里&#xff0c;并发不是一个附加功能&#xff0c;而是语言的核心设计理念。那句广为人知的"Do not communicate by sharing memory; instead, share memory by communicating"&#xff08;不要通过共享内存来通信&#xff0c;而应该通过通信来…...

ADVB协议

ADVB:航空数字视频总线 ADVB协议是基于FC光纤通道协议和FC-AV光纤音频视频协议标准来制定 的一种新型的数字视频接口和协议。 FC协议&#xff0c;FC-AV协议&#xff0c;FC-ADVB协议。 协议层次结构&#xff0c;协议拓扑结构。 ADVB总线协议container容器是作为基本传输单元…...

Vue3中provide和inject数据修改规则

在 Vue3 中&#xff0c;通过 inject 接收到的数据是否可以直接修改&#xff0c;取决于 provide 提供的值的类型和响应式处理方式&#xff1a; 1. 若提供的是普通值&#xff08;非响应式数据&#xff09; javascript 复制 // 父组件 provide(staticValue, 123); 子组件修改行…...

VuePress 使用教程:从入门到精通

VuePress 使用教程&#xff1a;从入门到精通 VuePress 是一个以 Vue 驱动的静态网站生成器&#xff0c;它为技术文档和技术博客的编写提供了优雅而高效的解决方案。无论你是个人开发者、团队负责人还是开源项目维护者&#xff0c;VuePress 都能帮助你轻松地创建和管理你的文档…...

Linux操作系统简介:从开源内核到技术生态

一、Linux的起源与核心架构 1. 历史背景与发展 1991年&#xff0c;芬兰赫尔辛基大学学生林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;开发了首个Linux内核。这一开源项目与GNU工具链结合&#xff0c;形成完整的GNU/Linux操作系统。截至2023年&#xff0c;Linux内核贡…...

iOS 应用性能测试工具对比:Xcode Instruments、克魔助手与性能狗

iOS 应用性能测试工具对比&#xff1a;Xcode Instruments、克魔助手与性能狗 在移动应用开发领域&#xff0c;性能优化是确保用户体验流畅、留存率高的关键因素。对于 iOS 开发者而言&#xff0c;选择合适的性能测试工具能够帮助快速定位和解决应用中的性能瓶颈。本文将深入分…...

CentOS 10 /root 目录重新挂载到新分区槽

1 观察 ##观察目录/root 所占的磁盘空间大小 rootbogon:~# du -smh /root/ 1.6G /root/ rootbogon:~# du -smh /* |grep root du: 无法访问 /proc/19146/task/19146/fd/3: 没有那个文件或目录 du: 无法访问 /proc/19146/task/19146/fdinfo/3: 没有那个文件或目录 du: 无法访问…...

【读书笔记·VLSI电路设计方法解密】问题64:什么是芯片的功耗分析

低功耗设计是一种针对VLSI芯片功耗持续攀升问题的设计策略。随着工艺尺寸微缩&#xff0c;单颗芯片可集成更多元件&#xff0c;导致功耗相应增长。更严峻的是&#xff0c;现代芯片工作频率较二十年前大幅提升&#xff0c;而功耗与频率呈正比关系。因此&#xff0c;芯片功耗突破…...

python爬虫复习

requests模块 爬虫的分类 通用爬虫&#xff1a;将一整张页面进行数据采集聚焦爬虫&#xff1a;可以将页面中局部或指定的数据进行采集 聚焦爬虫是需要建立在通用的基础上来实现 功能爬虫&#xff1a;基于selenium实现的浏览器自动化的操作分布式爬虫&#xff1a;使用分布式机群…...

深入解析主流数据库体系架构:从关系型到云原生

数据库是现代信息系统的核心组件&#xff0c;其体系架构设计直接影响性能、扩展性和可靠性。本文将从传统关系型数据库到新兴云原生数据库&#xff0c;系统解析主流数据库的架构特点及适用场景。 目录 一、关系型数据库&#xff08;RDBMS&#xff09;架构 ​​典型代表​​&…...

2026《数据结构》考研复习笔记四(第一章)

绪论 前言时间复杂度分析 前言 由于先前笔者花费约一周时间将王道《数据结构》知识点大致过了一遍&#xff0c;圈画下来疑难知识点&#xff0c;有了大致的知识框架&#xff0c;现在的任务就是将知识点逐个理解透彻&#xff0c;并将leetcode刷题与课后刷题相结合。因此此后的过…...

Mysql insert一条数据的详细过程

以下是MySQL在接收到INSERT语句后存储数据的详细过程解析&#xff0c;结合存储引擎&#xff08;以InnoDB为例&#xff09;和物理存储机制分步说明。 一、SQL解析与事务启动 1.语法解析 MySQL首先解析INSERT语句&#xff0c;验证字段是否存在、数据类型是否匹配、约束&#xf…...

流水灯右移程序(STC89C52单片机)

#include <reg52.h> sbit ADDR0 P1^0; sbit ADDR1 P1^1; sbit ADDR2 P1^2; sbit ADDR3 P1^3; sbit ENLED P1^4; void main() { unsigned int i 0; //定义循环变量i&#xff0c;用于软件延时 unsigned char cnt 0; //定义计数变量cnt&#xff0c;用…...

AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B专属管家大模型

环境&#xff1a; AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 Qwen2.-1.5B/3B Llama factory llama.cpp 问题描述&#xff1a; AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B管家大模型 解决方案&#xff1a; 一、准备数据集我这…...

智能体团队 (Agent Team)

概述 智能体团队是一种多智能体协作模式&#xff0c;它将多个智能体组织成一个团队&#xff0c;共同解决复杂任务。与智能体监督模式不同&#xff0c;智能体团队中的成员通常具有平等的地位&#xff0c;通过相互交流和协作来达成目标。这种模式特别适合需要多种观点或多领域专…...

AI日报 - 2025年04月19日

&#x1f31f; 今日概览(60秒速览) ▎&#x1f916; AGI突破 | OpenAI与Google模型在复杂推理上展现潜力&#xff0c;但距AGI仍有距离&#xff1b;因果AI被视为关键路径。 模型如o3解决复杂迷宫&#xff0c;o4-mini通过棋盘测试&#xff0c;但专家预测AGI仍需30年。 ▎&#x1…...

【实战中提升自己】内网安全部署之dot1x部署 本地与集成AD域的主流方式(附带MAC认证)

1 dot1x部署【用户名密码认证&#xff0c;也可以解决私接无线AP等功能】 说明&#xff1a;如果一个网络需要通过用户名认证才能访问内网&#xff0c;而认证失败只能访问外网与服务器&#xff0c;可以部署dot1x功能。它能实现的效果是&#xff0c;当内部用户输入正常的…...

算法—合并排序—js(场景:大数据且需稳定性)

合并排序基本思想&#xff08;稳定且高效&#xff09; 将数组递归拆分为最小单元&#xff0c;合并两个有序数组。 特点&#xff1a; 时间复杂度&#xff1a;O(n log n) 空间复杂度&#xff1a;O(n) 稳定排序 // 合并排序-分解 function mergeSort(arr) {if (arr.length < …...

绝对路径与相对路径

绝对路径和相对路径是在计算机系统中用于定位文件或目录的两种方式&#xff0c;以下是具体介绍&#xff1a; 绝对路径 • 定义&#xff1a;是从文件系统的根目录开始到目标文件或目录的完整路径&#xff0c;它包含了从根目录到目标位置的所有目录和子目录信息&#xff0c;具有…...

RabbitMQ,添加用户时,出现Erlang cookie不一致,导致添加用户失败的问题解决

1. 问题现象 RabbitMQ 添加用户&#xff0c;出现以下报错 ./rabbitmgctl add user admin admin666*2. 问题原因和解决方法 安装的 RabbitMQ 里的 Erlang cookie&#xff0c;和 Erlang 环境的 cookie 不一致导致的 解决方法&#xff1a;将 Erlang 环境的 cookie &#xff0c…...

阿拉丁神灯-第16届蓝桥第4次STEMA测评Scratch真题第2题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥真题&#xff0c;这是Scratch蓝桥真题解析第219讲。 第16届蓝桥第4次STEMA测评已于2025年1月12日落下帷幕&#xff0c;编程题一共有5题&#xff08;初级组只有前4道编…...

常用的验证验证 onnxruntime-gpu安装的命令

#工作记录 我们经常会遇到明明安装了onnxruntime-gpu或onnxruntime后&#xff0c;无法正常使用的情况。 一、强制重新安装 onnxruntime-gpu 及其依赖 # 强制重新安装 onnxruntime-gpu 及其依赖 pip install --force-reinstall --no-cache-dir onnxruntime-gpu1.18.0 --extra…...

docker配置skywalking 监控springcloud应用

在使用 Docker 配置 SkyWalking 监控 Spring Cloud 应用时&#xff0c;主要分为以下几个步骤&#xff1a; 1. 准备工作 确保你的开发环境已经安装了 Docker 和 Docker Compose。准备好 Spring Cloud 应用代码&#xff0c;并确保它支持 SkyWalking 的探针&#xff08;Agent&…...

HBase安装与基本操作指南

## 1. 安装准备 首先确保您的系统已经安装了以下组件: - Java JDK 8或更高版本 - Hadoop(HBase可以运行在独立模式下,但建议配合Hadoop使用) ## 2. 下载与安装HBase ```bash # 下载HBase(以2.4.12版本为例) wget https://downloads.apache.org/hbase/2.4.12/hbase-2…...

【Linux】Rhcsa复习5

一、Linux文件系统权限 1、文件的一般权限 文件权限针对三类对象进行定义&#xff1a; owner 属主&#xff0c;缩写u group 属组&#xff0c; 缩写g other 其他&#xff0c;缩写o 每个文件针对每类访问者定义了三种主要权限&#xff1a; r&#xff1a;read 读 w&…...

C++11特性补充

目录 lambda表达式 定义 捕捉的方式 可变模板参数 递归函数方式展开参数包 数组展开参数包 移动构造和移动赋值 包装器 绑定bind 智能指针 RAII auto_ptr unique_ptr shared_ptr 循环引用 weak_ptr 补充 总结 特殊类的设计 不能被拷贝的类 只能在堆上创建…...

缓存 --- Redis性能瓶颈和大Key问题

缓存 --- Redis性能瓶颈和大Key问题 内存瓶颈网络瓶颈CPU 瓶颈持久化瓶颈大key问题优化方案 Redis 是一个高性能的内存数据库&#xff0c;但在实际使用中&#xff0c;可能会在内存、网络、CPU、持久化、大键值对等方面遇到性能瓶颈。下面从这些方面详细分析 Redis 的性能瓶颈&a…...

css3新特性第三章(文本属性)

一、文本属性 文本阴影文本换行文本溢出文本修饰文本描边 1.1 文本阴影 在 CSS3 中&#xff0c;我们可以使用 text-shadow 属性给文本添加阴影。 语法&#xff1a; text-shadow: h-shadow v-shadow blur color; 值描述h-shadow必需写&#xff0c;水平阴影的位置。允许负值。…...

Redis 缓存—处理高并发问题

Redis的布隆过滤器、单线程架构、双写一致性、比较穿透、击穿及雪崩、缓存更新方案及分布式锁。 1 布隆过滤器 是一种高效的概率型数据结构&#xff0c;用于判断元素是否存在。主要用于防止缓存穿透&#xff0c;通过拦截不存在的数据查询&#xff0c;避免击穿数据库。 原理&…...

嵌入式芯片中的 SRAM 内容细讲

什么是 RAM&#xff1f; RAM 指的是“随机存取”&#xff0c;意思是存储单元都可以在相同的时间内被读写&#xff0c;和“顺序访问”&#xff08;如磁带&#xff09;相对。 RAM 不等于 DRAM&#xff0c;而是一类统称&#xff0c;包括 SRAM 和 DRAM 两种主要类型。 静态随机存…...