1.2 C++内存

1.2.1 简述一下堆和栈的区别

堆(Heap)和栈(Stack)是内存管理中的两个重要概念,主要在内存分配、存储管理、效率和生命周期等方面有所不同。以下是它们的区别简述:

特性栈(Stack)堆(Heap)
内存分配方式自动分配,由系统进行内存的管理(静态分配或局部变量)手动分配,程序员使用 newmalloc 等动态分配
存储内容局部变量、函数参数、返回地址、控制信息等动态分配的对象和数据
分配和释放方式先进后出,自动分配与释放需要手动分配和释放,需调用 deletefree
分配效率高,系统自动管理较低,需要额外开销用于管理分配和释放
内存大小通常较小,依赖于操作系统(例如几 MB)通常较大,依赖于物理内存大小
生命周期随着函数调用结束自动释放程序员控制释放,不释放可能导致内存泄漏
访问速度快,紧密依赖于 CPU 的内存管理模型相对慢,需要管理内存块的分配与释放
碎片问题无碎片问题,内存是连续的可能产生内存碎片,特别是频繁的分配和释放
典型使用场景用于局部变量、函数调用等临时数据用于动态分配内存,如动态数组、对象等

具体解释:

  • 栈(Stack)

    • 栈内存由编译器自动管理,通常用于存储局部变量、函数调用的参数和返回地址等。由于栈的内存分配是连续的,因此效率很高,且内存分配和释放都由编译器自动完成,不需要手动管理。
    • 当函数执行完毕时,栈帧被自动销毁,局部变量也随之释放。
  • 堆(Heap)

    • 堆内存用于动态内存分配,程序员可以通过 newmalloc 等手动分配内存,同时也需要手动释放内存,使用 deletefree。如果忘记释放,可能会导致内存泄漏。
    • 堆内存分布不连续,操作系统通过空闲内存链表等方式来管理空闲的内存块,因此相对分配和释放的速度较慢。

总结:

  • 更适合临时、局部变量,生命周期短,效率高,自动管理;
  • 更适合长生命周期的动态对象,灵活,但需要手动管理内存,有可能导致内存泄漏或碎片问题。

1.2.2 简述C++的内存管理

在面试中,关于 C++ 的内存管理,你可以简要回答如下:


C++ 的内存管理主要包括静态和动态内存分配:

  1. 静态内存分配:编译时完成,适用于局部变量、全局变量、静态变量,系统自动分配和释放,效率高,但不灵活。

  2. 动态内存分配:运行时通过 new/deletemalloc/free 手动管理内存,灵活但需要程序员注意避免内存泄漏、野指针等问题。

  3. 栈与堆的区别

    • :自动管理,存储局部变量,作用域结束后自动回收。
    • :手动管理,适合动态分配大对象或数据结构,使用 new 分配,delete 释放。
  4. 智能指针:C++11 引入的 std::unique_ptrstd::shared_ptr,自动管理动态内存,防止内存泄漏和双重释放问题。


C++ 中的内存管理分为 静态内存分配动态内存分配 两种方式,通过栈(Stack)和堆(Heap)的不同内存区域进行管理。内存管理的核心目的是合理分配、使用和释放内存,避免内存泄漏、越界访问等问题。下面简要说明 C++ 的内存管理:

1. 静态内存分配(编译期分配)

  • 内存分配方式:在编译时确定内存的分配,由系统自动管理,分配在全局数据区
  • 存储内容
    • 全局变量:在程序生命周期内存在,由系统分配和释放。
    • 静态变量:同全局变量,分配在全局数据区,生命周期与程序一致。
    • 局部变量:分配在栈中,函数执行结束后自动释放。
  • 优点:效率高,分配和释放由系统自动完成,无需程序员干预。
  • 缺点:灵活性不足,内存大小在编译期就需要确定。

2. 动态内存分配(运行期分配)

  • 内存分配方式:在运行时通过程序员显式调用 newdeletemallocfree 来管理内存,分配在中。
  • 存储内容:通过动态分配的对象、数据结构(如链表、树、动态数组等)。
  • 优点:灵活,可以在运行时动态分配和释放内存,适用于需要在程序运行过程中分配不确定大小内存的场景。
  • 缺点
    • 程序员需手动管理内存,容易产生内存泄漏(未及时释放内存)。
    • 由于堆内存管理的开销,分配和释放速度较慢。
