C++从入门到实战(十一)详细讲解C/C++语言中内存分布与C与C++内存管理对比
C++从入门到实战(十一)详细讲解C/C++语言中内存分布与C与C++内存管理对比
- 前言
- 一、C/C++语言中内存分布
- 1.内核空间
- 2.栈
- 3.堆
- 4.数据段
- 5.代码段
- 二、例题带练巩固C/C++语言中内存分布的知识
- 题目讲解
- 题目答案
- 三、C语言动态内存分配(知识回顾)
- 3.1 为什么需要动态内存分配
- 3.2 malloc 函数
- 3.3 calloc 函数
- 3.4 realloc 函数
- 3.5 free 函数
- 3.6 C语言动态内存分配的缺点
- 四、C++动态内存分配
- 1. new 和 delete
- 2. new[] 和 delete[] 运算符
- 五、C与C++内存管理对比
- 5.1 C语言内存管理
- 5.2 C++内存管理
- 5.3 C 与 C++ 内存管理对比表格
前言
- 在之前的博客系列中,我们深入探讨了C++的第一个重要阶段——类和对象,以及与之相关的诸多核心内容,包括四大构造函数、类的种类、内部类、匿名类、友元等。
- 这些知识点如同坚实的基石,为后续的C++学习构建了稳固的基础,帮助我们逐步建立起对C++面向对象编程的深刻理解。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12880513.html?spm=1001.2014.3001.5482
- 接下来,我们将开启新的篇章,深入剖析C/C++语言中的内存分布,并对比C与C++在内存管理方面的差异。
一、C/C++语言中内存分布
1.内核空间
- 内核空间(Kernel Space):相当于 “管理层办公室”,存放着操作系统的核心代码(比如管理 CPU、内存、硬盘的程序)。只有 “管理层”(内核程序)能进去,普通程序不能随便访问,权限很高,负责处理最底层的硬件资源。
2.栈
- 栈是一种后进先出(LIFO)的数据结构,用于存储局部变量、函数调用信息等。
- 每当调用一个函数时,系统会在栈上为该函数的局部变量分配内存,函数执行完毕后,这些内存会被自动释放。
想象你去食堂打饭,餐盘是按顺序叠起来的:后放上去的餐盘先被拿走(后进先出)。
- 栈就是这样一个 “自动清理的临时货架”,存放函数运行时的 临时数据(比如局部变量、函数参数、返回地址)。程序会自动分配和释放空间,不需要你手动管理。
// 函数,函数代码存储在代码段
void func() {// 局部变量,存储在栈上int local_variable = 30;std::cout << "Local variable: " << local_variable << std::endl;
}// 调用函数,函数调用信息和局部变量会在栈上操作int main(){func();}
3.堆
堆是用于动态分配内存的区域,程序可以在运行时从堆中请求和释放内存。
想象你去超市存包,储物柜可以按需申请:你觉得需要多大空间,就租多大的柜子,用完自己关门(释放),不关门的话柜子会一直被占着(内存泄漏)。
- 堆就是这样一个 “动态分配的内存区域”,程序运行时可以主动申请(如 C 语言的 malloc、Python 的 list 扩容)和释放(free),空间大小不固定,灵活但需要自己管理
// 使用 malloc 分配内存int *ptr_malloc = (int *)malloc(5 * sizeof(int));// 使用 calloc 分配内存int *ptr_calloc = (int *)calloc(5, sizeof(int));// 使用 realloc 调整内存大小ptr_malloc = (int *)realloc(ptr_malloc, 10 * sizeof(int));// 释放内存free(ptr_malloc);free(ptr_calloc);
- 上面的代码均在堆上执行
4.数据段
- 数据段用于存储全局变量和静态变量。
- 全局变量在程序的整个生命周期内都存在,并且可以被程序的任何部分访问。
- 数据段的代码程序运行时一直存在,直到程序结束才释放
// 全局变量,存储在数据段
int global_variable = 10;// 静态变量,存储在数据段
static int static_variable = 20;void func() {static int static_age = 18; // 静态局部变量,也存在数据段
}
5.代码段
- 代码段存放程序的可执行代码(二进制指令),比如我们写的 if、for、函数逻辑等,运行时只能被执行,不能被修改(防止程序运行时代码被破坏)
二、例题带练巩固C/C++语言中内存分布的知识
- 学习完上面的知识,我们用一道典型的企业面试常考例题来巩固一下我们刚刚学到的知识
我们来看下面的一段代码和相关问题
int globalVar = 1;static int staticGlobalVar = 1;void Test(){static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);}
- 题目
题目讲解
int globalVar = 1;static int staticGlobalVar = 1;void Test(){static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);}
-
结合我们刚刚讲的知识和例子和知识
-
globalVar:全局变量,存放在 数据段(静态区)数据段用于存放全局变量和静态变量。
-
staticGlobalVar:静态全局变量,也在 数据段(静态区)。静态全局变量本质还是全局变量,只是作用域受限。
-
staticVar:静态局部变量,存于 数据段(静态区)。静态局部变量生命周期长,存储在数据段。
-
localVar:局部变量,存于 栈 中。栈用于存放局部变量,由系统自动分配释放。
-
num1:局部数组,也存于 栈 中,数组作为局部变量,空间在栈中分配。
-
char2:字符数组(局部),存于 栈。数组本身是局部变量,元素空间在栈中。
-
*char2:char2 是栈中的数组,*char2 访问栈中数组元素,存于 栈。
-
pChar3:指针变量(局部),存于 栈。指针本身作为局部变量,空间在栈。
-
*pChar3:pChar3 指向字符串常量 “abcd”,字符串常量存于 代码段(常量区)。代码段存放常量。
-
ptr1:指针变量(局部),存于 栈。指针本身是局部变量,在栈中。
-
*ptr1:ptr1 指向 malloc 分配的内存,malloc 分配的内存来自 堆。堆用于动态内存分配。
题目答案
- 结合我们刚刚的知识。想必大家已经搞定了刚刚的例题,下面我们将例题的答案放出来
三、C语言动态内存分配(知识回顾)
- 在正式开始C++的new与delete之前,我们需要回顾并补充一些知识C语言的知识,以便我们后续的理解
3.1 为什么需要动态内存分配
在许多场景下,我们在编写代码时可能并不清楚程序运行时到底需要多少内存。
- 例如,你要存储用户输入的一串字符,可用户输入的字符数量并不固定。
- 这种情况下,动态内存分配就能派上用场,它可以让程序在运行时根据实际需求来分配内存。
C语言提供了几个用于动态内存分配的函数,这些函数都在 <stdlib.h>
头文件中。
3.2 malloc 函数
malloc
函数用于分配指定大小的内存块,其原型如下:
void* malloc(size_t size);
size
表示要分配的内存字节数,若分配成功,函数会返回一个指向该内存块起始位置的指针;若分配失败,则返回 NULL
。
下面是一个简单的示例:
#include <stdio.h>
#include <stdlib.h>int main() {// 分配一个能存储 5 个整数的内存块int *ptr = (int *)malloc(5 * sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 给分配的内存块赋值for (int i = 0; i < 5; i++) {ptr[i] = i;}// 打印内存块中的值for (int i = 0; i < 5; i++) {printf("%d ", ptr[i]);}printf("\n");// 释放分配的内存free(ptr);return 0;
}
3.3 calloc 函数
calloc
函数和 malloc
类似,不过它会把分配的内存初始化为 0。其原型如下:
void* calloc(size_t num, size_t size);
num
代表要分配的元素数量,size
表示每个元素的大小。
以下是使用 calloc
的示例:
#include <stdio.h>
#include <stdlib.h>int main() {// 分配一个能存储 5 个整数的内存块,并初始化为 0int *ptr = (int *)calloc(5, sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 打印内存块中的值for (int i = 0; i < 5; i++) {printf("%d ", ptr[i]);}printf("\n");// 释放分配的内存free(ptr);return 0;
}
3.4 realloc 函数
realloc
函数用于调整已分配内存块的大小。其原型如下:
void* realloc(void* ptr, size_t size);
ptr
是指向已分配内存块的指针,size
是新的内存块大小。若分配成功,函数会返回一个指向新内存块起始位置的指针;若失败,则返回 NULL
。
下面是使用 realloc
的示例:
#include <stdio.h>
#include <stdlib.h>int main() {// 分配一个能存储 5 个整数的内存块int *ptr = (int *)malloc(5 * sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}// 给分配的内存块赋值for (int i = 0; i < 5; i++) {ptr[i] = i;}// 调整内存块大小,使其能存储 10 个整数ptr = (int *)realloc(ptr, 10 * sizeof(int));if (ptr == NULL) {printf("内存重新分配失败\n");return 1;}// 给新分配的内存块赋值for (int i = 5; i < 10; i++) {ptr[i] = i;}// 打印内存块中的值for (int i = 0; i < 10; i++) {printf("%d ", ptr[i]);}printf("\n");// 释放分配的内存free(ptr);return 0;
}
3.5 free 函数
free
函数用于释放之前动态分配的内存。其原型如下:
void free(void* ptr);
ptr
是指向要释放的内存块的指针。一旦内存被释放,就不能再使用该指针访问这块内存了。
3.6 C语言动态内存分配的缺点
- 在我们刚刚的代码中,我们发现
- 在 C 语言中,使用malloc、calloc和realloc函数进行动态内存分配时,返回的是void*类型的指针。
- 这就要求程序员手动将其转换为所需的指针类型,若转换出错,就可能在运行时引发难以调试的错误。
- 而且,C 语言主要是面向过程的语言,动态分配的内存只是简单的字节块,无法自动调用对象的构造函数和析构函数。
- 在处理复杂的数据类型(如类对象)时,就需要手动管理对象的初始化和清理工作,容易出错
- C 语言没有内置的异常处理机制,在内存分配失败时,通常只能通过返回NULL指针来表示错误,程序员需要手动检查返回值并进行相应处理,代码会变得繁琐
因此C++ 引入了new和delete运算符来进行动态内存分配和释放,它们能很好地解决 C 语言动态内存分配的部分问题
四、C++动态内存分配
1. new 和 delete
C++ 引入了new和delete运算符来进行动态内存分配和释放,它们能很好地解决 C 语言动态内存分配的部分问题
- new 运算符:用于动态分配内存,同时会自动调用对象的构造函数。
- delete 运算符:用于释放动态分配的内存,同时会自动调用对象的析构函数
#include <iostream>class MyClass {
public:MyClass() {std::cout << "构造函数被调用" << std::endl;}~MyClass() {std::cout << "析构函数被调用" << std::endl;}
};int main() {// 使用new分配内存并创建对象MyClass *obj = new MyClass();// 使用对象// ...// 使用delete释放内存delete obj;return 0;
}
2. new[] 和 delete[] 运算符
- 若要动态分配数组,可使用new[]和delete[]运算符
#include <iostream>class MyClass {
public:MyClass() {std::cout << "构造函数被调用" << std::endl;}~MyClass() {std::cout << "析构函数被调用" << std::endl;}void printMessage() {std::cout << "这是 MyClass 类对象的消息。" << std::endl;}
};int main() {// 使用new[]分配数组内存MyClass* arr = new MyClass[3];// 使用数组,遍历数组并调用成员函数for (int i = 0; i < 3; ++i) {arr[i].printMessage();}// 使用delete[]释放数组内存delete[] arr;return 0;
}eturn 0;
}
五、C与C++内存管理对比
5.1 C语言内存管理
C语言主要通过标准库函数来进行内存管理,核心函数有 malloc
、calloc
、realloc
和 free
。下面是这些函数的详细介绍:
malloc
:用来分配指定大小的内存块,返回的是void*
类型指针,需要手动进行类型转换。分配的内存内容是未初始化的。calloc
:功能和malloc
类似,不过它会把分配的内存初始化为 0。realloc
:用于调整已经分配的内存块大小,可以扩大或缩小。free
:释放之前动态分配的内存,释放后该内存可被系统重新使用。
5.2 C++内存管理
C++ 除了可以使用 C 语言的内存管理函数,还引入了 new
和 delete
运算符来进行动态内存管理。
new
:用于动态分配内存,会自动调用对象的构造函数。对于单个对象使用new
,对于数组使用new[]
。delete
:用于释放new
分配的内存,会自动调用对象的析构函数。对应new
使用delete
,对应new[]
使用delete[]
。
5.3 C 与 C++ 内存管理对比表格
对比项 | C 语言 | C++ |
---|---|---|
内存分配函数/运算符 | malloc 、calloc 、realloc | new 、new[] |
内存释放函数/运算符 | free | delete 、delete[] |
类型安全性 | 返回 void* 指针,需要手动类型转换,类型安全性低 | 直接返回正确类型的指针,无需手动转换,类型安全性高 |
对象构造和析构 | 不支持自动调用构造和析构函数,需要手动管理 | 自动调用构造和析构函数,简化对象生命周期管理 |
异常处理 | 内存分配失败返回 NULL ,需手动检查 | 内存分配失败抛出 std::bad_alloc 异常,可使用 try-catch 处理 |
代码风格 | 面向过程,使用函数进行内存管理 | 面向对象,使用运算符进行内存管理,与类和对象结合紧密 |
- C 语言的内存管理方式更偏向于底层和过程化,需要程序员手动处理很多细节,容易出错。
- 而 C++ 的内存管理方式在类型安全性、对象生命周期管理和异常处理方面有很大改进,更适合开发大型、复杂的面向对象程序。
- 不过,在一些性能敏感或者需要与 C 代码兼容的场景中,C 语言的内存管理方式仍然很有用。
以上就是这篇博客的全部内容,下一篇我们将继续探索C++中new和delete中更多精彩内容。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的C++知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12880513.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |
相关文章:
C++从入门到实战(十一)详细讲解C/C++语言中内存分布与C与C++内存管理对比
C从入门到实战(十一)详细讲解C/C语言中内存分布与C与C内存管理对比 前言一、C/C语言中内存分布1.内核空间2.栈3.堆4.数据段5.代码段 二、例题带练巩固C/C语言中内存分布的知识题目讲解题目答案 三、C语言动态内存分配(知识回顾)3.…...
flutter 专题 一百零四 Flutter环境搭建
Flutter简介 Flutter 是Google开发的一个移动跨平台(Android 和 iOS)的开发框架,使用的是 Dart 语言。和 React Native 不同的是,Flutter 框架并不是一个严格意义上的原生应用开发框架。Flutter 的目标是用来创建高性能、高稳定性…...
傅里叶与相位偏移
一、简介 大三的《离散数学》。。。。。 傅里叶变换是数学与工程领域的一项革命性工具,其核心思想是将复杂信号分解为简单正弦波的叠加,实现从时域(时间维度)到频域(频率维度)的转换。通过这种变换&#x…...
Godot笔记:入门索引
文章目录 前言游戏引擎软件界面关键概念GDScript导出成品创建非游戏应用后记 前言 最近对游戏引擎这块感兴趣,特别是因为游戏引擎自带的很多工具,作为图形化软件的开发应该也不错。 Godot 是一款这几年比较流行的开源游戏引擎。这里记录下入门学习使用 …...
OpenCV实战教程 第一部分:基础入门
第一部分:基础入门 1. OpenCV简介 什么是OpenCV及其应用领域 OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,于1999年由Intel公司发起,现在由非营利组织OpenCV.org维护。Ope…...
OpenCV 图像处理核心技术 (第二部分)
欢迎来到 OpenCV 图像处理的第二部分!在第一部分,我们学习了如何加载、显示、保存图像以及访问像素等基础知识。现在,我们将深入探索如何利用 OpenCV 提供的强大工具来修改和分析图像。 图像处理是计算机视觉领域的基石。通过对图像进行各种…...
Git从入门到精通-第二章-工具配置
目录 命令行 安装Git 初次运行Git前的配置 git config基本概念 常用命令 配置用户信息 配置文本编辑器 查看配置 配置别名(简化命令) 高级配置 换行符处理(方便跨平台协作) 忽略文件权限变更(常用于团队协…...
树状结构转换工具类
项目中使用了很多树状结构,为了方便使用开发一个通用的工具类。 使用工具类的时候写一个类基础BaseNode,如果有个性化字段添加到类里面,然后就可以套用工具类。 工具类会将id和pid做关联返回一个树状结构的集合。 使用了hutool的工具包判空…...
C#基础简述
C#基础详解 一、C#语言概述 C#(读作"C Sharp")是微软开发的面向对象的编程语言,运行在.NET平台上。它结合了C的强大功能和Visual Basic的简单性,具有以下特点: 面向对象:支持封装、继…...
AI赋能烟草工艺革命:虫情监测步入智能化时代
在当今竞争激烈且品质至上的烟草行业中,生产流程的每一个细微环节都关乎着企业的生死存亡与品牌的兴衰荣辱。烟草工艺部门与制丝、卷包车间作为生产链条的核心驱动,犹如精密仪器中的关键齿轮,彼此紧密咬合、协同运转,任何一处的小…...
小刚说C语言刷题—1462小明的游泳时间
1.题目描述 伦敦奥运会要到了,小明在拼命练习游泳准备参加游泳比赛。 这一天,小明给自己的游泳时间做了精确的计时(本题中的计时都按 24 小时制计算),它发现自己从 a 时 b 分一直游泳到当天的 c 时 d 分。 请你帮小…...
StarRocks Lakehouse 如何重构大数据架构?
随着数据分析需求的不断演进,企业对数据处理架构的期望也在不断提升。在这一背景下,StarRocks 凭借其高性能的实时分析能力,正引领数据分析进入湖仓一体的新时代。 4 月 18 日,镜舟科技高级技术专家单菁茹做客开源中国直播栏目《…...
用TCP实现服务器与客户端的交互
引言: 这篇文章主要是用TCP构造的回显服务器,也就是客户端发什么,就返回什么。用实现这个过程方式来学会TCP套接字的使用。 一、TCP的特点 TCP是可靠的:这个需要去了解TCP的机制,这是一个大工程,博主后面写…...
用于实时辐射场渲染的3D高斯溅射——3D Gaussian Splatting for Real-Time Radiance Field Rendering
用于实时辐射场渲染的3D高斯溅射——3D Gaussian Splatting for Real-Time Radiance Field Rendering 文章目录 用于实时辐射场渲染的3D高斯溅射——3D Gaussian Splatting for Real-Time Radiance Field Rendering摘要Abstract1. 预备知识1.1 三维的几何表示1.2 计算机中的集合…...
Vue3 Echarts 3D立方体柱状图实现教程
文章目录 前言一、实现原理二、series ——type: "pictorialBar" 简介2.1 常用属性 三、代码实战3.1 封装一个echarts通用组件 echarts.vue3.2 实现一个立方体柱状图(1)首先实现一个基础柱状图(2)添加立方体棱线&#x…...
Soildworks怎样在装配体中建立局部剖视图
1思路:建立拉伸切除 2步骤 1-打开点线面显示按钮 2-在装配体中依据某个基准面(例如前视基准面)建立一个待切除的草图 3-点击顶部工具栏的装配体--->装嫩配体特征---->拉伸切除---Ok 3具体图示 1-点击,使其变成灰色 即…...
基于C++的IOT网关和平台5:github项目ctGateway开发指南
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 …...
虚拟机centos7安装docker
虚拟机CentOS 7上安装 Docker流程 1. 更新系统软件包 需要确保系统软件包是最新的 sudo yum -y update sudo:以超级用户权限执行命令。 yum:CentOS的包管理器工具。 -y:自动确认所有提示,直接执行。 2. 安装 Docker 依赖 在安装 …...
11.Spring Boot 3.1.5 中使用 SpringDoc OpenAPI(替代 Swagger)生成 API 文档
Spring Boot 3.1.5 中使用 SpringDoc OpenAPI(替代 Swagger)生成 API 文档 1. 项目结构 假设项目名为 springboot-openapi-demo,以下是项目的基本结构: springboot-openapi-demo/ ├── src/ │ ├── main/ │ │ ├─…...
pytorch对应gpu版本是否可用判断逻辑
# gpu_is_ok.py import torchdef check_torch_gpu():# 打印PyTorch版本print(f"PyTorch version: {torch.__version__}")# 检查CUDA是否可用cuda_available torch.cuda.is_available()print(f"CUDA available: {cuda_available}")if cuda_available:# 打印…...
Kubernetes 集群概念详解
Kubernetes 集群概念详解 Kubernetes 集群是由多个计算节点组成的容器编排系统,用于自动化部署、扩展和管理容器化应用。以下是 Kubernetes 集群的核心概念和架构解析: 一、集群基础架构 1. 集群组成要素 graph TBMaster[控制平面] --> Node1[工作…...
BT137-ASEMI机器人功率器件专用BT137
编辑:LL BT137-ASEMI机器人功率器件专用BT137 型号:BT137 品牌:ASEMI 封装:TO-220F 批号:最新 引脚数量:3 封装尺寸:如图 特性:双向可控硅 工作结温:-40℃~150℃…...
ArcGIS+GPT:多领域地理分析与决策新方案
技术点目录 AI大模型应用ArcGIS工作流程及功能prompt的使用技巧AI助力工作流程AI助力数据读取AI助力数据编辑与处理AI助力空间分析AI助力遥感分析AI助力二次开发AI助力科研绘图ArcGISAI综合应用了解更多 ——————————————————————————————————…...
鸿蒙文件上传-从前端到后端详解,对比jq请求和鸿蒙arkts请求区别,对比new FormData()和鸿蒙arktsrequest.uploadFile
需要权限:ohos.permission.INTERNET 1.nodejs自定义书写上传后端接口 传输过来的数据放在files?.image下 router.post(/upload,(req, res) > {var form new multiparty.Form();form.uploadDirpublic/images/uploads; //上传图片保存的地址(目录必须存在)fo…...
【DBeaver】如何连接MongoDB
MongoDB驱动 在 DBeaver 社区版是没有的,得自己下载 一、下载mongo-jdbc-standalone.jar 二、在工具栏找到数据库,选择驱动管理器 三、在驱动管理器点击新建 四、选择库,添加mongo-jdbc-standalone.jar;然后点击找到类 五、选择设置&#x…...
Unity 粒子同步,FishNet
Github的工程 同步画面 使用FishNet插件同步,可使用这个选项来克隆第二个项目进行测试...
自然语言处理之命名实体识别:Bi-LSTM-CRF模型的评估与性能分析
命名实体识别(Named Entity Recognition, NER)是自然语言处理(NLP)的核心任务之一,旨在从文本中识别出具有特定意义的实体(如人名、地名、机构名等),并为其分类。随着深度学习的发展,**Bi-LSTM-CRF**(双向长短期记忆网络结合条件随机场)模型因其强大的序列建模能力成…...
【SpringBoot】基于mybatisPlus的博客系统
1.实现用户登录 在之前的项目登录中,我使用的是Session传递用户信息实现校验登录 现在学习了Jwt令牌技术后我尝试用Jwt来完成校验工作 Jwt令牌 令牌一词在网络编程一节我就有所耳闻,现在又拾了起来。 这里讲应用:令牌也就用于身份标识&a…...
[Android]任务列表中有两个相机图标
现象: 修改AndroidManifest.xml <activityandroid:name"com.android.camera.PermissionsActivity"android:label"string/app_name"android:launchMode"singleTop"android:configChanges"orientation|screenSize|keyboardH…...
VINS-FUSION:配置参数说明与配置自己的参数
文章目录 📚简介📍配置文件说明📷相机配置参数🔧设备参数🎯配置自己的参数📷相机参数🔧设备参数📚简介 VINS-Fusion 是一个基于优化的多传感器状态估计器,实现了视觉惯性里程计(VIO)和视觉惯性全球导航卫星系统(VI-GNSS)融合。 📍配置文件说明 VINS-Fus…...
Polars: 新一代高性能数据处理库
<------最重要的是订阅“鲁班模锤”------> 在数据科学和数据分析领域,性能和效率一直是从业者关注的焦点。随着数据量的爆炸式增长,传统的数据处理工具如pandas在处理大规模数据时逐渐显露出其局限性。在这样的背景下,一个名为Polars…...
大屏/门户页面兼容各种分辨率或电脑缩放
需求要求: 需要支持缩放功能(缩放后 页面各元素模块正常展示)、 需要适配各种分辨率(初始加载不应出现横向滚动条) 选择的实现方案 利用 zoom 或者 transform 来缩放兼容页面样式,不动业务模块代码 const isMobile /iPhone|iPad|iPod|Android|Harmony/i.test(navi…...
自定义项目中导入文件import顺序
项目中import 顺序 分类顺序 可以根据模块或文件的功能、类型等进行分类,比如将所有的组件放在一起、工具函数放在一起等。这样的组织方式更有利于对项目结构和代码逻辑的理解,当需要查找某一类功能的代码时,可以快速定位到相应的 import 区…...
Git 本地提交撤销
引言 在 Git 版本控制系统中,偶尔会遇到需要撤销本地提交的情况。本文将详细介绍如何优雅地处理这种情况,帮助您在不慌乱的情况下恢复错误提交。 撤销本地提交的主要方法 当您意外提交了错误文件到 Git 仓库,但尚未推送到远程服务器时&…...
k8s术语之Replication Controller
Replication Controller 在kubernetes中简称RC,它其实是定义了一个期望的场景,即声明某种Pod的副本数量在任意时刻都符合某个预期值,包括一下几个值: 1.Pod期待的副本数(replicas) 2.用于筛选目标Pod的Lable Selector 3.当…...
AI驱动视频批量智能混剪软件生产技术实践
一、引言:短视频工业化生产的技术革新 在电商带货、知识分享等领域,高效产出差异化视频内容成为核心竞争力。本文结合AI技术与工程实践,解析如何通过智能素材处理、参数化合成引擎、多维度质量控制构建全自动视频生产流水线,实现…...
SPL 量化 回测
回测是一种评估交易策略的通用方法。它通过计算策略在历史数据上的表现来评估交易策略的可行性。如果回测结果良好,交易者和分析师可能会有信心在未来继续使用该策略。 1. 回测脚本 首先要编写回测脚本,将回测脚本保存为 backtest.splx。 脚本代码如下…...
2025年“深圳杯”数学建模挑战赛A题-芯片热弹性物理参数估计
芯片热弹性物理参数估计 小驴数模 当今时代,芯片无疑是现代社会发展的 “核心引擎”。它深度嵌入智能手机,实现全球即时通讯;助力汽车智能驾驶,精准导航、自动操控;赋能工业自动化生产线,高效运转。但随着…...
前端笔记-Element-Plus
结束了vue的基础学习,现在进一步学习组件 Element-Plus部分学习目标: Element Plus1、查阅官方文档指南2、学习常用组件的使用方法3、Table、Pagination、Form4、Input、Input Number、Switch、Select、Date Picker、Button5、Message、MessageBox、N…...
vue3封装全局方法
场景:各个模块详情中存在附件列表数据,需要再每个中添加一个预览附件的方法,是后期提出的需求,所以要在每个模块中进行添加,就去将预览方法封装一下。 将公共方法封装在utils下 utils/filePreview.ts import router…...
Django 学习指南:从入门到精通(大体流程)
想要快速掌握 Django 开发技能吗?按照以下学习流程,带你从零基础成长为独立开发 Web 应用的高手。 一、准备工作:打下坚实基础 在开启 Django 之旅前,先确保你已掌握以下 Python 基础知识: 数据类型:熟悉数…...
Java对集合进行操作,赋值新字段
1、方法一:增强for循环 List<Refund> list refundService.selectRefundList(queryParam); for (Refund refund : list) {refund.setPayWay(refund.getPaymentMethod()); // 将支付方式赋值给付款方式 }在 Java 中,当你使用 for 循环遍历 List<…...
【网工第6版】第6章 网络安全③
目录 ■ 虚拟专用网VPN ◆虚拟专用网基础 ◆VPN分类 ▲根据应用场景不同分类 ▲根据VPN技术实现的网络层次分类 ◎ 二层隧道协议:L2TP和PPTP ◎ 网络层隧道协议:IPSec和GRE ※ IPSec IPSec基础 IPSec原理 IPSec两种封装模式 ※ GRE ■ 应用…...
20250430在ubuntu14.04.6系统上查看系统实时网速
rootrootubuntu:~$ sudo apt-get install iftop 【不需要root权限】 rootrootubuntu:~$ sudo apt-get install nload rootrootubuntu:~$ sudo apt-get install vnstat 【失败】 rootrootubuntu:~$ sudo apt-get install speedtest-cli rootrootubuntu:~$ sudo apt-get install …...
远程 Debugger 多用户环境下的用户隔离实践
远程 Debugger 多用户环境下的用户隔离实践 在现代分布式开发和云原生环境下,远程 Debugger 的应用愈发普遍。然而,随着多人协作和多租户场景的出现,**远程 Debugger 的“用户隔离”**变得至关重要。只有实现了良好的用户隔离,才…...
Neo4j多关系或多路径
目录 一、双向关系 1.创建2个节点间的双向关系 2.创建多个路径的节点,双向关系 3.查询带有方向性的关系 4.查询路径上的多个关系 5.查询出a到b的最短距离 6.查询特定长度的路径 二、将之前的关系清空下,如图所示,在操作一次 1.查询出…...
Locate 3D:Meta出品自监督学习3D定位方法
标题: Locate 3D: Real-World Object Localization via Self-Supervised Learning in 3D 摘要: 我们提出了 Locate 3D,这是一种可根据指代表达(如“沙发和灯之间的小咖啡桌”)在三维场景中定位物体的模型。Locate 3…...
Copilot for Excel 一键词云分析与情绪分析
在Excel中使用copilot对数据进行高级分析,我们已经领略过copilot的强悍能力: 零代码、超越DeepSeek:Excel高级数据分析,copilot加持、Python助力 Python in Excel高级分析:一键RFM分析 然而,很多时候我们…...
【Linux 网络】网络工具ifconfig和iproute/iproute2工具详解
【Linux 网络】网络工具ifconfig和iproute/iproute2工具详解 前言1、安装2、常用命令3、命令使用详解 前言 本篇文章主要介绍Linux下网络工具ifconfig/iproute(iproute2)的安装、使用示例和场景。操作系统Ubuntu 18.04。 1、安装 使用apt-get install 命令安装ifconfig和ipr…...
硬盘分区丢失≠末日!3步逻辑恢复法+物理修复全流程图解
引言:硬盘分区丢失——数据安全的“隐形杀手” 在数字化时代,硬盘作为数据存储的核心载体,承载着个人、企业乃至社会的关键信息。然而,硬盘分区丢失这一突发状况,往往让用户措手不及:文件系统突然报错、盘…...