浩江星灿面试(c++)

量化工程师:提供实时的数据,为炒股提供依据;稳定,快,准确;
对于性能的要求比较高;

文章目录

    • `题目一、延迟最低的IPC(Inter-Process Communication)通信方式是什么?`
    • `题目二、找出下面代码中存在的性能问题,并给出优化和改进原因。`
    • 题目三、malloc和new的区别?
    • 题目四、操作系统执行可执行程序时,内存分配是怎样的?
    • 题目五、请说出const与#define相比,有何优点?
    • 题目六、内存的分配方式有几种?
    • 题目七、C++中,++i是左值还是右值,++i和i++哪个效率更高?
    • 题目八、为什么会有栈溢出,为什么栈会设置容量?
    • 题目九、什么是函数内联(Function Inlining)?它对程序性能有什么影响?
    • 题目十、如何避免内存泄漏和内存碎片化来提高C+程序的性能?
    • 题目十一、讨论下虚函数(Virtual Function)的内部实现机制,以及虚函数带来的性能产生的?
    • 题目十二、怎么解决共享内存多进程读写的竞争问题?

题目一、延迟最低的IPC(Inter-Process Communication)通信方式是什么?

解析:
在计算机科学中,进程间通信(IPC)是指在不同进程或线程之间传递数据和信息的过程。不同的IPC机制有其自身的特点和适用场景,延迟最低的IPC通信方式可能因具体应用和需求而异。以下是一些常见的、延迟较低的IPC通信方式:
(1)共享内存:通过将一块内存区域映射到多个进程的地址空间中,这些进程可以直接读写这块内存。这种方式不需要系统调用,因此延迟较低。但是,需要正确处理同步问题,以避免数据竞争。
(2)消息队列:消息队列允许进程通过发送和接收消息进行通信。消息队列中的消息可以包含各种类型的数据,包括文本、二进制数据等。这种方式的延迟通常比共享内存更高,因为它涉及到系统调用和内核态的数据复制。
(3)管道(Pipe):管道是一种半双工的IPC通信方式,它允许两个进程之间进行单向通信。管道的延迟通常比其他IPC机制更低,因为它使用了内核缓冲区来传输数据。
(4)信号量:信号量是一种用于同步进程和线程的机制。它们可以用来控制对共享资源的访问,确保在任何给定时间只有有限数量的进程可以访问该资源。信号量的延迟通常很低,因为它们只是简单地维护一个计数器。
(5)套接字(Socket):套接字是一种网络编程接口,它允许不同主机上的进程进行通信。虽然套接字的延迟通常高于其他IPC机制,但它们提供了更强大的网络通信能力。
(6)远程过程调用(RPC):RPC是一种分布式计算模型,它允许客户端程序调用远程服务器上的函数。虽然RPC的延迟通常高于其他IPC机制,但它提供了更强大的远程服务调用能力。
所以:选择哪种IPC机制取决于具体的应用场景和需求。在设计系统时,应该根据性能要求、可靠性要求、以及系统复杂性等因素综合考虑。

正确答案:共享内存;

题目二、找出下面代码中存在的性能问题,并给出优化和改进原因。

std::string remove_ctrl(std::string s){
std::string result;
for (int i =0;i <s.length();++i)(if(s[i]>=0x20){result = result +s[i];}}
return result;
}

解析:
代码缺陷:
1. 性能效率时间特性(低效的字符串操作): 在循环中使用+运算符连接字符串会导致不断地创建和销毁临时对象,这在循环中是极其低效的。
2. 可靠性成熟性(内存越界-基于范围的for循环): 循环中的索引变量i没有定义,可能会导致未定义行为。
3. 可靠性成熟性(内存越界-基于范围的for循环): 循环中的条件i < s.length()可能导致越界访问,因为s.length()返回的是无符号整数类型,当i为负数时可能会发生溢出。