动态内存分配相关关键字:
  • new:在堆中分配内存,返回一个指向该内存的指针,并自动调用构造函数。
    int* ptr = new int;  // 在堆上分配一个整数
    
  • delete:释放由 new 分配的内存,并自动调用析构函数。
    delete ptr;  // 释放内存
    
  • malloc/freemalloc 分配指定大小的内存,返回 void* 指针,free 释放由 malloc 分配的内存。mallocfree 是 C 语言中的函数,不会调用构造函数和析构函数。
    int* ptr = (int*)malloc(sizeof(int));  // 分配整数大小的内存
    free(ptr);  // 释放内存
    

3. 栈和堆的内存管理

  • 栈内存:用于局部变量和函数调用的内存分配,栈内存的分配和释放由编译器自动完成。当函数返回时,栈上的内存自动回收。
  • 堆内存:用于动态内存分配,需手动管理。堆内存需要通过 newmalloc 分配,通过 deletefree 释放。

4. C++ 内存管理中的常见问题

  • 内存泄漏:未释放动态分配的内存,导致程序占用内存不断增加。
  • 野指针:指针指向已被释放的内存或未分配的内存区域,访问此类指针会导致未定义行为。
  • 双重释放:同一块内存被多次释放,可能导致程序崩溃。
  • 内存碎片:频繁的动态分配和释放操作会导致内存碎片,降低内存利用率。

5. 智能指针(Smart Pointers)

C++11 引入了智能指针来简化动态内存管理,避免手动管理内存时可能带来的错误。

  • std::unique_ptr:独占所有权,一个智能指针拥有该对象,离开作用域时自动释放。
  • std::shared_ptr:共享所有权,多个指针共享同一对象,引用计数为 0 时释放内存。
  • std::weak_ptr:不影响对象的生命周期,用于解决 std::shared_ptr 的循环引用问题。

6. 内存管理总结

  • C++ 提供了灵活的内存管理机制,支持静态和动态内存分配。
  • 静态内存效率高,由系统自动管理,适合局部变量和全局变量。
  • 动态内存灵活,但需要程序员手动管理,适合需要动态扩展的对象。
  • 使用智能指针可以更安全、有效地管理堆内存,减少内存泄漏和非法访问的风险。

1.2.3 malloc和局部变量分配在堆还是栈?

总结:

  • malloc 分配的内存位于 中,手动管理。
  • 局部变量 位于 中,系统自动管理。
    在 C/C++ 中,malloc 和局部变量的内存分配分别发生在不同的内存区域:
  1. malloc 分配内存

    • malloc(Memory Allocation)函数用于在**堆(Heap)**中分配内存。
    • 堆内存是动态分配的,程序员需要手动管理,即使用 malloc 分配后需要调用 free 来释放这块内存。
  2. 局部变量的内存分配

    • 局部变量是在**栈(Stack)**中分配内存的。
    • 栈内存由系统自动管理,当函数执行完毕后,局部变量会自动从栈中释放,内存回收无需程序员干预。

1.2.4 程序有哪些section,分别的作用?程序启动的过程?怎么判断数据分配在栈上还是堆上?

在 C/C++ 程序中,程序的内存布局通常分为几个不同的内存段(sections),每个段负责不同类型的数据和执行代码。以下是常见的内存段及其作用:

程序的内存段(sections)

  1. 代码段(Text Section)

    • 存储程序的可执行代码,即编译后的机器指令。
    • 代码段通常是只读的,防止程序意外修改其指令。
    • 在程序运行时,CPU 通过从代码段中读取指令来执行程序。
  2. 数据段(Data Section)

    • 用于存储程序中已初始化的全局变量静态变量
    • 这些变量在程序启动时分配内存,并且在整个程序执行期间都保持不变。
    • 数据段可以是可读写的
  3. BSS 段(Block Started by Symbol)

    • 用于存储程序中的未初始化的全局变量静态变量
    • 在程序启动时,这些变量会被自动初始化为零。
    • BSS 段不会占用实际的文件空间(因为它不存储数据),但在内存中会占用空间。
  4. 堆(Heap Section)

    • 动态内存分配区域,通过函数如 malloccallocrealloc 或 C++ 中的 new 动态分配的内存。
    • 程序员负责管理堆中的内存,必须使用 freedelete 释放。
    • 堆的内存增长方向通常是从低地址向高地址扩展。
  5. 栈(Stack Section)

    • 用于存储局部变量函数调用信息(如返回地址、参数、临时变量等),以及函数的上下文信息
    • 栈的内存分配由系统自动管理,在函数调用时分配,在函数返回时释放。
    • 栈的内存增长方向通常是从高地址向低地址扩展。

