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

【面试】C++与C override的报错阶段 RAII

文章目录

  • C++ 相对于 C 语言的主要区别
      • **1. 面向对象编程(OOP)**
      • **2. 函数增强**
      • **3. 内存管理**
      • **4. 引用(Reference)**
      • **5. 标准模板库(STL)**
      • **6. 异常处理**
      • **7. 类型安全增强**
      • **8. 其他特性**
      • **9. 兼容性**
      • 多态
      • **总结**
  • 用了override没有对虚函数重写在哪一阶段报错?
      • **1. 何时会报错?**
        • **(1)基类没有对应的虚函数**
        • **(2)函数签名不匹配**
        • **(3)基类函数非虚**
      • **2. 为什么在编译阶段报错?**
      • **3. 对比无 `override` 的情况**
      • **4. 最佳实践**
      • **总结**
    • 编译阶段的语义分析
        • **1. 预处理阶段(Preprocessing)**
        • **2. 编译阶段(Compilation)**
        • **3. 汇编阶段(Assembly)**
        • **4. 链接阶段(Linking)**
      • **为什么不是其他阶段?**
      • **示例验证**
      • **总结**
  • RAII
      • **RAII(资源获取即初始化)**
      • **RAII 的核心机制**
    • **1. 智能指针(Smart Pointers)**
      • **(1)`std::unique_ptr`(独占所有权)**
      • **(2)`std::shared_ptr`(共享所有权)**
      • **(3)`std::weak_ptr`(避免循环引用)**
    • **2. 文件操作(`std::fstream`)**
    • **3. 互斥锁管理(`std::lock_guard` / `std::unique_lock`)**
      • **(1)`std::lock_guard`(简单锁管理)**
      • **(2)`std::unique_lock`(更灵活的锁管理)**
    • **4. 容器管理(`std::vector`, `std::string` 等)**
    • **5. 数据库连接封装**
    • **6. 图形 API 资源管理(如 OpenGL/Vulkan)**
    • **7. 网络套接字管理(如 `std::unique_ptr<Socket>`)**
    • **8. 自定义 RAII 封装**
      • **示例:RAII 定时器**
    • **总结:C++ 中已有的 RAII 应用**

C++ 相对于 C 语言的主要区别


1. 面向对象编程(OOP)

  • C:是过程式语言,主要关注函数和流程控制。
  • C++:支持面向对象编程,提供:
    • 类(Class)对象(Object)
    • 封装(Encapsulation)public/private/protected
    • 继承(Inheritance)(单继承、多继承)
    • 多态(Polymorphism)(虚函数 virtual、函数重载、运算符重载)

2. 函数增强

  • 函数重载(Overloading)
    C++ 允许同名函数(参数不同),而 C 不允许。
    void print(int a); 
    void print(double a); // C++ 允许,C 不允许
    
  • 默认参数(Default Arguments)
    C++ 支持函数参数的默认值,C 不支持。
    void greet(const char* name = "User"); // C++ 允许
    
  • 内联函数(inline
    C++ 的 inline 是对编译器的建议,C 的 inline(C99)行为不同。

3. 内存管理

  • newdelete
    C++ 提供运算符动态分配内存,替代 C 的 malloc()/free(),并自动调用构造/析构函数。
    int* p = new int(10);  // C++
    delete p;
    
    int* p = (int*)malloc(sizeof(int)); // C
    free(p);
    

4. 引用(Reference)

  • C++ 支持引用(别名),提供更直观的语法,避免指针的复杂性。
    int a = 10;
    int& ref = a; // ref 是 a 的引用
    
  • C 只能通过指针实现类似功能。

5. 标准模板库(STL)

  • C++ 提供强大的 STL,包括:
    • 容器vectormapset 等)
    • 算法sort()find() 等)
    • 迭代器(Iterator)
  • C 需要手动实现这些数据结构或依赖第三方库。

6. 异常处理

  • C++ 支持 try/catch/throw 异常机制。
    try { throw runtime_error("Error"); }
    catch (const exception& e) { /* 处理异常 */ }
    
  • C 通常通过返回值或 errno 处理错误。

7. 类型安全增强

  • 类型转换:C++ 提供 static_castdynamic_cast 等,比 C 的强制转换更安全。
  • 布尔类型:C++ 有 bool 类型(true/false),C 通常用 int 代替。
  • const 更严格:C++ 中 const 是真正的常量(编译期优化),C 中可能退化为变量。

8. 其他特性

  • 命名空间(Namespace):避免全局命名冲突。
    namespace MyLib { void func(); }
    
  • 模板(Template):支持泛型编程。
    template <typename T> T max(T a, T b) { return a > b ? a : b; }
    
  • Lambda 表达式(C++11 起):
    auto f = [](int x) { return x * 2; };
    