正确答案:
std::string remove_ctrl(std::string s) {std::string result;for (size_t i = 0; i < s.length(); ++i) {if (s[i] >= 0x20) {result.push_back(s[i]);}}return result;
}
优化和改进原因:
  1. 使用push_back方法替换+运算符来连接字符串,避免了不必要的临时对象创建和销毁。
  2. 使用size_t类型来确保索引变量的正确类型,并避免潜在的溢出问题。
  3. 使用基于范围的for循环,简化代码并避免潜在的越界问题。

题目三、malloc和new的区别?

答案:
mallocnew 都是 C++ 中用于动态内存分配的函数,但它们之间有一些关键的区别:

  1. 内存分配方式:

    • malloc 是 C 语言中的标准库函数,它只分配所需大小的原始内存块。如果需要初始化为零,则需要手动进行。
    • new 是 C++ 中的操作符,它在分配内存的同时调用构造函数来初始化对象。
  2. 返回类型:

    • malloc 返回 void* 类型的指针,这意味着您需要自己强制转换为适当的类型以便使用。
    • new 返回的是实际类型的指针,无需进行类型转换。
  3. 异常处理:

    • malloc 不提供异常处理机制,如果内存分配失败,它会返回 NULL
    • new 在内存分配失败时会抛出 std::bad_alloc 异常。
  4. 构造函数调用:

    • malloc 不会调用任何构造函数,因此您需要手动初始化分配的内存。
    • new 会在分配内存的同时调用构造函数,确保对象被正确初始化。
  5. 内存管理:

    • malloc 分配的内存需要手动释放,否则会导致内存泄漏。
    • new 分配的内存会在对象生命周期结束时自动调用析构函数并释放内存。
  6. 重载:

    • malloc 不能被重载,因为它不是 C++ 的一部分。
    • new 可以被重载以支持自定义内存分配行为。
  7. 内存对齐:

    • malloc 可能无法保证内存的对齐,这取决于平台和实现。
    • new 通常会保证内存的对齐,以支持某些硬件平台上的高效访问。
  8. 内存大小:

    • malloc 允许分配任意大小的内存块,包括零字节。
    • new 可能会根据特定的数据类型或结构体的大小来分配更大的内存块。
      总之,mallocnew 在功能上有所不同,new 提供了更多的功能和异常处理,而 malloc 则是 C 语言的遗留物。在现代 C++ 代码中,推荐使用 new 来分配和管理动态内存。

题目四、操作系统执行可执行程序时,内存分配是怎样的?

操作系统执行可执行程序时,内存分配通常涉及以下几个步骤:
1 加载可执行文件:操作系统首先需要将可执行文件从磁盘或其他存储设备加载到内存中。这通常通过读取文件内容并将其复制到内存中的特定区域来完成。
2 分配内存段:一旦可执行文件被加载到内存中,操作系统会为该程序分配一个连续的内存区域,称为“进程地址空间”。这个内存区域包含了程序代码、数据、堆栈等。
3 初始化堆和栈:操作系统会在进程的地址空间中为堆和栈分配内存。堆用于动态内存分配,而栈用于函数调用和局部变量的存储。
4设置环境变量:操作系统会设置一些环境变量,如命令行参数、环境变量等,这些信息对于程序运行是必要的。
5 设置程序计数器:程序计数器(PC)指向程序的入口点,即程序开始执行的地方。
6 启动程序:最后,操作系统将控制权转移给程序,程序开始执行。
在不同的操作系统中,内存分配策略可能会有所不同,但上述步骤通常是通用的。例如,Windows 和 Linux 都有自己的内存管理机制,包括虚拟内存、分页等技术,以确保程序能够安全地访问内存。

题目五、请说出const与#define相比,有何优点?