程序启动的过程

程序启动时,会经历以下几个阶段:

  1. 加载程序

    • 操作系统的程序加载器将可执行文件加载到内存中。代码段、数据段、BSS 段被映射到内存中,初始化全局变量和静态变量。
  2. 初始化堆栈

    • 加载器为程序分配栈空间,并为堆设置起始位置,但堆空间初始并不分配,直到程序运行时需要动态分配内存。
  3. 执行 C/C++ 运行时库的初始化

    • main() 函数执行之前,C/C++ 运行时环境初始化(如构造全局对象、初始化静态变量等)。
  4. 调用 main() 函数

    • 在初始化完成后,程序进入用户定义的 main() 函数,程序的执行正式开始。
  5. 执行程序代码

    • 程序执行完 main() 函数和其他函数的代码。
  6. 程序终止

    • 程序结束时,C/C++ 运行时环境会清理资源(如调用全局对象的析构函数),并返回控制权给操作系统。

如何判断数据分配在栈上还是堆上?

  1. 栈上分配

    • 局部变量(函数内部定义的变量)、函数参数,以及函数的返回地址和调用上下文,这些都自动分配在栈上。
    • 栈上分配的内存是自动管理的,函数返回时自动释放。
  2. 堆上分配

    • 动态分配的内存,如通过 malloccallocrealloc 或 C++ 中的 new 动态分配的对象和数组,都分配在堆上。
    • 堆内存的分配和释放由程序员手动控制,忘记释放会导致内存泄漏。

1.2.5 初始化为0的全局变量在bss还是data

初始化为 0 的全局变量在程序的BSS 段(Block Started by Symbol)中。

原因:

  • BSS 段用于存储未显式初始化的全局变量静态变量,以及那些显式初始化为零的变量。这是因为操作系统在加载程序时会自动将 BSS 段中的所有变量初始化为零,节省了程序文件的空间。

  • Data 段(数据段)则用于存储显式初始化为非零的全局变量和静态变量。

例子:

int globalVar1;        // 未初始化的全局变量,位于 BSS 段
int globalVar2 = 0;    // 初始化为 0 的全局变量,位于 BSS 段
int globalVar3 = 5;    // 初始化为非 0 的全局变量,位于 Data 段
  • globalVar1globalVar2 都会在 BSS 段中,因为它们会被自动初始化为零。
  • globalVar3 因为显式初始化为非零,会被存储在 Data 段中。

1.2.6 什么是内存泄漏,内存泄漏怎么检测?

总结:

  • 内存泄漏是由于动态分配的内存未被释放,导致程序中无法再次使用这部分内存。
  • 内存泄漏检测可通过手动检查代码或借助工具(如 Valgrind、AddressSanitizer 等)来实现。在 C++ 中,使用智能指针可以有效避免内存泄漏问题。

什么是内存泄漏?

内存泄漏是指程序在动态分配内存后,未能正确释放这部分内存,导致内存无法被操作系统或程序重新使用。虽然程序可能继续运行,但这些未释放的内存会一直占用系统资源,直到程序终止或系统重启。如果内存泄漏持续发生,可能导致程序运行时内存耗尽,系统变慢,甚至崩溃。

内存泄漏的原因:

  • 动态分配内存后未释放:通过 mallocnew 分配内存,却没有使用 freedelete 释放。
  • 指针丢失:程序中的指针不再指向已经分配的内存,但该内存仍未释放,导致该内存“泄漏”。

示例代码:

void memoryLeak() {int* p = new int[10];  // 动态分配了10个int的数组// 没有调用 delete[],内存泄漏
}

如何检测内存泄漏?

1. 手动检查代码
  • 跟踪每次内存分配和释放
  • 确保每次通过 newmalloc 分配的内存,都有相应的 deletefree
