CUDA编程之内存
CUDA的内存类型有全局内存、共享内存、常量内存、纹理内存、本地内存、寄存器等。我们需要分别了解它们的特点和使用场景。在CUDA编程中,合理利用各种内存类型对性能优化至关重要。
1. 全局内存(Global Memory)
- 特点:设备中最大、最慢的内存,所有线程均可访问,需通过合并访问优化带宽。
- 使用方法:
- 分配与传输:
float *d_data; cudaMalloc(&d_data, size); // 分配 cudaMemcpy(d_data, h_data, size, cudaMemcpyHostToDevice); // 数据传输
- 核函数访问:
__global__ void kernel(float *data) {int idx = blockIdx.x * blockDim.x + threadIdx.x;data[idx] *= 2; // 合并访问(连续线程访问连续地址) }
- 分配与传输:
2. 共享内存(Shared Memory)
- 特点:块内线程共享,速度快,需避免Bank Conflict。
- 使用方法:
- 静态声明:
__global__ void reduce0(float *g_in,float *g_out) {//每个线程从全局内存中加载一个对应位置元素到共享内存__shared__ float s_data[256]; //共享内存大小等于线程块的大小int tid = threadIdx.x; //共享内存中的索引,即在线程块中的编号int i = blockIdx.x * blockDim.x + threadIdx.x; //全局内存中的索引s_data[tid] = g_in[i];__syncthreads(); //同步等待共享内存加载完毕//归约操作优化(避免Bank Conflict)//在共享内存做相邻配对归约,线程和数据序号一一对应for(int s = 1; s < blockDim.x; s *= 2) {if(tid % (2 * s) == 0) {s_data[tid] += s_data[tid + s];}__syncthreads();}//把结果写回全局内存if (tid == 0) g_out[blockIdx.x] = s_data[0]; }__global__ void reduce1(float *g_in,float *g_out) {//每个线程从全局内存中加载一个对应位置元素到共享内存__shared__ float s_data[256];//共享内存大小等于线程块的大小int tid = threadIdx.x; //共享内存中的索引,即在线程块中的编号int i = blockIdx.x*blockDim.x + threadIdx.x;//全局内存中的索引s_data[tid] = g_in[i];__syncthreads(); //同步等待共享内存加载完毕//归约操作优化(避免Bank Conflict)//在共享内存做相邻配对归约,线程和数据序号间隔对应for(int s = 1; s < blockDim.x; s *= 2) {int index = 2 * s * tid;if (index < blockDim.x) {s_data[index] += s_data[index + s];}__syncthreads();}//把结果写回全局内存if (tid == 0) g_out[blockIdx.x] = s_data[0]; }__global__ void reduce2(float *g_in,float *g_out) {//每个线程从全局内存中加载一个对应位置元素到共享内存__shared__ float s_data[256];//共享内存大小等于线程块的大小int tid = threadIdx.x; //共享内存中的索引,即在线程块中的编号int i = blockIdx.x * blockDim.x + threadIdx.x;//全局内存中的索引s_data[tid] = g_in[i];__syncthreads(); //同步等待共享内存加载完毕//归约操作优化(避免Bank Conflict)//在共享内存做交错配对归约for(int s = (blockDim.x >> 1); s > 0; s >>= 1) {if (tid < s) {s_data[tid] += s_data[tid + s];}__syncthreads();}//把结果写回全局内存if (tid == 0) g_out[blockIdx.x] = s_data[0]; }
- 动态声明:
extern __shared__ float sdata[]; // 核函数调用时指定大小:<<<grid, block, smem_size>>>
- 静态声明:
3. 常量内存(Constant Memory)
- 特点:只读,适合频繁访问的常量数据,具有缓存优化。
- 使用方法:
- 声明与数据拷贝:
__constant__ float const_data[1024]; cudaMemcpyToSymbol(const_data, h_data, sizeof(float)*1024);
- 核函数中直接访问:
__global__ void kernel() {float value = const_data[threadIdx.x]; }
- 声明与数据拷贝:
4. 纹理内存(Texture Memory)
- 特点:适合具有空间局部性的访问,如图像处理。
-
纹理内存的寻址模式:
寻址模式有几种:cudaAddressModeWrap、cudaAddressModeClamp、cudaAddressModeBorder、cudaAddressModeMirror
cudaAddressModeWrap:循环模式,超出范围的坐标会循环到另一侧。比如,当x坐标超过宽度时,会回到起始位置,类似取模操作。
cudaAddressModeClamp:防止数据外溢,越界坐标取边界值。
cudaAddressModeBorder:严格限制数据范围,越界坐标返回零值。
cudaAddressModeMirror:对称信号处理,越界坐标镜像对称。 - 使用方法:
- 创建纹理对象:
texture<float, 1, cudaReadModeElementType> tex_ref; cudaArray *cuArray; cudaMallocArray(&cuArray, &tex_ref.channelDesc, size); cudaMemcpyToArray(cuArray, 0, 0, h_data, size, cudaMemcpyHostToDevice); cudaBindTextureToArray(tex_ref, cuArray);
- 核函数采样:
__global__ void kernel() {float value = tex1Dfetch(tex_ref, threadIdx.x); }
- 创建纹理对象:
硬件插值功能实现代码:
核函数:
//定义纹理内存变量
texture<float, cudaTextureType2D, cudaReadModeElementType> tex_src;__global__ void resize_img_ker(int row, int col, float x_a, float y_a, uchar *out)
{int x = threadIdx.x + blockDim.x * blockIdx.x; //colint y = threadIdx.y + blockDim.y * blockIdx.y; //rowif (x < col && y < row){float xx = x*x_a;float yy = y*y_a;//这里的xx和yy都是浮点数,tex2D函数返回的数值已经过硬件插值了,所以不需要开发者再进行插值啦~out[y*col+x] = (uchar)tex2D(tex_src, xx, yy);}
}
主体函数:
void resize_img_cuda(Mat src, Mat &dst, float row_m, float col_m)
{const int row = (int)(src.rows*row_m);const int col = (int)(src.cols*col_m);const int srcimg_size = src.rows*src.cols*sizeof(float);const int dstimg_size = row*col;const float x_a = 1.0 / col_m;const float y_a = 1.0 / row_m;uchar *dst_cuda;cudaMalloc((void**)&dst_cuda, dstimg_size);Mat src_tmp;src.convertTo(src_tmp, CV_32F); //注意这里要把图像转换为float浮点型,否则线性插值模式无法使用cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<float>();//声明数据类型cudaArray *cuArray_src; //定义CUDA数组cudaMallocArray(&cuArray_src, &channelDesc, src_tmp.cols, src_tmp.rows); //分配大小为col*row的CUDA数组tex_src.addressMode[0] = cudaAddressModeWrap;//寻址方式tex_src.addressMode[1] = cudaAddressModeWrap;//寻址方式 如果是三维数组则设置texRef.addressMode[2]tex_src.normalized = false;//是否对纹理坐标归一化tex_src.filterMode = cudaFilterModeLinear;//硬件插值方式:最邻近插值--cudaFilterModePoint 双线性插值--cudaFilterModeLinearcudaBindTextureToArray(&tex_src, cuArray_src, &channelDesc); //把CUDA数组绑定到纹理内存cudaMemcpyToArray(cuArray_src, 0, 0, src_tmp.data, srcimg_size, cudaMemcpyHostToDevice); //把源图像数据拷贝到CUDA数组dim3 Block_resize(16, 16);dim3 Grid_resize((col + 15) / 16, (row + 15) / 16);//调用核函数resize_img_ker << <Grid_resize, Block_resize >> > (row, col, x_a, y_a, dst_cuda);dst = Mat::zeros(row, col, CV_8UC1);cudaMemcpy(dst.data, dst_cuda, dstimg_size, cudaMemcpyDeviceToHost);cudaFree(dst_cuda);cudaFreeArray(cuArray_src);cudaUnbindTexture(tex_src);
}
5. 本地内存(Local Memory)
- 特点:线程私有,速度慢,由编译器自动分配(如大数组或寄存器不足时)。
- 优化:减少使用,优先使用寄存器或共享内存。
__global__ void kernel() {float local_var; // 寄存器分配// float large_array[100]; // 可能溢出到本地内存 }
6. 寄存器(Registers)
- 特点:最快的内存,但数量有限。优化方法包括减少变量或循环展开。
__global__ void kernel() {int tid = threadIdx.x; // 使用寄存器// 循环展开减少寄存器压力float sum = data + data + data + data; }
7. 固定内存(Pinned Memory)
- 特点:主机内存,加速主机与设备间传输。
- 使用方法:
float *h_pinned; cudaHostAlloc(&h_pinned, size, cudaHostAllocDefault); // 分配固定内存 cudaMemcpy(d_data, h_pinned, size, cudaMemcpyHostToDevice); // 快速传输
八、总结
内存类型 | 作用域 | 生命周期 | 速度 | 使用场景 | 注意事项 |
---|---|---|---|---|---|
全局内存 | 所有线程 | 手动释放 | 最慢 | 大数据传输,跨线程块通信 | 需合并访问(连续地址访问) |
共享内存 | 线程块内 | 线程块执行期间 | 快 | 线程块内协作(如归约、矩阵分块) | 避免Bank Conflict(线程访问不同Bank) |
常量内存 | 所有线程 | 程序结束 | 较快 | 频繁读取的常量数据(如配置参数) | 只读,需提前用cudaMemcpyToSymbol 拷贝 |
纹理内存 | 所有线程 | 手动释放 | 较快 | 具有空间局部性的访问(如图像采样) | 需绑定纹理对象,支持插值和缓存 |
本地内存 | 单个线程 | 线程执行期间 | 慢 | 寄存器溢出时的临时变量(如大数组) | 尽量避免使用,优先用寄存器/共享内存 |
寄存器 | 单个线程 | 线程执行期间 | 最快 | 局部变量和临时计算 | 数量有限(每个线程约255个) |
固定内存(Pinned) | 主机内存 | 手动释放 | 高带宽 | 主机与设备间快速数据传输(如流处理) | 分配开销大,避免过量使用 |
相关文章:
CUDA编程之内存
CUDA的内存类型有全局内存、共享内存、常量内存、纹理内存、本地内存、寄存器等。我们需要分别了解它们的特点和使用场景。在CUDA编程中,合理利用各种内存类型对性能优化至关重要。 1. 全局内存(Global Memory) 特点:设…...
【Agent实战】货物上架位置推荐助手(RAG方式+结构化prompt(CoT)+API工具结合ChatGPT4o能力Agent项目实践)
本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 结论 效果图示 1.prompt 2. API工具封…...
ffmpeg面试题整理
1. 基础概念 问题:FFmpeg 是什么?它的核心功能有哪些? 编解码:支持几乎所有音视频格式(如 H.264, AAC, MP3)。转换:在不同容器格式之间转换(如 MP4 → MKV)。流处理&…...
Idea运行项目报错:java.lang.OutOfMemoryError: Java heap space 解决方法
问题描述 Maven构建的时候,一直报错java.lang.OutOfMemoryError: Java heap space 尝试解决 找了几个JAVA高级小伙伴,一起去百度了各种可能,设置内存大小,发现都不行,还不断的重装了IDEA,以为是这个版本…...
解决 Linux /dev/mapper/ubuntu--vg-ubuntu--lv 磁盘空间不足的问题
解决 Linux /dev/mapper/ubuntu–vg-ubuntu–lv 磁盘空间不足的问题 https://blog.csdn.net/weixin_47908992/article/details/139882219 查看LVM卷组的信息 vgdisplay rootubuntu:~# vgdisplay--- Volume group ---VG Name ubuntu-vgSystem ID Fo…...
前端UI编程基础知识:基础三要素(结构→表现→行为)
以下是重新梳理的前端UI编程基础知识体系,结合最新技术趋势与实战要点,以更适合快速掌握的逻辑结构呈现: 一、基础三要素(结构→表现→行为) 1. HTML5 核心能力 • 语义化标签:<header>, <nav&g…...
Trae:与AI结伴,开启编程新体验
Trae:与AI结伴,开启编程新体验 在数字化时代,编程已经成为推动技术发展的核心力量。然而,随着项目复杂度的增加,开发者面临着诸多挑战,例如代码编写效率低下、代码质量难以把控等。如今,Trae作…...
如何用正则表达式爬取古诗文网中的数据(python爬虫)
一、了解正则表达式的基本内容: 什么是正则表达式 正则表达式(Regular Expression,简称 regex)是一种用于匹配字符串的模式。它通过特定的语法规则,可以高效地搜索、替换和提取文本中的特定内容。正则表达式广泛应用于…...
深度学习 Deep Learning 第1章 深度学习简介
第1章 深度学习简介 概述 本章介绍人工智能(AI)和深度学习领域,讨论其历史发展、关键概念和应用。解释深度学习如何从早期的AI和机器学习方法演变而来,以及如何有效解决之前方法无法应对的挑战。 关键概念 1. 人工智能的演变 …...
ByteByteGo学习笔记:通知系统设计
引言 在当今这个信息爆炸的时代,通知系统已经成为了现代应用程序中不可或缺的重要组成部分。无论是突发新闻的即时推送、产品更新的及时告知、促销活动的精准触达,还是用户交互的实时反馈,通知都扮演着至关重要的角色。一个高效、可靠、可扩…...
[设计模式]1_设计模式概览
摘要:设计模式原则、设计模式的划分与简要概括,怎么使用重构获得设计模式并改善代码的坏味道。 本篇作概览与检索用,后续结合源码进行具体模式深入学习。 目录 1、设计模式原理 核心原则(语言无关) 本质原理图 原…...
Python + Qt Designer构建多界面GUI应用程序:Python如何调用多个界面文件
引言 Qt Designer是一个用户友好的图形用户界面设计工具,它可以帮助开发人员通过拖放的方式快速创建界面。在实际开发中,往往需要设计多个界面文件,并在Python代码中进行统一管理和使用。本文将介绍如何在Python中使用Qt Designer设计好的多…...
AGI大模型(7):提示词应用
1 生成数据 LLM具有⽣成连贯⽂本的强⼤能⼒。使⽤有效的提示策略可以引导模型产⽣更好、更⼀致和更真实的响应。LLMs还可以特别有⽤地⽣成数据,这对于运⾏各种实验和评估⾮常有⽤。例如,我们可以使⽤它来为情感分类器⽣成快速样本,如下所示: 提示: ⽣成10个情感分析的范…...
【倒霉bug2025】找不到vc_runtimeMinimum_x64.msi
今天是倒霉的一天,当喉咙痛到无法出门玩耍的我打开steam准备开始玩《冰封世界》时,游戏启动直接报错 在选择安装之后弹出一个经典窗口 然后在C:\ProgramData\PackageCache中找msi到位置点击确定继续报错说msi版本不对 上网一搜,找不到vc_ru…...
什么是强哈希算法pbkdf2(Password-Based Key Derivation Function)
文章目录 什么是pbkdf2使用场景 在线工具 什么是pbkdf2 维基百科:https://zh.wikipedia.org/zh-cn/PBKDF2 PBKDF2(Password-Based Key Derivation Function 2)是一种基于密码的密钥派生函数。它的主要作用是从密码和盐(salt&…...
Python 基础语法详解
一、变量和数据类型 变量 在 Python 中,变量无需声明类型,直接赋值即可。变量名区分大小写。 # 整数类型 age 25 print(age) # 输出:25# 浮点数类型 height 1.75 print(height) # 输出:1.75# 字符串类型 name "张三&…...
AI Agent 时代开幕-Manus AI与OpenAI Agent SDK掀起新风暴
【本周AI新闻: AI Agent 时代开幕-Manus AI与OpenAI Agent SDK掀起新风暴】 https://www.bilibili.com/video/BV1bkQyYCEvQ/?share_sourcecopy_web&vd_source32ed33e1165d68429b2e2eb4749f3f26 最近AI圈子里最火的话题非Manus莫属!这款由中国武汉创业公司“蝴…...
为什么会出现redis数据库?redis是什么?
什么是 Redis? 为什么要用 Redis? 下面我将从 Redis 出现的背景、Redis 的解决方案个来回答。 1、Redis 出现的背景 互联网的应用越来越多,例如社交网络、电商、实时服务发展的十分迅速,这就导致了传统技术栈(如关系型数据库)…...
每日一题---dd爱框框(Java中输入数据过多)
dd爱框框 实例: 输入: 10 20 1 1 6 10 9 3 3 5 3 7 输出: 3 5 这道题要解决Java中输入的数过多时,时间不足的的问题。 应用这个输入模板即可解决: Java中输入大量数据 import java.util.*; import java.io.*;pu…...
Flink-学习路线
最近想学习一下Flink,公司的实时需求还是不少的,因此结合ai整理了一份学习路线,记录一下。 当然,公司也有Scala版本Flink框架,也学习了一下。这里只说Java版本 1. Java基础 目标: 掌握Java编程语言的基础知识。 内容…...
一次Milvus迁移的记录
前言 希望把Linux上生产环境中使用docker compose运行的milvus迁移到本地(mac os)的docker compose中 操作过程 找到了官方有两个相关的项目: https://github.com/zilliztech/milvus-backup https://github.com/zilliztech/vts 但是…我都没用,因为使…...
矩阵的转置
对于的矩阵,使用两个指针变量,可以方便实现(i,j)处元素与(j,i)处元素交换位置。令指针Arow&A[i][0],则Arow[j]可实现对第i行j列元素的访问。令指针Bptr&A[0][i],则*Bptr就可以访问(0,i)处元素,然后,…...
使用 VLOOKUP 和条件格式在 Excel 中查找并标红匹配的串号
使用 VLOOKUP 和条件格式在 Excel 中查找并标红匹配的串号 你的步骤非常详细且清晰,能够帮助用户在 Excel 中通过 VLOOKUP 和条件格式来查找并标红匹配的串号。以下是对你提供的步骤的简要总结和补充说明: 1. 添加“是否匹配”列 在 a.xlsx 中新增一列…...
Python Matplotlib面试题精选及参考答案
目录 绘制函数 y=2x+5 在区间 [1,10] 的折线图,设置标题和坐标轴标签 在同一图中绘制 sin (x) 和 cos (x) 曲线,添加图例和网格线(x∈[0,2π]) 绘制分段函数:当 x<0 时 y=0,x≥0 时 y=x,设置不同线段颜色 绘制带数据点的折线图,使用红色虚线样式和圆形标记(数据…...
在线 SQL 转 SQLAlchemy:一键生成 Python 数据模型
一款高效的在线 SQL 转 SQLAlchemy 工具,支持自动解析 SQL 语句并生成 Python SQLAlchemy 模型代码,适用于数据库管理、后端开发和 ORM 结构映射。无需手写 SQLAlchemy 模型,一键转换 SQL 结构,提升开发效率,简化数据库…...
基于自定义线程池手写一个异步任务管理器
我们在后端执行某些耗时逻辑操作时往往会导致长时间的线程阻塞,在这种情况之下,我们往往会引一条异步线程去处理这些异步任务,如果每次都创建新的线程来处理这些任务,不仅会增加代码冗余,还可能造成线程管理混乱&#…...
基恩士PLC编程小技巧八:脚本过长如何实现换行及替换
基恩士PLC编程小技巧八:脚本过长如何实现换行? 一、问题点 我们在使用基恩士编程软件KV STUDIO 进行脚本编程时,经常遇到这样的问题:脚本的一行过长,程序不好阅读及维护。 IF MR1000 OR MR1001 OR MR1002 OR MR1003 OR…...
每日一题---数组中两个字符串的最小距离
数组中两个字符串的最小距离 给定一个字符串数组strs,再给定两个字符串str1和str2,返回在strs中str1和str2的最小距离,如果str1或str2为null,或不在strs中,返回-1。 链接:数组中两个字符串的最小距离__牛…...
【PTA题目解答】7-1利用STL比较数据大小并排序(15分)c++
1.题目: 2.算法原理 根据题目要求,模拟即可,set容器会帮我们把插入的数自动排序好 题目说输入非整型数据就停止,不用特意判断输入的数据是整型还是非整型,如果用户输入的是字符(例如 a)&#…...
如何用Deepseek制作流程图?
使用Deepseek制作流程图,本质上是让AI根据你的需求,生成相关流程图的代码,然后在流程图编辑器中渲染,类似于Python一样,ChatGPT可以生成代码,但仍需在IDE中执行。 你知道绘制流程图最高效的工具是什么吗&a…...
【09】单片机编程核心技巧:变量赋值,从定义到存储的底层逻辑
【09】单片机编程核心技巧:变量赋值,从定义到存储的底层逻辑 🌟 核心概念 单片机变量的定义与赋值是程序设计的基础,其本质是通过 RAM(随机存储器) 和 ROM(只读存储器) 的协作实现…...
vscode python相对路径的问题
vscode python相对路径的问题 最近使用使用vscode连接wsl2写python时,经常遇到找不到包中的方法的问题,最终发现vscode在执行python代码时目录不是从当前python文件开始算起,而是从当前工作区的目录开始算起,比如说我打开的是/ho…...
C语言中的指针与函数
引言 在C语言编程中,指针是一个非常重要且强大的概念。它不仅帮助我们高效地管理内存,还能提升程序的灵活性和性能。而指针与函数的结合使用,是C语言中非常常见且极具挑战性的一个话题。正确理解和使用指针与函数的关系,不仅能帮助程序员提高代码质量,还能优化程序的执行…...
深度学习-服务器训练SparseDrive过程记录
1、cuda安装 1.1 卸载安装失败的cuda 参考:https://blog.csdn.net/weixin_40826634/article/details/127493809 注意:因为/usr/local/cuda-xx.x/bin/下没有卸载脚本,很可能是apt安装的,所以通过执行下面的命令删除: a…...
理解langchain langgraph 官方文档示例代码中的MemorySaver
以下是langchain v0.3官方示例代码 from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import START, MessagesState, StateGraph# 可以理解为:定义一个流程,这个流程中用到的数据类型是Messages。 <---定义一个有向图&…...
JumpServer基础功能介绍演示
堡垒机可以让运维人员通过统一的平台对设备进行维护,集中的进行权限的管理,同时也会对每个操作进行记录,方便后期的溯源和审查,JumpServer是由飞致云推出的开源堡垒机,通过简单的安装配置即可投入使用,本文…...
Spring @Bean注解使用场景二
bean:最近在写一篇让Successfactors顾问都能搞明白的sso的逻辑的文章,所以一致在研究IAS的saml2.0的协议,希望用代码去解释SP、idp的一些概念,让顾问了解SSO与saml的关系,在github找代码的时候发现一些代码的调用关系很难理解&…...
创业者认知、思辨、成长指南
一、为什么要创业? 1、因为没有家产继承和家庭关系,不能躺平; 比如父母留下了大量的财富,靠钱生钱吃利息,收租,做做投资这些形式,就可以活得很好; 再比如父母或者血亲有资源&#…...
ECharts中Map(地图)样式配置、渐变色生成
前言 ECharts是我们常用的图表控件,功能特别强大,每次使用都要查API比较繁琐,这里就记录开发中常用的配置。 官网:https://echarts.apache.org/handbook/zh/get-started 配置项:https://echarts.apache.org/zh/opti…...
PostgreSQL存储管理体系结构学习笔记2
1.表和元组的组织方式 在PostgreSQL中,同一个表中的元组按照创建顺序依次插入到表文件中。元组之间不进行关联,这样的表文件称之为堆文件。PostgreSQL系统中包含了四种堆文件:普通堆,临时堆,序列,TOAST表。…...
【PTA题目解答】7-3 字符串的全排列(20分)next_permutation
1.题目 给定一个全由小写字母构成的字符串,求它的全排列,按照字典序从小到大输出。 输入格式: 一行,一个字符串,长度不大于8。 输出格式: 输出所有全排列,每行一种排列形式,字典序从小到大。 输入样例…...
SOME/IP:用Python实现协议订阅、Offer、订阅ACK与报文接收
文章目录 前言一、代码层次二、详细代码1. eth_scapy_sd.py2、eth_scapy_someip.py3、network_define.py4、packet_define.py5、unpack_define.py6、someip_controller.py 前言 1、需要pip安装scapy库 2、需要修改根据实际情况配置network_define.py 3、执行someip_controller…...
嵌入式八股ARM篇
前言 ARM篇主要介绍一下寄存器和中断机制,至于汇编这一块…还请大家感兴趣自行学习 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函数传参 R4 - R11用来保存程序运算的中间结果或函数的局部变量 在函数调用过程中 注意在发生异常的时候 cortex-M0架构会自动将R0-R3压入…...
剑指 Offer II 087. 复原 IP
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20087.%20%E5%A4%8D%E5%8E%9F%20IP/README.md 剑指 Offer II 087. 复原 IP 题目描述 给定一个只包含数字的字符串 s ,用以表示一个 IP 地址…...
RCE-Labs超详细WP-Level10(无字母命令执行_二进制整数替换)
温馨提示 这关涉及的知识点较多, 写的很长, 中间留了很多错误引导(本人在实验时遇到的问题, 或许你们也会遇到), 在后文才逐步解释源码分析 跟前几关一样, 更改了 WAF 的过滤字段这个关卡, 只有0, 1, (单引号), $, <, \ , ( , )可以用解题分析(实验这些命令, 可以先在自己本…...
数据结构(泛型)
1,装箱 int i 10;Integer j Integer.valueOf(i);2.拆箱 Integer i 10;int j i.intValue(); 3.自动装箱 int i 10;Integer j i;int i 10;Integer j (Integer) i; 4,自动拆箱 Integer i 10;int j i;Integer i 10;int j (int) i; 有一段代码需要解析一下: …...
Android Dagger2 框架辅助工具模块深度剖析(六)
一、引言 在 Android 开发领域,依赖注入(Dependency Injection,简称 DI)作为一种至关重要的设计模式,能显著降低代码间的耦合度,提升代码的可测试性与可维护性。Dagger2 作为一款强大的依赖注入框架&#…...
LVGL第三方库的使用(中文库)
一、第三方库文档 3rd party libraries(第三方库) — LVGL 文档 FreeType 中文字库 SDL 模拟器使用freetype中文字库 1.开启字库 2.安装freetype 字库 sudo apt-get update sudo apt-get install libfreetype6-dev 3.修改makefile 添加字库 4.显示中…...
【愚公系列】《高效使用DeepSeek》009-PPT大纲自动生成
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
使用easyexcel实现单元格样式设置和下拉框设置
1.单元格样式设置 1.1实体类 public class DemoData {ExcelProperty("PK")private String name;ExcelProperty("年龄")private int age;// 必须提供无参构造方法public DemoData() {}public DemoData(String name, int age) {this.name name;this.age …...