C++细节知识for面试
1. linux上C++程序可用的栈和堆大小分别是多少,为什么栈大小小于堆?
1. 栈(Stack)大小
栈默认为8MB,可修改。
为什么是这个大小:
- 安全性:限制栈大小可防止无限递归或过深的函数调用导致内存耗尽。
- 多线程优化:每个线程的栈独立,较小的默认值避免内存浪费(线程数多时,总内存消耗可能激增)。
2. 堆(Heap)大小
-
默认限制:
- 堆的大小受限于系统的虚拟内存地址空间和物理内存+交换空间(Swap)。
- 在64位系统上,理论最大值为 128 TB(Linux内核默认配置),实际受物理资源和进程地址空间限制。
- 在32位系统上,通常最大为 3 GB(受限于用户空间地址范围)。
-
为什么是这个大小:
- 动态分配灵活性:堆用于动态内存分配,需支持程序运行时按需扩展。
- 操作系统虚拟内存管理:64位系统地址空间极大,但实际分配取决于物理内存和Swap。
2. 构造函数和析构函数可以声明为inline吗,为什么?
1. 语法可行性
-
可以声明为
inline
:C++标准允许构造函数和析构函数声明为inline
。 -
隐式
inline
:在类定义内部直接实现的构造函数和析构函数,默认会被编译器视为inline
,无需显式声明。 -
显式
inline
:在类外定义时,需显式添加inline
关键字。
2. 最佳实践
- 优先隐式
inline
:在类定义内直接实现简单的构造函数/析构函数。 - 避免复杂逻辑:若构造/析构函数涉及动态内存、虚函数或异常,避免内联。
总结
- 可以声明为
inline
:语法支持且对简单场景有效。 - 需谨慎使用:复杂逻辑或涉及虚函数时,内联可能适得其反。
- 依赖编译器决策:最终是否内联由编译器优化策略决定。
3. 函数作用域结束后,变量的析构,是有谁来进行的?
在 C++ 中,函数作用域结束后,变量的析构是由编译器自动插入的代码触发的。
编译器如何实现自动析构?
- 代码插入:编译器在作用域结束处(如
}
前)插入析构函数调用。 - 异常安全:即使作用域因异常提前退出,编译器仍会插入析构代码(利用栈展开机制)。
- 逆序析构:保证对象按创建的逆序析构,避免依赖问题。
4. struct和class的区别?
struct
和 class
的内存对齐规则是完全相同的,唯一的区别在于默认的访问控制权限(struct
默认 public
,class
默认 private
)。
5. atomic, mutex底层实现?
1. std::atomic
的底层实现
std::atomic
用于实现无锁(lock-free)或低竞争(low-contention)的原子操作,其性能远高于互斥锁。
**(1) 硬件支持**
- 原子指令:直接使用 CPU 提供的原子指令,例如:
- x86 架构:
LOCK
前缀指令(如LOCK CMPXCHG
实现 CAS)。 - ARM 架构:
LDREX/STREX
指令(Load-Exclusive/Store-Exclusive)。
- x86 架构:
- 内存屏障(Memory Barriers):保证内存操作的顺序性,例如
std::memory_order
相关的屏障指令。
2. std::mutex
的底层实现
std::mutex
是互斥锁,用于保护临界区,其实现依赖操作系统内核的调度。
**(1) Linux 实现(基于 pthread_mutex_t
)**
- 轻量级锁(Futex):快速用户空间互斥锁(Fast Userspace Mutex)。
- 无竞争时:完全在用户空间通过原子操作(如
CAS
)完成加锁/解锁。 - 有竞争时:通过系统调用(
futex_wait
,futex_wake
)挂起或唤醒线程。
- 无竞争时:完全在用户空间通过原子操作(如
- 锁类型:
- 普通锁(PTHREAD_MUTEX_DEFAULT):可能死锁,无错误检查。
- 递归锁:允许同一线程多次加锁。
- 自适应锁:在竞争激烈时退化为内核态锁。
3. 对比与选择
特性 | std::atomic | std::mutex |
---|---|---|
实现基础 | 硬件原子指令 + 可能的锁模拟 | 操作系统内核机制(Futex/CRITICAL_SECTION) |
性能 | 无锁时极快(纳秒级) | 无竞争时快(约 20-50 ns),有竞争时较慢 |
适用场景 | 简单原子操作(计数器、标志位) | 复杂临界区(需保护多步操作) |
内存开销 | 通常较小(与数据类型对齐) | 较大(需存储锁状态和等待队列) |
线程阻塞 | 无(自旋或原子操作) | 可能阻塞(进入内核等待) |
6. 线程的挂起和执行在用户态还是内核态?
1. 两种情况
- 内核级线程:挂起和执行由内核态管理,是现代操作系统的默认选择(如Linux的
pthread
)。 - 协程:完全在用户态实现,适用于高并发但需结合多线程利用多核。
2. 内核级线程(Kernel-Level Threads, KLT)
- 管理方式:由操作系统内核直接支持,每个线程是内核调度的基本单位(如Linux的
pthread
)。 - 挂起与执行:
- 内核态操作:线程的创建、销毁、调度(挂起/恢复)需通过系统调用,由内核完成。
- 内核感知:内核直接管理线程状态(就绪、运行、阻塞等)。
- 优点:
- 并行性:线程可分配到不同CPU核心并行执行。
- 阻塞隔离:一个线程阻塞不会影响同一进程内其他线程。
- 缺点:
- 切换开销大(需切换到内核态)。
- 线程数量受内核限制。
3. 协程(Coroutine)——用户态的轻量级并发
- 管理方式:完全在用户态由程序或运行时库(如Golang的goroutine)控制。
- 挂起与执行:
- 用户态切换:协程主动让出(
yield
)或恢复(resume
),不依赖内核调度。 - 非抢占式:协程需显式让出CPU,通常与事件循环(如epoll)配合。
- 用户态切换:协程主动让出(
- 适用场景:高并发I/O密集型任务(如网络服务器)。
7. 谈一谈new/delete和malloc/free的区别和联系?
1. 核心区别
特性 | new /delete (C++ 运算符) | malloc /free (C 标准库函数) |
---|---|---|
语法与类型安全 | 是运算符,无需类型转换(自动匹配类型) | 是函数,需显式类型转换(返回 void* ) |
构造函数/析构函数 | 调用构造函数(new )和析构函数(delete ) | 不调用构造函数/析构函数 |
内存大小计算 | 自动根据类型计算内存大小(如 new int ) | 需手动计算(如 malloc(sizeof(int)*n) ) |
异常处理 | 失败时抛出 std::bad_alloc 异常 | 失败时返回 NULL (需手动检查) |
内存来源 | 从自由存储区(free store)分配 | 从堆(heap)分配 |
重载支持 | 可重载类的 operator new /delete | 不可重载 |
内存对齐 | 自动满足类型的对齐要求 | 需手动处理对齐(如 aligned_alloc ) |
多态支持 | 支持(通过虚析构函数正确释放派生类对象) | 不支持(需手动管理派生类内存) |
扩展功能 | 支持 placement new (在指定内存构造对象) | 不支持 |
与 C++ 特性结合 | 兼容智能指针(如 std::unique_ptr ) | 需额外封装才能安全使用 |
8. 解决内存泄漏?
**(1) 使用 Valgrind 检测泄露**
valgrind --leak-check=full --show-leak-kinds=all ./your_program
- 输出示例:
==12345== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==12345== by 0x123456: main (main.c:10)
**(2) 分析代码**
定位到泄露位置后,检查以下常见原因:
- 忘记释放内存:
malloc/new
未配对free/delete
。 - 异常路径未释放:如
return
或throw
前未释放资源。 - 循环引用(智能指针):
std::shared_ptr
循环引用导致无法自动释放。
**(3) 修复并验证**
- 修复代码:添加释放逻辑或使用 RAII(如
std::unique_ptr
)。 - 重新测试:重复步骤 1 确保泄露消失
相关文章:
C++细节知识for面试
1. linux上C程序可用的栈和堆大小分别是多少,为什么栈大小小于堆? 1. 栈(Stack)大小 栈默认为8MB,可修改。 为什么是这个大小: 安全性:限制栈大小可防止无限递归或过深的函数调用导致内存…...
构建高可用性西门子Camstar服务守护者:异常监控与自愈实践
在智能制造领域,西门子Camstar作为领先的MES系统承载着关键生产业务。但在实际运维中,我们发现其服务常因数据库负载激增(如SQL阻塞链超时)或应用服务器资源耗尽(CPU峰值达90%以上)导致服务不可用。传统人工干预方式平均故障恢复时间长达47分钟,这对连续生产场景构成了严…...
DeepSeek-V3-250324: AI模型新突破,性能超越GPT-4.5
DeepSeek 于 3 月 25 日宣布完成 V3 模型的小版本升级,推出 DeepSeek-V3-250324 版本。新版本在推理能力、代码生成、中文写作及多模态任务上实现显著优化,尤其在数学和代码类评测中得分超越 GPT-4.5,引发行业高度关注。 DeepSeek-V3-250324…...
OSPF邻居状态机
OSPF(Open Shortest Path First)协议的邻接关系状态机描述了两台OSPF路由器之间建立和维护邻接关系的过程。以下是每个状态的简要描述: Down State(关闭状态) 描述:这是OSPF邻接关系的初始状态,…...
使用tensorflow实现线性回归
目录 前言使用TensorFlow实现算法的基本套路:实战 前言 实现一个算法主要从以下三步入手: 找到这个算法的预测函数, 比如线性回归的预测函数形式为:y wx b, 找到这个算法的损失函数 , 比如线性回归算法的损失函数为最小二乘法 找到让损失函数求得最小值的时候的系数, 这时一…...
CF每日5题Day4(1400)
好困,感觉很累,今天想赶紧写完题早睡。睡眠不足感觉做题都慢了。 1- 1761C 构造 void solve(){int n;cin>>n;vector<vector<int>>a(n1);forr(i,1,n){//保证每个集合不同a[i].push_back(i);}forr(i,1,n){string s;cin>>s;forr(…...
Vala 编程语言教程-继承
继承 在 Vala 中,一个类可以继承自 一个或零个 其他类。尽管实际开发中通常继承一个类(不同于 Java 等语言的隐式继承机制),但 Vala 并不强制要求必须继承。 当定义继承自其他类的子类时,子类的实例与父…...
CLion下载安装(Windows11)
目录 CLion工具下载安装其他 CLion CLion-2024.1.4.exe 工具 系统:Windows 11 下载 1.通过百度网盘分享的文件:CLion-2024.1.4.exe 链接:https://pan.baidu.com/s/1-zH0rZPCZtQ60IqdHA7Cew?pwdux5a 提取码:ux5a 安装 打开…...
QEMU源码全解析 —— 块设备虚拟化(12)
接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(11) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 特此致谢! QEMU初始化阶段的块设备虚拟化 从模板生成类和类的实例化 本回继续解析QEMU类Java反…...
如何使用VS中的Android Game Development Extension (AGDE) 来查看安卓 Logcat 日志
一、首先按照以下 指引 中的 第1、2步骤,安装一下 AGDE ,AGDE 的安装包可以在官网上找到。 UE4 使用AndroidGameDevelopmentExtension(AGDE)对安卓客户端做“断点调试”与“代码热更”-CSDN博客 在执行第二步骤前,记得…...
Z字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P A H N A P L S I I G Y I R 之后,你的输出需要从左往右…...
跟着尚硅谷学vue-day1
前言:企业多用vue3,但是考虑到时间较充足,先学vue2,学vue3较为方便。 1.vue是什么? 一套用于构建用户界面的渐进式Javascript 框架 构建用户界面:数据->界面 渐进式:Vue可以自底向上逐层的应用 简单应用: 只需一个轻量小…...
平板实现 adb connect 连接的步骤
1. 检查设备的开发者选项 确保平板设备已开启开发者模式,并启用了USB调试。 2. 检查设备和电脑的网络连接 确保平板和电脑连接到同一个Wi-Fi网络,确认设备的 IP 地址是否正确。 通过 ping 命令测试: ping 192.168.3.243. 通过USB线进行初…...
VUE3+TypeScript项目,使用html2Canvas+jspdf生成PDF并实现--分页--页眉--页尾
使用html2CanvasJsPDF生成pdf,并实现分页添加页眉页尾 1.封装方法htmlToPdfPage.ts /**path: src/utils/htmlToPdfPage.tsname: 导出页面为PDF格式 并添加页眉页尾 **/ /*** 封装思路* 1.将页面根据A4大小分隔边距,避免内容被中间截断* 所有元素层级不要…...
windows第十八章 菜单、工具栏、状态栏
文章目录 创建框架窗口菜单菜单的风格通过资源创建菜单菜单的各种使用通过代码创建菜单在鼠标位置右键弹出菜单 CMenu常用函数介绍工具栏方式一,从资源创建工具栏方式二,代码创建 状态栏状态栏基础创建状态栏 创建框架窗口 手动创建一个空项目ÿ…...
C语言中的位域:节省内存的标志位管理技术
位域(Bit-field) 是 C 语言中的一种特性,允许在结构体(struct)中定义占用特定位数的成员变量。通过位域,可以更精细地控制内存的使用,尤其是在需要存储多个布尔值或小范围整数时,可以…...
单端信号差分信号
单端信号和差分信号是电路中常见的两种信号传输方式,它们在具体的应用场景和特点上有着明显的区别。下面就来详细说明一下单端信号和差分信号的区别。 首先,单端信号是指信号通过一个信号线传输,通常一个信号线携带一个信号。这种传输方式适…...
数据设计(范式、步骤)
文章目录 数据设计1.数据库设计的三大范式2、数据库设计的具体步骤 数据设计 1.数据库设计的三大范式 关系型数据库的三大范式,指导如何设计一个关系型数据库。 1NF: 关系表的每个字段,都应该是不可再分的,——保证原子性。 字…...
Linux 中查看文件大小方法
目录 方法一:ls -l 输出的第五列方法二:du 命令的输出信息方法三:stat -c %s 的输出 方法一:ls -l 输出的第五列 ls 是列出指定目录下文件列表的命令,通过 -l 选项可以显示文件的属性信息,第五列显示的就是…...
SEO(搜索引擎优化)详解
SEO(搜索引擎优化)详解 SEO是Search Engine Optimization的缩写,中文称为"搜索引擎优化"。它是指通过一系列技术和方法,提高网站在搜索引擎自然(非付费)搜索结果中的排名,从而获得更…...
软考-高项,知识点一览十二 质量管理
十二 质量管理 项目质量管理包括把组织的质量政策应用于规划、管理、控制项目和产品质量要求,以满足干系人目标的各个过程。 项目质量管理需要兼顾项目管理与项目可交付成果两个方面,它适用于所有项目,无论项目的可付成果具有何种特性。 管…...
Docker 设置国内镜像源
Windows 和 macOS 用户 1、一般使用Docker Desktop软件,在 Docker Desktop 的图形界面中完成镜像源的更换操作。具体步骤如下: 打开 Docker Desktop 后,在菜单栏依次点击 Settings -> Docker Engine。此时会弹出一个 JSON 编辑框…...
探秘Transformer系列之(19)----FlashAttention V2 及升级版本
探秘Transformer系列之(19)----FlashAttention V2 及升级版本 文章目录 探秘Transformer系列之(19)----FlashAttention V2 及升级版本0x00 概述0x01 FlashAttention V21.1 动机1.2 方案1.2.1 减少冗余计算1.2.2 增加并行1.2.3 调整…...
《白帽子讲 Web 安全》之跨站请求伪造
引言 在数字化时代,网络已深度融入人们生活的方方面面,Web 应用如雨后春笋般蓬勃发展,为人们提供着便捷高效的服务。然而,繁荣的背后却潜藏着诸多安全隐患,跨站请求伪造(CSRF)便是其中极为隐蔽…...
C++20:make_shared_for_overwrite与make_unique_for_overwrite
文章目录 一、背景与动机二、std::make_shared_for_overwrite2.1 语法与用法2.2 优势 三、std::make_unique_for_overwrite3.1 语法与用法3.2 优势 四、应用场景4.1 高性能计算4.2 大型对象管理4.3 实时系统 五、总结 C20 引入了两个新的标准库函数: std::make_sha…...
北斗导航 | 改进奇偶矢量法的接收机自主完好性监测算法原理,公式,应用,RAIM算法研究综述,matlab代码
改进奇偶矢量法的接收机自主完好性监测算法研究 摘要 接收机自主完好性监测(RAIM)是保障全球导航卫星系统(GNSS)安全性的核心技术。针对传统奇偶矢量法在噪声敏感性、多故障隔离能力上的缺陷,本文提出一种基于加权奇偶空间与动态阈值的改进算法。通过引入观测值权重矩阵重…...
【React】基础版React + Redux实现教程,自定义redux库,Redux Toolkit教程
本项目是一个在react中,使用 redux 管理状态的基础版实现教程,用简单的案例练习redux的使用,旨在帮助学习 redux 的状态管理机制,包括 store、action、reducer、dispatch 等核心概念。 项目地址:https://github.com/Yv…...
onlyoffice实现office文件在线编辑保存
一、简介 onlyoffice是开源的在线文档编辑软件,支持主流的office格式,可实现文档在线编辑保存,多人协作编辑等场景,是目前我用过的功能最完善且强大的在线office编辑软件; 二、安装onlyoffice 这里仅介绍docker安装 简单运行查看sudo docker run -i -t -d -p 80:80 --…...
Transformer革命:人工智能如何突破语言理解的边界
Transformer革命:人工智能如何突破语言理解的边界? 当你在手机输入法中打出"苹果"时,系统是否知道你要输入水果还是手机品牌?这个看似简单的选择,背后隐藏着自然语言处理领域二十年来最深刻的变革。2017年谷…...
禅道品牌全面战略升级:开创项目管理国产化替代新格局
2025年,禅道软件完成企业品牌战略深度升级。此次升级,从产品力、服务力到生态圈构建等方面进行了全面优化,以更智慧的解决方案、更开放的生态布局,更安全的国产化解决方案,助力企业实现从“工具应用”到“价值创造”的…...
软件项目管理课程之第4讲:软件需求管理
讲授内容 项目案例 软件需求管理的基本概念 软件需求开发 软件需求管理 项目案例 案例背景:小王作为软件项目负责人,带领团队开展需求调查工作,但在需求分析和后续开发过程中出现了一系列问题。 问题表现: 项目规模庞大&…...
java基础知识和语法
1.类的信息加载完成后,会自动调用静态代码块,可以完成静态属性的初始化功能 对象准备创建时,也会自动调用代码块,但不是静态的; public class java_3_24 {public static void main(String[] args) {new User08();}} …...
横扫SQL面试——事件流处理(峰值统计)问题
横扫SQL面试 📌 事件流处理(峰值统计)问题 “会议室预定冲突怎么查? 🔍 服务器瞬时负载如何算?🎢 健身房的‘人挤人’高峰究竟出现在几点?🏃♂️” 这些看似毫不相干…...
如何降低频谱分析仪的底噪
测量微小信号的时候,底噪可能会淹没有用的信号:(如下图,底噪为-60dB) 如何降低底噪: 1.分辨率带宽RBW设置小一点,可以减小信号的底噪 2.减小衰减器(频谱分析仪底噪的功率随着输入衰…...
C语言基础知识09---文件操作
目录 文件操作 1.1 文件操作 1.2 文件操作的数据传输形式 1.3 文件操作的分类 1.4 文件存储格式 1.5 文件流指针 1.6 函数名:fopen() 1.7 函数名:fclose() 1.8 函数名:fprintf() 1.9 函数名:fscanf() 1.10 函数名&…...
GRS认证的主要步骤是什么?
GRS认证的具体步骤,是一个严谨而系统的过程,旨在确保产品从原料来源到最终消费的每一个环节都符合全球回收标准(Global Recycle Standard,简称GRS)的严格要求。 首先,企业需要向GRS认证机构提交申请&#…...
探究 CSS 如何在HTML中工作
2025/3/28 向全栈工程师迈进! 一、CSS的作用 简单一句话——美化网页 <p>Lets use:<span>Cascading</span><span>Style</span><span>Sheets</span> </p> 对于如上代码来说,其显示效果如下࿱…...
软件工程面试题(七)
1、DAO设计模式及DELEGATE模式 DAO(Data Access Object)模式实际上是两个模式的组合,即Data Accessor 模式和 Active Domain Object 模式,其中 Data Accessor 模式实现了数据访问和业务逻辑的分离,而Active Domain Object 模式实现了业务数据的对象化封装,一般我们将这两…...
AfxMessageBox()如何显示string字符串
书籍:《Visual C 2017从入门到精通》的2.7 字符串 环境:visual studio 2022 内容:几个字符串类型->(将单字节char*转换为宽字节wchar_t *) 在 MFC 中,AfxMessageBox 默认支持显示 CString 或宽字符字符…...
基于 kubekey -实现懒人一键部署K8S集群
基于 kubekey -实现懒人一键部署K8S集群 操作步骤 官网: https://kubesphere.io/zh/ 一、执行以下命令快速创建一个 Kubernetes 集群。 Master节点 如果您访问 GitHub/Googleapis 受限,请登录 Linux 主机,执行以下命令设置下载区域。 [roott…...
19款超级华丽动画的图片轮播HTML5+CSS3模板源码
大家好,我是分享源码和设计思想的程序媛, 今天给大家分享一个 19款超级华丽动画的图片轮播HTML5CSS3模板源码。 纯CSS3HTML5代码实现,没有任何其它杂乱的框架东西。 图片演示 1. 3D立方体轮播效果 2. 视差滚动轮播效果 3. 卡片堆叠轮播效果 4…...
第十六:redis 的 帖子投票要点
ZADD orders 100 order1 ZADD orders 200 order2 ZADD orders 300 order3 zadd myzset 100 nameorder // 添加一个有序集合 其中存储了用户的订单信息,每个订单用一个唯一的 ID 表示 ZSCORE myzset nameorder // myzset 是key nameorder 是成员ÿ…...
51c深度学习~合集4
我自己的原文哦~ https://blog.51cto.com/whaosoft/12327892 #robustlearn 本文提出了「鲁棒关键微调」,通过「微调」对抗训练模型的「非鲁棒关键性模块」,充分利用其冗余能力提升泛化性。 对抗训练(Adversarail Training)…...
解决Vmware 运行虚拟机Ubuntu22.04卡顿、终端打字延迟问题
亲测可用 打开虚拟机设置,关闭加速3D图形 (应该是显卡驱动的问题,不知道那个版本的驱动不会出现这个问题,所以干脆把加速关了)...
Arduino硬件控制开发基础资料
Arduino 的程序可以划分为三个主要部分:结构、变量(变量与常量)、函数。 结构部分 一、结构 1.1 setup() 1.2 loop() 二、结构控制 2.1 if 2.2 if...else 2.3 for 2.4 switch case 2.5 while 2.6 do... while 2.7 break 2.8 cont…...
地图项目入手学习
如果你目前对自己的地图项目实现原理不太了解,周末可以通过以下方法进行高效学习: ⸻ 第一步:梳理项目相关代码(3 小时) 目标:先大致了解你的地图项目代码,找到核心实现逻辑。 具体做法&…...
OpenCV图像处理:边缘检测
文章目录 前言一、什么是边缘检测?二、算法分类1、Sobel算子2、Scharr算子3、Canny边缘检测3.1 Canny检测的优点3.2 Canny 边缘检测分为 4 个部分3.2.1 、图像降噪3.2.2 、梯度计算3.2.3 、非极大值抑制3.2.4 、双阈值边界跟踪 4、算法比较 三、代码实现总结 前言 …...
性能测试~
1.什么是性能测试 1.什么是性能 就像这两个车一样,虽然都是代步工具,构造都是一样的,但是路虎的发动机要比捷达好.路虎的百米加速却是比捷达快的,我们就知道路虎的性能要比捷达好 . 那么什么是软件的性能呢?我们分析一下 2.常见的性能测试指标 2.1并发数 并发数是指在同一…...
pagehelper 分页插件使用说明
pom.xml:pageHelper坐标 <!--pageHelper坐标--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version></dependency> 分…...
使用crypto-js进行DES加/解密
crypto-js 官方网站:https://github.com/brix/crypto-js 中文参考教程:前端加密JS库–CryptoJS 使用指南 在线加解密网站:https://www.mklab.cn/utils/des 首先要安装crypto-js库,根据自己使用的方式按照官方网站步骤进行即可。 …...