2. 工具检测
  • Valgrind
    Valgrind 是一款非常流行的内存检测工具,特别适合检测 C/C++ 程序中的内存泄漏。它可以通过命令行检测程序在运行过程中是否有未释放的内存。

    示例使用:

    valgrind --leak-check=full ./your_program
    
  • AddressSanitizer
    AddressSanitizer 是由 Google 开发的内存检测工具,常用于 C/C++ 程序的内存错误检测。可以通过在编译时启用 -fsanitize=address 选项来检测。

    示例使用:

    g++ -fsanitize=address your_program.cpp -o your_program
    ./your_program
    
  • Dr. Memory
    Dr. Memory 是另一款跨平台的内存检测工具,用于检查内存泄漏、未初始化的内存、非法内存访问等问题。

  • Visual Leak Detector (Windows)
    Windows 下的 Visual Leak Detector (VLD) 是一种简单易用的工具,用于检测 Visual Studio 中 C/C++ 程序的内存泄漏。

3. 智能指针(C++)

在现代 C++ 中,推荐使用 智能指针(如 std::unique_ptrstd::shared_ptr),它们会自动管理内存的释放,避免手动管理时可能发生的内存泄漏。

示例:

void noMemoryLeak() {std::unique_ptr<int[]> p(new int[10]);  // 使用智能指针// 当函数结束,智能指针会自动释放内存
}

1.2.7 请简述一下atomoic内存顺序.

在C++中,atomic内存顺序用于控制多线程程序中原子操作的顺序性和可见性。C++标准库提供了一些工具,尤其是std::atomic类,来实现原子操作,同时允许程序员指定内存顺序。内存顺序的设置直接影响数据的一致性和并发性能。C++中的原子内存顺序主要包括以下几种:

  1. memory_order_relaxed

    • 不强制任何顺序约束。
    • 允许对原子操作进行最大程度的优化,适用于不依赖于其他操作结果的情况。
  2. memory_order_consume

    • 确保依赖于此操作的后续操作会在此操作之后执行。
    • 在某些情况下可能导致性能问题,因此在实际使用中不常见。
  3. memory_order_acquire

    • 使得在该操作之后的所有读写操作都不能被重排到该操作之前。
    • 用于读取共享数据时,确保之前的写入对当前线程可见。
  4. memory_order_release

    • 使得在该操作之前的所有读写操作都不能被重排到该操作之后。
    • 用于写入共享数据时,确保当前线程的修改在其他线程中可见。
  5. memory_order_acq_rel

    • 结合了acquirerelease的特性。
    • 确保操作的前后顺序,同时提供对数据的保护。
  6. memory_order_seq_cst

    • 强制所有线程的操作以一个全局一致的顺序执行。
    • 是最强的一种内存顺序,适合对一致性要求极高的场景。

在C++中,std::atomic操作的默认内存顺序是 memory_order_seq_cst(顺序一致性)。这意味着,如果你不显式指定其他内存顺序,原子操作将默认使用顺序一致性的内存顺序,以确保所有线程都能以全局一致的顺序看到原子操作的结果。使用 memory_order_seq_cst 可以提供较高的安全性和一致性,但在性能上可能不如其他更宽松的内存顺序(如 memory_order_relaxed)来得高效。在不需要严格顺序保证的情况下,选择更合适的内存顺序可以提高程序的并发性能。

1.2.8 内存模型,堆栈,常量区.

内存模型(内存布局):

  • 从高地址到低地址,一个程序由代码段 数据段 BSS段 堆 共享区 栈 等组成.
  • 代码段:存放程序执行的一块内存区域.只读.
  • 数据段:存放程序中已经初始化的全局变量和静态变量.
  • BSS段:存放程序中未初始化的全局变量和静态变量.
  • 堆:动态内存申请使用,从低地址到到高地址增长.空间链式不连续.
  • 共享区:位于堆和栈之间.
  • 栈:存储局部变量\函数参数值.从高地址到低地址增长.是一块连续的空间.
    常量存储区:存放常量,不允许修改.

1.2.9 简述C++中内存对齐的使用场景

在C++中,内存对齐是指将数据存储在特定的内存地址上,以提高数据访问的效率和性能。内存对齐的主要目的在于适应计算机硬件对数据访问的要求。

什么是内存对齐