9. 兼容性

  • C++ 几乎完全兼容 C(C99 标准),但少数地方存在差异:
    • C++ 中 void* 不能隐式转换到其他指针类型。
    • C++ 要求函数声明时必须指定参数类型(C 允许省略,默认为 int)。

多态

不同对象执行同一操作产生不同的行为。

总结

特性CC++
编程范式过程式过程式 + 面向对象 + 泛型
内存管理malloc/freenew/delete
函数特性无重载重载、默认参数、内联
异常处理try/catch
标准库简单强大的 STL
类型安全较弱更强(如 const、转型)

C++ 更适合大型项目,但复杂性也更高;C 更接近底层,适合系统编程或资源受限环境。

用了override没有对虚函数重写在哪一阶段报错?

在 C++ 中,override 关键字用于显式标记派生类中对基类虚函数的重写(Override)。如果使用了 override 但没有正确重写虚函数,编译器会在编译阶段直接报错,而不是等到运行时。这是 C++11 引入的重要特性,用于增强代码的安全性。


1. 何时会报错?

以下情况会导致编译错误:

(1)基类没有对应的虚函数
class Base {
public:void foo() {}  // 非虚函数
};
class Derived : public Base {
public:void foo() override {}  // 错误:Base 中没有可重写的虚函数
};

报错信息示例(GCC):

error: 'void Derived::foo()' marked 'override', but does not override
(2)函数签名不匹配

派生类函数的名称、参数列表或返回类型必须与基类虚函数完全一致(协变返回类型除外)。

class Base {
public:virtual void bar(int x) {}
};
class Derived : public Base {
public:void bar(double x) override {}  // 错误:参数类型不匹配
};

报错信息示例

error: 'void Derived::bar(double)' does not override 'virtual void Base::bar(int)'
(3)基类函数非虚
class Base {
public:void baz() {}  // 非虚函数
};
class Derived : public Base {
public:void baz() override {}  // 错误:基类函数不是虚函数
};

2. 为什么在编译阶段报错?

  • 静态检查override 的校验完全由编译器在编译时完成,无需运行时信息。
  • 早期发现错误:避免因拼写错误、参数不匹配等问题导致运行时未调用预期的函数(尤其是多态场景)。
  • 明确意图:显式表明开发者希望重写虚函数,而非意外定义新函数。

3. 对比无 override 的情况

如果不使用 override,且函数未正确重写虚函数,编译器可能不会报错,但会导致隐藏错误

class Base {
public:virtual void func(int x) {}
};
class Derived : public Base {
public:void func(double x) {}  // 未重写,而是隐藏了基类的 func(int)
};
int main() {Derived d;Base* b = &d;b->func(10);    // 调用 Base::func(int)d.func(10.5);   // 调用 Derived::func(double)
}

此时程序能编译,但可能不符合预期(多态失效)。


4. 最佳实践

  1. 始终用 override 标记重写:明确意图,让编译器帮助检查。
  2. 结合 virtualoverride
    • 基类虚函数用 virtual
    • 派生类重写函数用 override(无需重复 virtual)。
    class Base {
    public:virtual void method() const {}
    };
    class Derived : public Base {
    public:void method() const override {}  // 正确重写
    };
    
  3. 启用编译器警告:如 GCC/Clang 的 -Wsuggest-override 可提示遗漏的 override

总结

  • 报错阶段:编译时(静态检查)。
  • 作用:确保派生类函数正确重写基类虚函数,避免多态行为异常。
  • 重要性:提升代码健壮性,减少运行时调试难度。

编译阶段的语义分析

是的,override 关键字触发的错误检查发生在 编译阶段(即源代码被翻译成机器码的过程中),而不是预处理、汇编或链接阶段。具体来说,它属于 语法和语义分析 的范畴,由编译器(如 GCC、Clang、MSVC)在生成目标文件(.o/.obj)之前完成。