const#define 是两种在 C++ 中定义常量的方式,它们之间有一些关键的区别:

  1. 类型安全:

    • const 是一种编译时常量,它具有类型信息,这意味着您不能将非 const 变量赋值给一个 const 变量。
    • #define 宏定义只是简单的文本替换,没有类型检查,可能会导致类型不匹配的问题。
  2. 作用域:

    • const 变量具有块级作用域,这意味着它们只能在定义它们的块内使用。
    • #define 宏定义没有作用域限制,它们可以在整个文件或项目中使用。
  3. 内存占用:

    • const 变量在编译时被替换为其值,因此不会占用额外的运行时内存。
    • #define 宏定义会在代码中进行文本替换,这可能会增加程序的大小。
  4. 调试和错误检测:

    • const 变量可以通过编译器来确保它们没有被修改,这有助于防止错误。
    • #define 宏定义没有这样的机制,如果宏定义被错误地修改,可能不会在编译时被发现。
  5. 可读性和维护性:

    • const 变量使代码更易于阅读和理解,因为它们明确表示了变量是不可变的。
    • #define 宏定义可能会使代码难以理解,因为它们隐藏了实际的值。
  6. 性能:

    • const 变量通常比 #define 宏定义更快,因为它们在编译时就已经确定了值。
    • #define 宏定义可能会在运行时进行计算,这可能会引入额外的开销。
      总之,const 是一种更安全、更高效、更易于维护的定义常量的方式。在现代 C++ 代码中,推荐使用 const 来定义常量,除非有特定的原因需要使用 #define

题目六、内存的分配方式有几种?

内存的分配方式主要有以下几种:

  1. 静态内存分配:在编译时确定内存大小,通常用于全局变量、静态变量和常量数据。
  2. 栈内存分配:由编译器自动管理,用于存储函数的局部变量、临时变量等。每个函数调用都会在栈上分配新的内存空间,并在函数返回时释放。
  3. 堆内存分配:由程序员显式控制,用于动态创建和销毁对象。使用 newdelete 运算符来分配和释放内存。
  4. 全局/静态存储区:存放全局变量和静态变量。
  5. 常量存储区:存放常量数据,如字符串字面量和其他常量值。
  6. 代码段:存放程序的机器语言指令。
  7. 自由存储区:由 mallocfree 函数管理,用于动态分配和释放内存。
  8. 线程栈:每个线程都有自己的栈内存,用于存储局部变量、临时变量等。
  9. 动态链接库(DLL):在运行时加载和卸载的代码模块,它们可以在进程间共享。
    这些分配方式各有优缺点,选择哪种取决于具体的应用场景和需求。在设计系统时,应该根据性能要求、可靠性要求、以及系统复杂性等因素综合考虑。

题目七、C++中,++i是左值还是右值,++i和i++哪个效率更高?

在C++中,++ii++ 都是自增运算符,它们都会将变量的值增加1。然而,这两种写法的结果是不同的,因为它们的执行顺序不同。
答案:

  • ++i 是先进行自增操作,然后返回自增后的值。
  • i++ 是先返回当前值,然后再进行自增操作。

因此,++i 是一个左值表达式,它可以出现在赋值语句的左侧。例如:

int i = 0;
++i = 5; // 合法,i现在为5

关于效率问题,通常来说 ++ii++ 的效率是相等的,因为它们都涉及到对内存的读取、增加和写入操作。现代编译器可能会优化这些操作以提高效率,但通常不会有明显的性能差异。
如果您需要选择其中一个作为代码风格的一部分,建议根据个人喜好和团队约定来决定。通常来说,++ii++ 在功能上是等价的,所以选择哪种主要取决于代码的可读性和个人偏好。

题目八、为什么会有栈溢出,为什么栈会设置容量?

答案:栈溢出(Stack Overflow)是指当程序试图将更多的数据压入一个已经满了的栈时发生的错误。这通常是因为程序中的递归调用过深,或者在循环中不正确地使用了局部变量,导致栈空间被大量消耗。
设置栈容量是为了限制栈的大小,以防止栈溢出的发生。如果栈空间不足,程序可能会尝试写入超过其容量的内存区域,从而导致未定义的行为,如程序崩溃或系统级错误。
栈容量的设置是根据程序的需求和操作系统的限制来确定的。在某些情况下,栈容量可能需要手动设置,例如在嵌入式系统或操作系统开发中。在一般的桌面应用程序中,栈容量通常是由操作系统在启动时分配的,并且通常不会受到程序员的控制。