内存对齐是指数据在内存中存储的地址必须是某个特定值(通常是数据类型大小的倍数)。例如,4字节的整数应该存储在地址为4的倍数(如0x0、0x4、0x8等)的位置。内存对齐的基本原则包括:

  • 基本数据类型的对齐:每种数据类型(如intdouble等)都有一个对齐要求,通常为其大小。
  • 结构体的对齐:结构体中的每个成员都应按照其对齐要求存储,编译器可能会在结构体中插入填充字节,以确保每个成员的对齐。

为什么需要内存对齐

  1. 提高访问速度:现代CPU通常要求数据在对齐的地址上进行访问。未对齐的访问可能导致额外的内存读取周期,降低性能。对齐可以减少CPU读取数据时的时钟周期,从而提升访问速度。

  2. 避免硬件异常:某些硬件架构(如ARM、SPARC)要求特定类型的数据必须在对齐地址上访问,否则会引发硬件异常(如访问冲突)。这可能导致程序崩溃或未定义行为。

  3. 优化内存使用:通过合理的内存对齐,数据结构的内存使用可以得到优化,减少不必要的填充字节,从而提升内存的利用率。

使用场景

  1. 结构体和类的设计:在定义结构体和类时,考虑内存对齐可以提高数据访问的效率。合理的成员顺序和类型选择可以减少填充字节的数量。

  2. 性能敏感的应用:在图像处理、科学计算等性能敏感的应用中,使用内存对齐可以显著提升数据处理速度,尤其是在大量数据处理时。

  3. 并行计算:在并行编程中,确保数据对齐可以提高缓存命中率,减少处理器之间的内存争用,从而提升整体性能。

  4. 底层系统编程:在操作系统、驱动程序等底层系统编程中,内存对齐是一个重要的考虑因素。确保对齐可以避免潜在的硬件异常和性能问题。

  5. SIMD优化:在使用SIMD(单指令多数据)指令时,数据通常需要按照特定的对齐方式存储,以提高计算效率。

总结

内存对齐在C++编程中起着关键作用,能够提高程序性能、避免硬件异常,并在多种应用场景中提供优化。理解内存对齐的原理及其在实际应用中的重要性,可以帮助开发者编写更高效和稳定的代码。

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

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

相关文章

【计算机网络 - 基础问题】每日 3 题(五十二)

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞…

打开游戏提示丢失(或找不到)XINPUT1_3.DLL的多种解决办法

xinput1_3.dll是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它在Windows操作系统中扮演着重要的角色。该文件作为系统库文件&#xff0c;通常存放于C:\Windows\System32目录下&#xff08;对于32位系统&#xff09;或C:\Windows\SysWOW64目录下&#xff08;对于…

安装vue发生异常: idealTree:nodejs: sill idealTree buildDeps

一、异常 C:\>npm install vue -g npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIREDnpm ERR! request to https://registry.npm.taobao.org/vue failed, reason: certificate has expired 二、原因 请求 https://registry.npm.taobao.org 失败&#xff0c;证…

2024年10月22日练习

一.. 加一 - 力扣&#xff08;LeetCode&#xff09; 这题考虑的麻烦点就在于每位都进位&#xff0c;最后进位扩展一位&#xff0c;此时就要另开空间&#xff0c;用来进位。 其他的情况利用循环从后面往前面走&#xff0c;每一位都判断一下是否变成十&#xff0c;只要变成十&am…

VMamba:视觉SSM

论文标题&#xff1a;VMamba: Visual State Space Model 论文地址&#xff1a;https://arxiv.org/pdf/2401.10166 摘要 VMamba 是一个视觉骨干网络&#xff0c;基于状态空间模型&#xff08;SSM&#xff09;&#xff0c;其复杂度是线性的。该架构的核心是视觉状态空间&#xff…

听泉鉴宝在三个月前已布局商标注册!

近日“听泉鉴宝”以幽默的风格和节目效果迅速涨粉至2500多万&#xff0c;连线出现“馆藏文物”和“盗墓现场”等内容&#xff0c;听泉鉴宝早在几个月前已布局商标注册。 据普推知产商标老杨在商标局网站检索发现&#xff0c;“听泉鉴宝”的主人丁某所持股的江苏灵匠申请了三十…

Java的买家秀探秘:API数据的优雅捕获

在编程世界的某个角落&#xff0c;Java特工正坐在他的高科技办公室里&#xff0c;沉浸在代码的海洋中。今天&#xff0c;他接到了一个有趣的任务&#xff1a;获取买家秀的API数据。这不仅是一次技术的挑战&#xff0c;更是一次深入了解买家心声的机会。Java特工&#xff0c;这位…