1. 预处理阶段(Preprocessing)
  • 任务:处理宏(#define)、头文件包含(#include)、条件编译(#ifdef)等。
  • override 的关系:无关。override 是 C++ 语法的一部分,不会被预处理指令影响。
2. 编译阶段(Compilation)
  • 关键步骤
    1. 词法分析:将源代码分解为令牌(tokens)。
    2. 语法分析:构建抽象语法树(AST)。
    3. 语义分析:检查类型、作用域、函数重写等规则。
      • 此时检查 override
        • 验证派生类函数是否确实重写了基类的虚函数。
        • 如果未找到匹配的基类虚函数,立即报错(如 error: 'override' method does not override any base class method)。
    4. 生成中间代码/汇编代码:通过校验后,继续后续优化和转换。
  • 结论override 的错误在 语义分析阶段 被捕获,属于编译阶段。
3. 汇编阶段(Assembly)
  • 任务:将编译器生成的汇编代码转换为机器码(目标文件 .o)。
  • override 的关系:无关。此时源代码已通过编译阶段的检查。
4. 链接阶段(Linking)
  • 任务:合并多个目标文件,解析外部符号(如函数调用)。
  • override 的关系:无关。链接阶段不会检查类的继承关系或虚函数重写。

为什么不是其他阶段?

  • 预处理阶段:仅处理文本替换,不分析语法或语义。
  • 汇编/链接阶段:只处理低级指令和符号地址,无法感知 C++ 的高层语义(如类继承)。

示例验证

假设有以下错误代码:

class Base {};
class Derived : public Base {
public:void foo() override {}  // 错误:Base 无虚函数 foo
};
  • 编译阶段报错(GCC 输出):
    error: 'void Derived::foo()' marked 'override', but does not override
    
  • 如果强制跳过编译阶段(如直接尝试链接已错误编译的目标文件),则根本不会生成有效目标文件,因为编译器已中止。

总结

  • 阶段归属override 的检查发生在 编译阶段(具体是语义分析子阶段)。
  • 优势:早期(编译时)发现错误,避免运行时多态行为异常。
  • 类似机制final= delete 等 C++11 特性也在编译阶段检查。

RAII

RAII(资源获取即初始化)

RAII(Resource Acquisition Is Initialization)是 C++ 的核心编程范式,其核心思想是:
资源的获取(如内存、文件句柄、锁等)与对象的生命周期绑定,通过对象的构造和析构自动管理资源,避免资源泄漏。


RAII 的核心机制

  1. 构造函数获取资源:对象创建时初始化资源(如打开文件、分配内存)。
  2. 析构函数释放资源:对象销毁时自动释放资源(如关闭文件、释放内存)。
  3. 异常安全:即使发生异常,析构函数仍会被调用,确保资源释放。

在 C++ 中,RAII(Resource Acquisition Is Initialization)已经被广泛应用于标准库和常见编程实践中。以下是 C++ 已有的 RAII 应用场景及其具体实现方式:


1. 智能指针(Smart Pointers)

智能指针是 RAII 最经典的实现,用于自动管理动态内存,避免内存泄漏。

(1)std::unique_ptr(独占所有权)

{std::unique_ptr<int> ptr(new int(42));  // 分配内存// 离开作用域时自动释放内存
}

特点

  • 禁止拷贝(unique_ptr 是独占的),但支持移动语义(std::move)。
  • 适用于单所有权场景(如工厂模式返回的资源)。

(2)std::shared_ptr(共享所有权)

{auto ptr = std::make_shared<int>(42);  // 引用计数 +1auto ptr2 = ptr;  // 引用计数 +2// 离开作用域时引用计数递减,计数为 0 时释放内存
}

特点

  • 基于引用计数,适用于多对象共享同一资源。
  • 可能产生循环引用问题(需结合 std::weak_ptr 解决)。

(3)std::weak_ptr(避免循环引用)

std::shared_ptr<A> a;
std::shared_ptr<B> b;
// 若 A 和 B 互相持有 shared_ptr,会导致内存泄漏
// 改用 weak_ptr 打破循环

2. 文件操作(std::fstream

C++ 标准库的文件流(ifstream/ofstream/fstream)采用 RAII 机制,自动管理文件句柄。

{std::ofstream file("data.txt");  // 打开文件file << "Hello, RAII!";         // 写入数据
} // 离开作用域时自动关闭文件

优势

  • 即使发生异常,文件也会被正确关闭。
  • 避免手动调用 file.close() 的遗漏。

3. 互斥锁管理(std::lock_guard / std::unique_lock

多线程编程中,锁的获取和释放必须严格配对,否则会导致死锁。RAII 锁机制确保锁的自动释放。

(1)std::lock_guard(简单锁管理)

std::mutex mtx;
{std::lock_guard<std::mutex> lock(mtx);  // 加锁// 临界区操作
} // 离开作用域时自动解锁

特点

  • 不可手动解锁,严格依赖作用域。

(2)std::unique_lock(更灵活的锁管理)

std::mutex mtx;
{std::unique_lock<std::mutex> lock(mtx);  // 加锁if (condition) {lock.unlock();  // 可手动解锁}
} // 如果未手动解锁,离开作用域时仍会自动解锁

特点

  • 支持延迟加锁、手动解锁,适用于条件变量(std::condition_variable)。

4. 容器管理(std::vector, std::string 等)

STL 容器(如 vectorstringmap)内部使用 RAII 管理动态内存。

{std::vector<int> vec = {1, 2, 3};  // 自动管理内存vec.push_back(4);
} // 离开作用域时自动释放内存

优势

  • 无需手动 delete[],避免内存泄漏。

5. 数据库连接封装

虽然 C++ 标准库不直接提供数据库支持,但第三方库(如 SQLite、MySQL Connector/C++)通常用 RAII 封装连接。

class DatabaseConnection {
public:DatabaseConnection() { connect();  // 构造函数建立连接}~DatabaseConnection() { disconnect();  // 析构函数关闭连接}
};{DatabaseConnection db;  // 自动连接// 执行查询
} // 离开作用域时自动断开连接

6. 图形 API 资源管理(如 OpenGL/Vulkan)

在图形编程中,GPU 资源(如纹理、缓冲区)必须显式释放,RAII 可避免资源泄漏。

class GLTexture {GLuint textureID;
public:GLTexture() { glGenTextures(1, &textureID);  // 创建纹理}~GLTexture() { glDeleteTextures(1, &textureID);  // 销毁纹理}
};{GLTexture tex;  // 纹理创建// 使用纹理
} // 离开作用域时自动释放

7. 网络套接字管理(如 std::unique_ptr<Socket>

网络编程中,套接字(Socket)需要正确关闭,RAII 可确保资源释放。

class Socket {int sockfd;
public:Socket() { sockfd = socket(AF_INET, SOCK_STREAM, 0); }~Socket() { close(sockfd);  // 关闭套接字}
};{Socket s;  // 创建套接字// 发送/接收数据
} // 离开作用域时自动关闭

8. 自定义 RAII 封装

如果标准库不提供现成的 RAII 封装,可以自行实现。

示例:RAII 定时器

class ScopedTimer {std::chrono::time_point<std::chrono::high_resolution_clock> start;
public:ScopedTimer() : start(std::chrono::high_resolution_clock::now()) {}~ScopedTimer() {auto end = std::chrono::high_resolution_clock::now();std::cout << "Elapsed: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms\n";}
};{ScopedTimer timer;  // 开始计时// 执行某些操作
} // 离开作用域时自动打印耗时

总结:C++ 中已有的 RAII 应用

场景标准库/第三方实现作用
内存管理std::unique_ptr / std::shared_ptr自动释放堆内存
文件操作std::fstream自动关闭文件句柄
线程锁管理std::lock_guard / std::unique_lock自动解锁,避免死锁
容器管理std::vector, std::string自动管理动态内存
数据库连接第三方封装(如 SQLite)自动断开连接
图形 API 资源OpenGL/Vulkan RAII 封装自动释放 GPU 资源
网络套接字自定义 RAII 类自动关闭 Socket
计时器/性能分析自定义 RAII 类自动记录耗时

RAII 的核心思想资源生命周期 == 对象生命周期,利用 C++ 的析构机制自动释放资源,避免手动管理带来的错误。

相关文章:

【面试】C++与C override的报错阶段 RAII

文章目录 C 相对于 C 语言的主要区别**1. 面向对象编程&#xff08;OOP&#xff09;****2. 函数增强****3. 内存管理****4. 引用&#xff08;Reference&#xff09;****5. 标准模板库&#xff08;STL&#xff09;****6. 异常处理****7. 类型安全增强****8. 其他特性****9. 兼容…...

LeetCode 3396.使数组元素互不相同所需的最少操作次数:O(n)一次倒序遍历

【LetMeFly】3396.使数组元素互不相同所需的最少操作次数&#xff1a;O(n)一次倒序遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-number-of-operations-to-make-elements-in-array-distinct/ 给你一个整数数组 nums&#xff0c;你需要确保数组中的元素…...

机器学习课堂7用scikit-learn库训练SVM模型

1.用scikit-learn库训练SVM模型 代码 # 2-11用scikit-learn库训练SVM模型 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn import svm # 导入sklearn# 参数设置 m_train 250 # 训练样本数量 svm_C 100 # SVM的C值 svm_kernel …...

模拟考试系统(ssm+vue+mysql5.x)

模拟考试系统(ssmvuemysql5.x) 模拟考试系统是一个为考试准备和管理提供全面支持的平台。系统提供了丰富的功能模块&#xff0c;包括个人中心、科目管理、复习资料管理、参考文献管理、用户管理、留言板管理、试题管理、试卷管理、系统管理和考试管理。用户可以在个人中心修改…...

【计网】作业4

一. 单选题&#xff08;共22题&#xff0c;64分&#xff09; 1. (单选题)主机甲采用停止-等待协议向主机乙发送数据&#xff0c;数据传输速率是4kb/s&#xff0c;单向传播时延为30ms&#xff0c;忽略确认帧的发送时延。当信道利用率等于80%时&#xff0c;数据帧的长度为&#…...

MYSQL数据库语法补充

一&#xff0c;DQL基础查询 DQL&#xff08;Data Query Language&#xff09;数据查询语言&#xff0c;可以单表查询&#xff0c;也可以多表查询 语法&#xff1a; select 查询结果 from 表名 where 条件&#xff1b; 特点&#xff1a; 查询结果可以是&#xff1a;表中的字段…...

Java基础编程练习第38题-除法器

题目&#xff1a;编写一个除法器&#xff0c;输入被除数和除数&#xff0c;并将结果输出。 这道题看似很简单&#xff0c;实则也不难。 就是假如用户输入的类型不同怎么办呢&#xff1f;用户输入int或者double类型应该怎么解决。这里我们就需要用到函数的重载。 代码如下&am…...

【基于Vue3组合式API的互斥输入模式实现与实践分享】

基于Vue3组合式API的互斥输入模式实现与实践分享 目录 背景与痛点设计思路技术实现使用场景与案例遇到的问题与解决方案最佳实践总结 1. 背景与痛点 在表单交互设计中&#xff0c;我们经常面临这样的场景&#xff1a;多种输入方式互斥。例如&#xff0c;在评分系统中&#…...

Linux进程概念及理解

目录 冯诺依曼体系结构 操作系统(Operator System) 概念 设计OS的目的 定位 如何理解 "管理" 总结 系统调用和库函数概念 进程 基本概念 描述进程-PCB task_struct-PCB的一种 task_ struct内容分类 组织进程 查看进程 通过系统调用获取进程标示符 通过系统调用创建进…...

苹果签名是否安全

苹果开发者与运营商都对苹果签名有一定了解&#xff0c;那么苹果签名安全吗&#xff1f;下面我来跟大家聊一聊。 苹果签名能验证应用的来源&#xff0c;但存在一些风险&#xff0c;有开发者伪造签名&#xff0c;让用户认为此产品是可信的&#xff0c;这样就安装到了恶意应用&am…...

STM32在裸机(无RTOS)环境下,需要手动实现队列机制来替代FreeRTOS的CAN发送接收函数

xQueueSendToBackFromISR(ecuCanRxQueue, hcan->pRxMsg, &xHigherPriorityTaskWoken)&#xff0c;xQueueReceive(mscCanRxQueue,&mscRxMsg,0)和xQueueSendToBack(mscCanTxQueue, &TxMessageTemp, 0 )这3个函数&#xff0c;在裸机下实现&#xff1a; 在裸机&…...

无法看到新安装的 JDK 17

在 Linux 系统中使用 update-alternatives --config java 无法看到新安装的 JDK 17&#xff0c;可能是由于 JDK 未正确注册到系统备选列表中。 一、原因分析 JDK 未注册到 update-alternatives update-alternatives 工具需要手动注册 JDK 路径后才能识别新版本。如果仅安装 JDK…...

JavaEE——线程的状态

目录 前言1. NEW2. TERMINATED3. RUNNABLE4. 三种阻塞状态总结 前言 本篇文章来讲解线程的几种状态。在Java中&#xff0c;线程的状态是一个枚举类型&#xff0c;Thread.State。其中一共分为了六个状态。分别为&#xff1a;NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING, TERMI…...

数据结构与算法-数学-(同余,线性同余方程,中国剩余定理,卡特兰数,斯特林数)

同余方程&#xff1a; 1.1 线性同余方程 & 乘法逆元 线性同余方程是形如 ax≡b(mod m) 的方程&#xff0c;可转化为 axmyb 的线性不定方程&#xff0c;利用扩展欧几里得算法求解。当 b1 时&#xff0c;x 就是 a 在模 m 意义下的乘法逆元。 代码&#xff1a; #include &…...

RAG 系统中的偏差是什么?

检索增强生成 (RAG) 在减少模型幻觉和增强大型语言模型 (LLM)的领域特定知识库方面已获得广泛认可。通过外部数据源佐证大型语言模型生成的信息&#xff0c;有助于保持模型输出的新鲜度和真实性。然而&#xff0c;最近在 RAG系统中的发现&#xff0c;突显了基于 RAG 的大型语言…...

[创业之路-362]:用确定性的团队、组织、产品开发流程和方法,应对客户、市场、竞争和商业模式的不确定性。

在充满不确定性的商业环境中&#xff0c;通过确定性的团队、组织、产品开发流程和方法构建核心竞争力&#xff0c;是应对客户、市场、竞争和商业模式变化的核心策略。以下从团队韧性、组织敏捷、产品开发闭环三个维度&#xff0c;结合实战方法论&#xff0c;提供可落地的解决方…...

系统与网络安全------网络通信原理(1)

资料整理于网络资料、书本资料、AI&#xff0c;仅供个人学习参考。 文章目录 网络通信模型协议分层计算机网络发展计算机网络功能什么是协议为什么分层邮局实例 OSI模型OSI协议模型OSI七层模型OSI七层的功能简介 TCP/IP模型OSI模型与TCP/IP模型TCP/IP协议族的组成各层PDU设备与…...

ArkTS语言基础之函数

前言 臭宝们终于来到了ArkTS基础之函数&#xff0c;今天我们来学习一下ArkTS的函数的相关知识&#xff0c;上一节中也有一些函数的基础知识。 函数声明 函数声明引入一个函数&#xff0c;包含其名称、参数列表、返回类型和函数体,在下面的例子中&#xff0c;我们声明了一个名…...

synchronized锁升级的锁对象和Mark Word

在讨论synchronized锁升级和Mark Word时&#xff0c;提到的"对象"通常指的是锁对象&#xff0c;也就是被用作synchronized同步锁的那个Java对象。 1. 什么是锁对象&#xff1f; 锁对象是指被用于synchronized同步代码块或方法的对象实例。例如&#xff1a; // 这个…...

数据结构|排序算法(二)插入排序 希尔排序 冒泡排序

一、插入排序 1.算法思想 插入排序&#xff08;Insertion Sort&#xff09;是一种简单的排序算法&#xff0c;其基本思想是&#xff1a;将待排序的元素插入到已经有序的序列中&#xff0c;从而逐步构建有序序列。 具体过程如下&#xff1a; 把待排序的数组分为已排序和未排…...

12、主频和时钟配置实验

一、I.MX6U 时钟系统详解 1、系统时钟来源 开发板的系统时钟来源于两部分: 32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源, 24MHz 晶振是 I.MX6U 内核和其它外设的时钟源。 2、7路PLL时钟源 I.MX6U 的外设有很多,不同的外设时钟源不同, NXP 将…...

DFS和BFS的模版

dfs dfs金典例题理解就是走迷宫 P1605 迷宫 - 洛谷 dfs本质上在套一个模版&#xff1a; ///dfs #include<bits/stdc.h> using namespace std; int a[10][10]{0}; int m,n,t,ans0; int ex,ey; int v[10][10]{0}; int dx[4]{-1,0,1,0}; int dy[4]{0,1,0,-1}; void dfs(in…...

docker镜像导出导入

在Docker中&#xff0c;可以很容易地导出和导入镜像&#xff0c;这对于备份、迁移或者在不同的环境中共享镜像非常有用。以下是操作步骤&#xff1a; 导出镜像 使用 docker save docker save 命令可以用来将一个或多个镜像保存到一个文件中&#xff0c;这个文件可以被导入到任…...

大模型Agent | 构建智能体 AI-Agent的 5大挑战,及解决方案!

源自: AINLPer&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2025-4-7 更多&#xff1a;>>>>专注大模型/AIGC、学术前沿的知识分享&#xff01; 引言 AI-Agent正变得越来越智能&#xff0c;它能够根据用户需…...

基于STM32、HAL库的IP2721 快充协议芯片简介及驱动程序设计

一、简介: IP2721是一款高性能的USB PD (Power Delivery)协议控制器芯片,主要用于USB Type-C接口的电源管理。它支持USB PD 3.0规范,能够实现多种电压和电流的协商,广泛应用于充电器、移动电源等设备。 主要特性: 支持USB PD 3.0规范 支持Type-C接口的DRP/SRC/SNK模式 内…...

荣耀90 GT信息

外观设计 屏幕&#xff1a;采用 6.7 英寸 AMOLED 荣耀绿洲护眼屏&#xff0c;超窄边框设计&#xff0c;其上边框 1.6mm&#xff0c;左右黑边 1.25mm&#xff0c;屏占较高&#xff0c;带来更广阔的视觉体验。屏幕还支持 120Hz 自由刷新率&#xff0c;可根据使用场景自动切换刷新…...

53. 评论日记

要自己有判断是非的能力宝子们。#小米 #小米su7 #雷军 #神操作 #小米su7ultra_哔哩哔哩_bilibili 2025年4月8日19:30:57...

【10】搭建k8s集群系列(二进制部署)之安装Dashboard和CoreDNS

一、部署Dashboard 1.1、创建kubernetes-dashboard.yaml文件 完整的yaml配置文件信息如下&#xff1a; # Copyright 2017 The Kubernetes Authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in …...

【算法手记12】DP25 删除相邻数字的最大分数

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:刷题 ⚙️操作环境:牛客网 目录 一.DP25 删除相邻数字的最大分数 题目详情: 题目思路: 解题代码: 结语 一.DP25 删除相邻数字的最大分数 牛客网题目链接(点击即可跳转):DP25 删除相邻数字的最大分数 题目详情: 本题详情如…...

[Godot] C#简单实现人物的控制和动画

目录 实现效果 场景搭建 脚本实现 移动 动画 完整脚本 相机跟随 总结 实现效果 场景搭建 本文章只分享了关于移动和动画的&#xff0c;没有给碰撞体&#xff0c;大家根据需要自行添加吧 相机的缩放大小可以根据自己的需要调整 我的人物动画结构是这样的&#xff0c;待机动…...

选择站群服务器租用的优势都有什么?

站群服务器是一种专门用于托管多个网站的服务器&#xff0c;是通过集中管理和资源分配&#xff0c;可以支持同时运行数十个甚至是数百个独立网站&#xff0c;站群服务器的主要特点就是让每个网站可以分配独立的IP地址&#xff0c;避免出现IP关联风险&#xff0c;通过统一控制面…...

VS Code下开发FPGA——FPGA开发体验提升__下

上一篇&#xff1a;IntelliJ IDEA下开发FPGA-CSDN博客 Type&#xff1a;Quartus 一、安装插件 在应用商店先安装Digtal IDE插件 安装后&#xff0c;把其他相关的Verilog插件禁用&#xff0c;避免可能的冲突。重启后&#xff0c;可能会弹出下面提示 这是插件默认要求的工具链&a…...

leetcode13.罗马数字转整数

遍历&#xff0c;下一个值不大于当前值就加上当前值&#xff0c;否则就减去当前值 class Solution {public int romanToInt(String s) {Map<Character, Integer> map Map.of(I, 1,V, 5,X, 10,L, 50,C, 100,D, 500,M, 1000);int sum 0;for (int i 0; i < s.length(…...

WVP-PRO配置与部署

ZLMediaKit部署与配置 https://blog.csdn.net/qq_38179971/article/details/147043763MySQL8.0.13安装[Ubuntu16.04] cd /usr/local/src wget http://soft.vpser.net/lnmp/lnmp1.6.tar.gz -cO lnmp1.6.tar.gz && tar zxf lnmp1.6.tar.gz && cd lnmp1.6 &…...

opencv图像库编程

目录 一、Linux搭建C OpenCV开发环境1.安装必要依赖项2.安装opencv3、cmake分析4、验证安装 二、编写一个打开图片进行特效显示的代码 test.cpp1.gcc方式编译1&#xff09;在opencv3.4.5下新建mytest文件夹2&#xff09;创建test.cpp3&#xff09;编译 2.makemakefile方式编译3…...

【Easylive】定时任务-每日数据统计和临时文件清理

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 这个定时任务系统主要包含两个核心功能&#xff1a;每日数据统计和临时文件清理。下面我将详细解析这两个定时任务的实现逻辑和技术要点&#xff1a; Component Slf4j public class SysTas…...

搜广推校招面经七十

美团暑期推荐实习 一、讲一下self-attention&#xff0c;qkv的含义。 见【搜广推校招面经五】 二、讲一下协同过滤召回&#xff0c;新闻推荐项目为什么不用usercf? 见【搜广推校招号面经六十四】 三、介绍信息增益公式&#xff08;Information Gain&#xff09; 见【搜广…...

TypeScript 泛型详解及应用场景

泛型&#xff08;Generics&#xff09;是 TypeScript 的核心特性&#xff0c;它允许我们编写可复用、类型安全的代码&#xff0c;同时保持灵活性。以下是深度解析和实际应用指南&#xff1a; 一、泛型基础概念 本质&#xff1a;参数化类型&#xff0c;将类型作为变量传递&…...

Proximal Policy Optimization (PPO)2017

2.1 策略梯度方法 策略梯度方法计算策略梯度的估计值并将其插入到随机梯度上升算法中。最常用的梯度估计器的形式如下&#xff1a; g ^ E t [ ∇ θ log ⁡ π θ ( a t ∣ s t ) A ^ t ] (1) \hat{g} \mathbb{E}_t \left[ \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) \h…...

使用 Google ML Kit 实现图片文字识别(提取美国驾照信息)

Google ML Kit 是一个现代、功能强大、跨平台的机器学习 SDK。在这篇文章中&#xff0c;我们将使用 ML Kit 在 Android 应用中识别图片文字&#xff0c;以提取美国驾照上的关键信息&#xff1a;DL&#xff08;驾照号&#xff09; 和 EXP&#xff08;有效日期&#xff09;。 &am…...

VR体验馆如何用小程序高效引流?3步打造线上预约+团购裂变系统

VR体验馆如何用小程序高效引流&#xff1f;3步打造线上预约团购裂变系统 一、线上预约的核心价值&#xff1a;优化体验&#xff0c;提升转化​​ ​​减少客户等待时间​​ 通过小程序预约功能&#xff0c;客户可提前选择体验时段&#xff0c;避免到店排队。数据显示&#…...

前端知识(vue3)

1.Vue3 1.1 介绍 Vue&#xff08;读音 /vjuː/, 类似于 view&#xff09;是一款用于构建用户界面的渐进式的JavaScript框架 官网&#xff1a;https://cn.vuejs.org 1.2 常见指令 指令&#xff1a;指的是HTML 标签上带有 v- 前缀的特殊属性&#xff0c;不同指令具有不同含义…...

nginx 代理 https 接口

代码中需要真实访问的接口是&#xff1a;https://sdk2.028lk.com/application-localizationdev.yml文件中配置&#xff1a; url: http:/111.34.80.138:18100/sdk2.028lk.com/该服务器111.34.80.138上 18100端口监听&#xff0c;配置信息为&#xff1a; location /sdk2.028lk.c…...

网络带宽测速工具选择指南iperf3 nttcp tcpburn jperf使用详解

简介 本文主要介绍内网&#xff08;局域网&#xff09;与外网&#xff08;互联网&#xff09;的网络带宽测速工具下载地址、选择指南、参数对比、基本使用。 测速工具快速选择指南 测速工具下载地址 iperf 官网下载链接&#xff1a;iperf.fr/iperf-download.php该链接提供了不…...

解决TF-IDF增量学习问题的思路与方案

TF-IDF的传统实现面临增量学习困难&#xff0c;因为IDF计算依赖全局文档统计信息。但是实际的工作当中往往数据是增量的&#xff0c;并且定期增量和不定期增量混合&#xff0c;所以为了实际考虑&#xff0c;还是有必要思考如何解决TF-IDF增量问题的。 一、增量学习核心挑战 ID…...

【亲测】Linux 使用 Matplotlib 显示中文

文章目录 安装中文字体在Matplotlib中使用该字体来显示中文 在 Linux 系统中使用 Matplotlib 绘制图表时&#xff0c;如果需要显示中文&#xff0c;可能会遇到中文字符显示为方块或者乱码的问题。这是因为Matplotlib 默认使用的字体不支持中文。本文手把手带你解决这个问题。 …...

git clone阻塞问题

问题描述 git clone采用的ssh协议&#xff0c;在克隆仓库的时候&#xff0c;会经常卡一下&#xff0c;亦或是直接卡死不动。 最开始以为是公司电脑配置的问题&#xff0c;想着自己实在解决不了找it帮忙。 查阅资料发现&#xff0c;最终发现是git版本的问题&#xff0c;这个是…...

Json快速入门

引言 Jsoncpp 库主要是用于实现 Json 格式数据的序列化和反序列化&#xff0c;它实现了将多个数据对象组织成 为Json格式字符串&#xff0c;以及将 Json 格式字符串解析得到多个数据对象的功能&#xff0c;独立于开发语言。 Json数据对象 Json数据对象类的表示&#xff1a; …...

【QT】学习笔记1

QT概述 Qt是一个1991年由QtCompany开发的跨平台C图形用户界面应用程序开发框架。它既可以开发GUI程序&#xff0c;也可用于开发非GUI程序&#xff0c;比如控制台工具和服务器。Qt是面向对象的框架&#xff0c;使用特殊的代码生成扩展&#xff08;称为元对象编译器&#xff08;…...

【Kafka基础】生产者命令行操作指南:从基础到高级配置

Kafka作为分布式消息系统&#xff0c;其生产者是数据管道的起点。掌握kafka-console-producer.sh工具的使用对于开发测试和运维都至关重要。本文将系统介绍该工具的各种用法&#xff0c;帮助您高效地向Kafka发送消息。 1 基础消息生产 1.1 最简单的消息发送 /export/home/kafk…...