为了避免栈溢出,应该遵循以下原则:

  1. 避免无限递归:确保递归调用的深度不会超过栈的容量。
  2. 减少局部变量的使用:尽量使用全局变量或堆分配的内存,而不是在函数内部声明大量的局部变量。
  3. 优化循环和递归:通过重构代码来消除不必要的递归或循环,或者使用迭代方法替代递归。
  4. 检查栈使用情况:使用工具来检测和分析程序中栈的使用情况,以便及时发现潜在的栈溢出问题。

题目九、什么是函数内联(Function Inlining)?它对程序性能有什么影响?

函数内联(Function Inlining)是一种编译器优化技术,它将函数调用替换为函数体的直接代码。这样做可以减少函数调用的开销,包括保存和恢复寄存器、跳转到函数地址等。

函数内联通常有以下优点:

  1. 性能提升:通过消除函数调用的开销,内联函数可以更快地执行。这对于那些被频繁调用的短小函数尤其有效。
  2. 代码膨胀减少:内联函数的代码会直接插入到调用点,从而减少了函数调用所需的代码量。
  3. 代码简化:内联函数可以使代码更加简洁,因为您不需要单独定义和调用函数。
  4. 更好的编译时优化:内联函数可以帮助编译器进行更多的优化,例如常量折叠、循环展开等。

然而,函数内联也有一些潜在的缺点:

  1. 代码膨胀增加:如果内联的函数体过大,可能会导致生成的代码过大,从而影响缓存效率。
  2. 编译时间增加:内联函数的代码需要在编译时插入到调用点,这可能会增加编译时间。
  3. 调试困难:由于内联函数的代码直接插入到了调用点,这可能会使得调试变得更加困难。
  4. 代码重构难度增加:如果一个函数被内联,那么对该函数的任何修改都需要重新编译整个程序,这可能会增加代码重构的难度。
    在实际应用中,是否应该使用函数内联通常取决于具体的应用场景和需求。在设计系统时,应该根据性能要求、可靠性要求、以及系统复杂性等因素综合考虑。

题目十、如何避免内存泄漏和内存碎片化来提高C+程序的性能?

避免内存泄漏和内存碎片化是提高C++程序性能的重要手段。以下是一些常见的策略:

  1. 使用智能指针
    • 智能指针(如 std::unique_ptrstd::shared_ptr)可以自动管理动态分配的内存,从而减少内存泄漏的风险。
    • 在使用智能指针时,应根据需要选择合适的类型(独占或共享所有权)。
  2. 正确处理异常
    • 确保在抛出异常时,所有局部对象都被正确销毁,以防止内存泄漏。
    • 使用 try-catch 块来捕获和处理异常,并在 catch 块中释放资源。
  3. 避免循环引用
    • 循环引用是指两个对象相互持有对方的引用,导致它们无法被正常删除。
  • 使用弱指针(如 std::weak_ptr)可以打破这种循环引用,从而避免内存泄漏。
  1. 合理使用内存池
    • 内存池是一种预先分配大量内存的技术,用于快速分配和回收小型对象。
    • 在需要频繁创建和销毁大量相似对象的场景中,内存池可以显著提高性能。
  2. 优化数据结构
    • 选择合适的数据结构可以减少内存分配和释放的次数,从而降低内存碎片化。
    • 例如,使用更高效的容器类(如 std::vectorstd::list)可以减少内存分配和复制的开销。
  3. 定期清理无用资源
    • 对于长时间不使用的资源,应该及时释放它们以避免内存泄漏。
    • 可以通过定时清理、延迟清理或显式清理等方式来实现。
  4. 监控和分析内存使用情况
    • 使用内存分析工具(如 Valgrind)可以帮助检测和定位内存泄漏和内存碎片化问题。
    • 这些工具可以提供详细的内存使用报告,帮助开发者优化代码。
      总之,避免内存泄漏和内存碎片化需要开发者对内存管理有深入的理解,并采取有效的措施来管理动态内存分配。在实际应用中,应该根据具体的应用场景和需求来选择合适的策略。