宇音天下最新力作 | VTX356语音识别合成芯片问世

北京宇音天下科技有限公司&#xff0c;依托在语音技术领域的丰富经验和技术积累&#xff0c;成功推出了一款具有里程碑意义的语音识别合成芯片——VTX356。这款芯片的问世&#xff0c;不仅彰显了公司在智能语音处理领域的专业实力&#xff0c;也预示着智能家居、车载电子、智能…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十五集:制作更多地图,更多敌人,更多可交互对象

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、第一个代表性场景 1.制作更多敌人2.制作更多可交互对象二、第二个代表性场景 1.制作更多敌人2.制作更多可交互对象三、第三个代表性场景 1.制作更多敌人2.制…

Java生死簿管理小系统(简单实现)

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

pikachu靶场CSRF-post测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、抓包使用burp生成csrf脚本 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机&#xff1a;本机(127.0.0.1) 靶 机&#xff1a;本机(127.0.0.1) 2、使用工具/软件 Burp sui…

华为OD机试 - 篮球比赛 - 递归(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;E卷D卷A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加…

Nginx超简洁知识:负载均衡-反向代理,动静分离,配置文件

首先介绍一下为什么需要nginx&#xff1f; 在低并发场景下&#xff08;也就是用户量特别少的情况下&#xff09;&#xff0c;我们只需要部署一台服务器就能满足用户数量少的需求。 但是如果用户量逐渐增多&#xff0c;只有一台服务器是不够的。于是我们需要部署多台服务器。 …

juzigei/基于Java语言的充电桩系统(充电桩小程序+充电桩管理平台)

简述 SpringBoot 框架&#xff0c;充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5新能源汽车电动自行车公交车-四轮车充电充电源代码充电平台源码Java源码无加密项目 介绍 云快充协议云快充1.5协议云快充协议开源代码云快充底层协议云快充桩直连桩直连协议充…

长短期记忆网络(Long Short-Term Memory,LSTM)

简介&#xff1a;个人学习分享&#xff0c;如有错误&#xff0c;欢迎批评指正。 长短期记忆网络&#xff08;Long Short-Term Memory&#xff0c;简称LSTM&#xff09;是一种特殊的循环神经网络&#xff08;Recurrent Neural Network&#xff0c;简称RNN&#xff09;架构&#…

【Qt】Windows下Qt连接DM数据库

环境信息&#xff1a;W11 Qt5.12及以上 dm8 QODBC达梦 Windows环境创建ODBC数据源 使用 ODBC 方法访问 DM 数据库服务器之前&#xff0c;必须先配置 ODBC 数据源 在控制面板Windows工具中显示ODBC数据源管理器 ODBC数据源管理器标签 用户 DSN&#xff1a;添加、删除或配置本…

安达发|氢能源产业与APS生产排程软件的结合

氢能产业&#xff0c;作为一种科技与资本密集型行业&#xff0c;覆盖新材料、电力装备、新能源汽车、航空航天以及国防军工等多个领域&#xff0c;对于推动传统产业的转型升级及新兴产业链的形成具有显著作用。氢能的应用领域广泛&#xff0c;主要可划分为交通、工业、发电和储…

软件设计模式------抽象工厂模式

抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;&#xff0c;又称Kit模式&#xff0c;属于对象创建型模式。 一&#xff1a;先理解两个概念&#xff1a; &#xff08;1&#xff09;产品等级结构&#xff1a; 即产品的继承结构。 通俗来讲&#xff0c;就是不同品…

php中的错误和异常捕获

目录 一&#xff1a; 异常&#xff08;Exceptions&#xff09; 二&#xff1a; 错误&#xff08;Errors&#xff09; 三&#xff1a;实际项目的异常和错误处理 在PHP中&#xff0c;异常&#xff08;Exceptions&#xff09;和错误&#xff08;Errors&#xff09;是两个不同的…

vuex的store应用

1.在pakage.json加一行 2.和main同级别加一个js文件 import Vue from vue import Vuex from vuexVue.use(Vuex)export default new Vuex.Store({state: {langFlag: new Date().getTime()},mutations: {setLangFlag(state) {state.langFlag new Date().getTime()}} })3.在mai…