题目十一、讨论下虚函数(Virtual Function)的内部实现机制,以及虚函数带来的性能产生的?

虚函数(Virtual Function)是面向对象编程中的一种重要特性,它允许在基类中定义一个函数,并在派生类中重写该函数。这种机制使得我们可以通过基类指针调用派生类的实现,从而实现多态。

虚函数的内部实现机制通常涉及到以下几个关键点:

  1. 虚函数表(vtable): 每个包含虚函数的类都会有一个对应的虚函数表。这个表是一个数组,其中存放着指向各个虚函数的指针。当创建一个类的实例时,会为该实例分配一个指向虚函数表的指针。
  2. 虚函数表指针(vptr): 每个包含虚函数的类的实例都会有一个指向虚函数表的指针。这个指针被称为虚函数表指针(vptr)。
  3. 动态绑定: 当通过基类指针调用虚函数时,编译器会生成代码来查找虚函数表,并调用相应的函数实现。这是一种动态绑定,因为实际调用的函数实现是在运行时根据对象的类型确定的。

虚函数带来的性能影响主要体现在以下几个方面:

  1. 时间开销: 每次通过基类指针调用虚函数时,都需要进行一次额外的查找操作,以找到正确的函数实现。这可能会增加一些时间开销。
  2. 空间开销: 每个包含虚函数的类都会有一个对应的虚函数表,这会占用一定的内存空间。如果一个类有很多虚函数,那么它的虚函数表也会变得很大。
  3. 缓存效率: 由于虚函数表通常是连续的内存块,因此可以利用缓存行(cache line)来提高访问效率。但是,如果虚函数表非常大,可能无法完全放入一个缓存行中,从而降低缓存效率。
    为了减少虚函数带来的性能影响,可以采取以下优化策略:
  4. 避免过多的虚函数: 尽量减少基类中的虚函数数量,或者使用非虚函数来提供默认行为。
  5. 使用静态多态: 在某些情况下,可以通过模板或其他技术来实现静态多态,从而避免虚函数的开销。
  6. 内联函数: 对于简单的虚函数,可以通过将它们声明为内联函数来消除虚函数调用的开销。
  7. 虚函数表缓存: 可以通过缓存虚函数表指针来减少查找虚函数表的次数,从而提高性能。
    总之,虚函数是一种强大的功能,但也带来了一些性能开销。在设计系统时,应该根据具体需求和性能要求来选择合适的策略来平衡这些影响。

题目十二、怎么解决共享内存多进程读写的竞争问题?

解决共享内存多进程读写的竞争问题通常需要使用同步机制,如互斥锁(mutex)、信号量(semaphore)或其他同步原语。以下是一些常见的解决方案:

  1. 互斥锁
    • 互斥锁是一种基本的同步机制,它只允许一个进程同时访问共享资源。当一个进程获得锁时,其他尝试获取锁的进程将被阻塞,直到锁被释放。
    • 在使用互斥锁时,需要确保在适当的时候释放锁,以避免死锁。
  2. 信号量
    • 信号量是一个更高级的同步机制,它可以控制对共享资源的访问数量。信号量可以用于限制同时访问共享资源的进程数量。
    • 信号量通常用于实现生产者-消费者模型或其他需要控制并发访问的场景。
  3. 条件变量
    • 条件变量可以用来等待某个条件发生。当一个进程等待某个条件时,它可以使用条件变量来阻塞自己,直到条件满足。
    • 条件变量通常与互斥锁一起使用,以确保线程安全。
  4. 读写锁
    • 读写锁是一种特殊的同步机制,它允许多个读取者同时访问共享资源,但只允许一个写入者修改资源。
    • 读写锁适用于读操作远多于写操作的情况。
  5. 消息队列
    • 消息队列是一种进程间通信机制,它允许进程通过发送和接收消息进行通信。消息队列可以用来同步对共享资源的访问。
    • 消息队列通常用于实现生产者-消费者模型或其他需要异步通信的场景。
  6. 原子操作
    • 原子操作是一种特殊的同步机制,它保证了操作的原子性,即操作要么全部完成,要么完全不执行。
    • 原子操作通常用于实现简单的同步需求,例如计数器或标志位。
      在实际应用中,选择哪种同步机制取决于具体的应用场景和需求。在设计系统时,应该根据性能要求、可靠性要求、以及系统复杂性等因素综合考虑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19818.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署专属网页版ChatGPT-Next-Web

背景 工作学习中经常使用chat-gpt, 需求是多端使用gpt问答&#xff0c;因此搭建一个网页版本方便多个平台使用。最后选择了 ChatGPT-Next-Web 部署说明 一键部署自己的web页面&#xff0c;因为是使用免费的vercel托管的&#xff0c;vercel节点在全球都有&#xff0c;理论上突…

【YOLOv8改进[Conv]】使用YOLOv9中的Adown模块改进Conv模块的实践 + 含全部代码和修改方式 + 有效涨点

本文中进行使用YOLOv9中的Adown模块改进Conv模块的实践 ,文中包含全部代码和修改方式 ,有效涨点。 目录 一 YOLOv9 1 信息丢失问题 2 PGI ① 信息瓶颈 ② 可逆函数<

oracle 12c DB卸载流程

1.运行卸载程序 [rootprimary1 ~]# su - oracle [oracleprimary1 ~]$ cd $ORACLE_HOME/deinstall [oracleprimary1 deinstall]$ ./deinstall Checking for required files and bootstrapping ... Please wait ... 这里选择3 、回车、y、y、回车、ASM 这里输入y 2.删除相关目录…

Midjourney应用:电商模特换装

今天我们应用的是Midjourney应用&#xff1a;电商模特换装 网上找到一件衣服&#xff0c;没有模特 方法一&#xff1a;两图片融合&#xff0c;BLEND命令&#xff0c;效果不是很理想失真 方法二&#xff1a;服装图片垫图说明细节缺失https://cdn.discordapp.com/attachments/1…

Iphone自动化指令每隔固定天数打开闹钟关闭闹钟(一)

注意&#xff1a;因为是第一次用iphone的快捷指令&#xff0c;不是很明白&#xff0c;所以之后多次运行发现有bug&#xff0c;所以快捷指令部分在下一章重新写&#xff0c;我用两个日期测试了&#xff0c;没问题&#xff0c;这一章可以当做熟悉快捷指令的一些操作用&#xff0c…

STM32高级控制定时器之输入捕获模式

目录 概述 1 输入捕获模式 1.1 原理介绍 1.2 实现步骤 1.3 发生输入捕获流程 2 使用STM32Cube配置工程 2.1 软件环境 2.2 配置参数 2.3 生成项目文件 3 功能实现 3.1 PWM调制占空比函数 3.2 应用函数库 4 测试 4.1 功能框图 4.2 运行结果 源代码下载地址&#xf…

【Word】调整列表符号与后续文本的间距

1. 默认的列表格式&#xff1a; 2. 修改间距&#xff1a; ************************************************** 分割线 ************************************************************ 3. 效果

推荐一款开源电子签章/电子合同系统

文章目录 前言一、项目介绍二、项目地址三、技术架构四、代码结构介绍五、功能模块六、功能界面首页面手写签名面板电子印章制作数字证书生成 总结 前言 大家好&#xff01;我是智航云科技&#xff0c;今天为大家分享一个免费开源的电子签字系统。 一、项目介绍 开放签电子签…

热门新游 2024 植物大战僵尸杂交版 Mac 版本下载安装详细教程

最近植物大战僵尸杂交版可谓是非常的火&#xff0c;好多主播都在播这款游戏&#xff0c;我一个 Mac 党也想玩&#xff0c;可奈何该游戏目前只有 PC 版本&#xff0c;经过一番折腾终于在我的 Mac 上安装上了该游戏&#xff0c;分享给大家 其实安装过程也很简单&#xff0c;只需…

AI视频下载:ChatGPT数据科学与机器学习课程

ChatGPT是一个基于OpenAI开发的GPT-3.5架构的AI对话代理。作为一种语言模型,ChatGPT能够理解并对各种主题生成类似人类的响应,使其成为聊天机器人开发、客户服务和内容创作的多用途工具。 此外,ChatGPT被设计为高度可扩展和可定制的,允许开发人员对其响应进行微调并将其集成到…

# SpringBoot 如何让指定的Bean先加载

SpringBoot 如何让指定的Bean先加载 文章目录 SpringBoot 如何让指定的Bean先加载ApplicationContextInitializer使用启动入口出注册配置文件中配置spring.factories中配置 BeanDefinitionRegistryPostProcessor使用 使用DependsOn注解实现SmartInitializingSingleton接口使用P…

数组的应用-24点游戏

目录 24点游戏 游戏规则 游戏主要分为三部分 电脑出牌 用户输入算式 电脑判断胜负 总结 24点游戏 游戏规则&#xff1a; 54张扑克抽出大小王&#xff0c;剩余52张用来用于游戏&#xff1b;每一轮从52张牌中随机抽出4张&#xff1b;玩家运用加&#xff0c;减&#xff0…

JUC常见类

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:Java锁的策略&#x1f649; &#x1f439;今日诗词:苟利国家生死以,岂因祸福避趋之&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64…

Windows系统WDS+MDT网络启动自动化安装

Windows系统WDS+MDT网络启动自动化安装 适用于在Windows系统上WDS+MDT网络启动自动化安装 1. 安装准备 1.下载windows server 2019、windows 10 pro的ISO文件,并安装好windows server 2019 2.下载windows 10 2004版ADK及镜像包 1.1 安装平台 Windows 111.2. 软件信息 软件…

模型优化——模型剪枝、模型量化、知识蒸馏

1.模型剪枝 1.1什么是模型剪枝&#xff1f; 深度学习网络模型从卷积层到全连接层存在着大量冗余的参数&#xff0c;大量神经元激活值趋近于0&#xff0c;将这些神经元去除后可以表现出同样的模型表达能力&#xff0c;这种情况被称为过参数化&#xff0c;而对应的技术则被称为模…

摸鱼大数据——select查询7-10

7、union联合查询 union: 对重复数据会去重 union all: 对重复数据不会去重 ​ 注意&#xff1a;union和union all中两边的字段&#xff08;类型、顺序&#xff09;要对应上 示例: use day08; select * from students; ​ select id,name from students where id in (95001,9…

C++面试题其二

19. STL中unordered_map和map的区别 unordered_map 和 map 都是C标准库中的关联容器&#xff0c;但它们在实现和性能方面有显著区别&#xff1a; 底层实现&#xff1a;map 是基于红黑树实现的有序关联容器&#xff0c;而 unordered_map 是基于哈希表实现的无序关联容器。元素…

make xxxx_defconfig 分析

文章目录 执行依赖scripts_basic执行依赖outputmakefile实现%config make rpi_3_32b_defconfig V1&#xff1a; make -f ./scripts/Makefile.build objscripts/basiccc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -stdgnu11 …

opencv视频抽帧保存图片

opencv视频抽帧保存图片video2pic 文章目录 opencv视频抽帧保存图片video2picopencv视频按帧率抽帧opencv视频按帧数抽帧 opencv视频按帧率抽帧 import cv2 import os video_pathC:/Users/Desktop/video/1.mp4 nameos.path.basename(video_path).split(".")[0] outp…

Vue3实战笔记(54)—揭秘Vue3实战:1分钟学会mitt,轻松玩转跨组件通讯

文章目录 前言一、自定义的 useMitt二、在组件中使用 useMitt&#xff1a;三、确保 useMitt 的单例性总结 前言 在 Vue3 中&#xff0c;由于官方移除了on\off 和 $once 实例方法&#xff0c;导致原先基于 Vue2 的事件总线&#xff08;EventBus&#xff09;模式不再适用。因此&…