当前位置: 首页 > news >正文

C语言 ——— 函数栈帧的创建和销毁

目录

寄存器

mian 函数是被谁调用的 

通过汇编了解函数栈帧的创建和销毁 

转汇编后(Add函数之前的部分)

转汇编后(进入Add函数之前的部分) 

转汇编后(正式进入Add函数的部分)

​编辑

总结

局部变量是怎么创建的? 

函数是怎么传参的?

形参和实参是什么关系?

函数调用的结果是怎么返回的?


寄存器

在深入了解函数栈帧之前,需要先熟悉两个关键的寄存器。在常见的寄存器如 eax、ebx、ecx、edx、ebp、esp 中,ebp 和 esp 是理解函数栈帧的基础

寄存器本质上是 CPU 内部用于存储数据的高速存储单元,而 ebp 和 esp 这两个寄存器专门用于存放内存地址,其存储的地址在函数栈帧的维护中起着至关重要的作用

在程序运行时,每一次函数调用都会在栈区分配一块独立的内存空间,这个空间被称为函数栈帧,用于存放函数执行过程中的局部变量、参数、返回地址等信息。ebp 和 esp 就负责对这个函数栈帧的空间进行维护

以 main 函数为例,当程序开始执行 main 函数时,系统会在栈区为其开辟一块特定的内存空间。其中,ebp 是指向该栈帧底部的指针,它标记了 main 函数栈帧的起始位置,负责维护 main 函数栈帧的底部边界;而 esp 则是指向栈区为 main 函数开辟的栈帧顶部的指针,它会随着栈内数据的压入和弹出而动态变化,实时反映栈帧的当前顶部位置。通过 ebp 和 esp 这两个指针的协同工作,系统能够准确地管理函数栈帧的空间,确保函数的正常执行和数据的正确存储与访问

需要注意的是:

在不同编译器与架构中,管理函数栈帧的寄存器命名会随架构升级而变化:

  • VS2013(x86 32 位架构):使用 ebp(基指针,指向栈帧底部)和 esp(栈指针,指向栈帧顶部)。
  • VS2022(x86-64 64 位架构)ebp 对应重命名为 rbp(基指针),esp 对应重命名为 rsp(栈指针),功能与原寄存器一致,仅因架构升级调整命名,仍用于维护栈帧的底部与顶部边界

mian 函数是被谁调用的 

在 VS2013 编译器环境下,通过对调用堆栈的分析可知,main函数并非程序执行入口,而是由__tmainCRTStartup()函数触发调用

__tmainCRTStartup()函数作为 C 运行时库(CRT)的关键部分,承担着初始化运行环境、设置全局变量、处理命令行参数等前置工作,为main函数的执行提供必要条件。在此之前,__tmainCRTStartup()函数本身由mainCRTStartup()函数调用。mainCRTStartup()函数负责更底层的初始化任务,包括启动 C 运行时库、加载程序依赖项等,是程序从操作系统控制权转移到用户代码执行的关键桥梁

这种调用层级设计体现了 C 运行时库对程序执行流程的精细化管理,确保main函数在稳定、初始化完成的环境中运行,从而提升程序执行的可靠性与兼容性


通过汇编了解函数栈帧的创建和销毁 

代码演示:

int Add(int x, int y)
{int z = 0;z = x + y;return z;
}
int main()
{int a = 10;int b = 20;int sum = 0;sum = Add(a, b);printf("%d\n", sum);return 0;
}

接下来通过这段代码的汇编形式了解函数的栈帧

转汇编后(Add函数之前的部分)

int main()
{
00C21410  push        ebp
00C21411  mov         ebp,esp
00C21413  sub         esp,0E4h
00C21419  push        ebx
00C2141A  push        esi
00C2141B  push        edi
00C2141C  lea         edi,[ebp-0E4h]
00C21422  mov         ecx.39h
00C21427  mov         eax,0CCCCCCCCh
00C2142C  rep stos    dwrd ptr es:[edi]int a= 10;
00C2142E  mov         dword ptr [ebp-8],0Ahint b=20;
00C21435  mov         dword ptr [ebp-14h],14hint c=0;
00C2143C  mov         dword ptr [ebp-20h],0

第一条指令:【push   ebp】

在程序运行过程中,main 函数由 __tmainCRTStartup 函数调用。在调用 main 函数之前,rbp(基指针)和 rsp(栈指针)指向 __tmainCRTStartup 函数的栈帧,这表明当前程序执行环境处于 __tmainCRTStartup 函数的上下文

当开始调用 main 函数时,main 函数的第一条汇编指令通常是 push rbp。在汇编语言里,push 指令用于执行压栈操作。这里执行 push rbp 时,会将当前 rbp 的值压入栈区,具体位置是在 __tmainCRTStartup 函数栈帧的上方

这一操作具有重要意义,它是为 main 函数开辟独立栈空间的关键步骤。通过将当前 rbp 压栈,可以保存之前函数(即 __tmainCRTStartup 函数)的栈帧基地址,后续在 main 函数执行过程中,就可以基于这个保存的值恢复之前的栈帧状态。同时,后续还会有其他操作来进一步调整栈指针,从而完成 main 函数栈空间的完整开辟,以存放 main 函数执行过程中的局部变量、临时数据等

示意图:

第二条指令: 【mov   ebp,esp】

其中,mov 指令的作用是数据移动,它会把源操作数的值复制到目标操作数所在的位置

当执行 mov ebp, esp 这条指令时,esp 寄存器的值会被赋值给 ebp 寄存器。这就意味着,原本指向栈顶的 esp 所保存的地址值,现在被复制到了 ebp 寄存器中。其结果是,ebp 和 esp 这两个寄存器会同时指向 esp 原本所指向的位置。此时,ebp 和 esp 重合,这一操作往往是函数栈帧初始化过程中的重要步骤,它为后续在函数栈帧内进行数据的存储和访问奠定了基础

示意图:

第三条指令:【sub   esp,0E4h】

sub 指令用于执行减法运算,该指令的功能是将 esp 寄存器(栈顶指针)的值减去十六进制常数 0E4h(十进制为 228)

由于内存中的栈空间遵循 “向下增长” 的规则(即栈顶指针向低地址方向移动),当对 esp 执行减法操作时,栈顶指针会向低地址方向移动 0E4h 字节的距离。这一过程实际上是在为 main 函数在栈区开辟一段新的存储空间

通过 sub esp, 0E4h 指令,程序在栈顶指针原位置的基础上,向下扩展出 0E4h 字节的空间,用于存放当前函数的局部变量、临时数据或其他需要在栈帧中存储的信息。这是函数栈帧构建过程中的关键步骤,确保函数在执行时有独立的内存区域可供使用

示意图:

第四、五、六条指令:【push   ebx】 【push   esi】 【push   edi】

在 esp 指针为 main 函数成功开辟好栈空间之后,这里依次将 ebxesiedi 压入栈,会使得栈指针 esp 相应地向低地址方向移动,每个寄存器占用一定的栈空间。这样做的好处是,在 main 函数执行完毕后,可以通过出栈操作恢复这些寄存器的原始值,保证程序上下文的完整性,让程序能够正常地继续执行后续代码

示意图:

第七条指令:【lea   edi,[ebp-0E4h]】

lea 指令的作用是将ebp寄存器的值减去0E4h(十进制 228)后的地址加载到edi寄存器中

edi作为目标操作数指针,指向当前函数栈帧的起始位置(即esp开辟的空间底部)。此时ebp指向栈帧底部,ebp-0E4h正好是esp在执行sub esp, 0E4h后指向的位置

第八条指令:【mov   ecx.39h】

将十六进制数39h(十进制 57)赋值给ecx寄存器 

ecx作为计数器,用于控制后续重复操作的次数。由于每次stos指令处理 4 字节(DWORD),因此39h * 4 = 228字节,恰好等于之前开辟的栈空间大小0E4h 

第九条指令:【mov   eax,0CCCCCCCCh】 

0CCCCCCCCh赋值给eax寄存器,eax作为源操作数,存储要填充的值。在调试模式下,0xCCCCCCCC是微软编译器常用的未初始化内存标记值(对应 C++ 中的int 3断点指令),用于帮助检测未初始化变量的使用 

第十条指令:【rep stos     dwrd ptr es:[edi]】 

  • rep:重复执行后续指令,直到ecx为 0
  • stos:将eax的值存储到edi指向的内存位置,并根据方向标志(DF)调整edi
  • dwrd ptr es:[edi]:明确操作数为双字(4 字节),使用附加段寄存器es

eax中的0xCCCCCCCCh重复填充到edi开始的内存区域,共填充ecx次(即 228 字节)。每次填充后,edi自动增加 4 字节(因 DF 默认值为 0,即正向增长)

总结七、八、九、十条指令:

这四条指令的组合实现了对main函数栈空间的初始化,将其全部填充为0xCCCCCCCCh。这样做的目的是:

  1. 调试辅助:未初始化的变量会被自动填充为0xCC,当程序意外访问这些内存时会触发异常(INT 3断点),帮助开发者快速定位问题
  2. 内存清理:覆盖栈空间中的旧数据,确保函数执行环境的一致性

解析:

    int a= 10;
00C2142E  mov         dword ptr [ebp-8],0Ahint b=20;
00C21435  mov         dword ptr [ebp-14h],14hint c=0;
00C2143C  mov         dword ptr [ebp-20h],0
  1. int a = 10;
    该语句将整数 10 赋值给变量 a。对应的汇编指令将数值 0Ah(即十进制 10)写入到栈帧中相对于基址指针 ebp 偏移量为 8 字节的位置。这表明变量 a 在栈中的存储位置是 ebp-8,编译器为其分配了 4 字节空间(32 位整数),并初始化为 10

  2. int b = 20;
    该语句将整数 20 赋值给变量 b。对应的汇编指令将数值 14h(即十进制 20)写入到 ebp-14h(即偏移 20 字节)的位置。这说明变量 b 在栈中的位置是 ebp-20,同样被分配 4 字节空间,并初始化为 20

  3. int c = 0;
    该语句将整数 0 赋值给变量 c。对应的汇编指令将数值 0 写入到 ebp-20h(即偏移 32 字节)的位置。这表明变量 c 在栈中的位置是 ebp-32,分配 4 字节空间并初始化为 0

转汇编后(进入Add函数之前的部分) 

解析: 

  1. mov eax, dword ptr [ebp - 14h]:将栈帧中 ebp - 14h 地址处存储的双字数据(即变量 b 的值 20)读取到 eax 寄存器
  2. push eax:将 eax 中的值(b 的值)压入栈,作为 Add 函数的第二个参数
  3. mov ecx, dword ptr [ebp - 8]:将栈帧中 ebp - 8 地址处存储的双字数据(即变量 a 的值 10)读取到 ecx 寄存器
  4. push ecx:将 ecx 中的值(a 的值)压入栈,作为 Add 函数的第一个参数
  5. call 00C210E1:调用 Add 函数。该指令会先将返回地址压入栈,然后跳转到 00C210E1 处执行函数代码
  6. add esp, 8:调用函数后,栈中保留了两个参数(各占 4 字节,共 8 字节),通过 add esp, 8 调整栈指针,清理这两个参数占用的栈空间
  7. mov dword ptr [ebp - 20h], eax:将 Add 函数执行后的返回结果(存于 eax 寄存器)存储到栈帧中 ebp - 20h 地址处,即变量 c 的存储空间

 

解析:

在执行完上面的第五条 call 代码后,就会跳转到此条代码,执行时会直接跳转到 00C213C0 地址处。在函数调用流程中,它可能用于跳转到 Add 函数的实际代码位置,是编译器在生成代码时实现函数跳转的一种方式 

转汇编后(正式进入Add函数的部分)

解析: 

  1. push ebp

    将上一层函数的基址指针 ebp 压入栈中保存,用于后续恢复上一层栈帧
  2. mov ebp, esp

    将当前栈顶指针 esp 的值赋给 ebp,建立 Add 函数新的栈帧基址,为后续栈内变量访问提供基准
  3. sub esp, 0CCh

    通过减法操作,使栈顶指针 esp 向低地址方向移动 0CCh(十进制 204)字节,为 Add 函数在栈区开辟所需的局部变量存储空间
  4. push ebx / push esi / push edi

    依次将通用寄存器 ebxesiedi 的值压入栈中保存。这是为了在函数执行过程中保护这些寄存器的原始值,避免影响函数外的程序逻辑
  5. lea edi, [ebp+FFFFF34h]

    计算并加载目标内存地址到 edi 寄存器。ebp+FFFFF34h 等价于 ebp - 0CCh(十六进制补码运算),即指向刚开辟的栈空间起始位置,为后续内存初始化做准备
  6. mov ecx, 33h

    将循环次数 33h(十进制 51)赋值给计数器寄存器 ecx。由于每次操作处理 4 字节(双字),33h × 4 = 0CCh 字节,恰好匹配开辟的栈空间大小
  7. mov eax, 0CCCCCCCCh

    将特定值 0CCCCCCCCh 赋值给 eax 寄存器。在调试模式下,该值常用于标记未初始化的内存,便于检测程序错误(如访问未初始化变量)
  8. rep stos dword ptr es:[edi]

    重复执行 stos 操作,直到 ecx 为 0。每次操作将 eax 中的 0CCCCCCCCh 存储到 edi 指向的内存位置,并使 edi 自动递增 4 字节(正向增长)。最终效果是将 Add 函数的栈空间初始化为 0CCCCCCCCh
  9. mov dword ptr [ebp - 8], 0

    将数值 0 存储到 ebp - 8 地址处,即初始化局部变量 z 为 0ebp - 8 表示从栈帧基址 ebp 向低地址方向偏移 8 字节的位置,是为 z 分配的内存空间
  10. mov eax, dword ptr [ebp + 8]

    将 ebp + 8 地址处的双字数据(即函数参数 x 的值)读取到 eax 寄存器。在 x86 调用约定中,x 作为第一个参数,被压入栈后位于 ebp + 8 位置
  11. add eax, dword ptr [ebp + 0Ch]

    将 ebp + 0Ch 地址处的双字数据(即函数参数 y 的值)与 eax 中的值(x)相加,结果存回 eaxebp + 0Ch 是第二个参数 y 在栈中的位置
  12. mov dword ptr [ebp - 8], eax

    将 eax 中的值(x + y 的结果)存储到 ebp - 8 地址处,即把计算结果赋给局部变量 z

 

解析:

  1. mov eax, dword ptr [ebp - 8]

    将局部变量 z 的值(x + y 的结果)读取到 eax 寄存器。由于函数返回值通常通过 eax 传递,这一步为函数返回做准备
  2. pop edi / pop esi / pop ebx

    依次从栈中弹出数据,恢复寄存器 ediesiebx 的原始值,确保函数外的程序逻辑不受影响
  3. mov esp, ebp

    将栈顶指针 esp 恢复为栈帧基址 ebp 的值,释放 Add 函数开辟的栈空间,为栈帧销毁做准备
  4. pop ebp

    从栈中弹出数据,恢复上一层函数的基址指针 ebp,还原上一层栈帧结构
  5. ret

    从当前函数返回。该指令会从栈中弹出返回地址(即调用 Add 函数时压入的下一条指令地址),并跳转到该地址继续执行程序

总结

局部变量是怎么创建的? 

局部变量的创建,需在为函数分配栈帧空间并完成初始化之后,才会在栈帧内为其分配特定存储位置

函数是怎么传参的?

函数传参时,在调用函数前,参数会被存入存储器保存,同时相关寄存器压栈。传参遵循从右至左的顺序,这种方式便于函数通过指针偏移量定位参数,且在函数内部从左至右依次使用参数

形参和实参是什么关系?

形参在函数栈帧开辟前通过压栈分配空间,与实参值相同但存储空间独立。形参本质是实参的临时拷贝,其改变不会影响实参

函数调用的结果是怎么返回的?

函数调用结果的返回,依赖于调用 call 指令前对下一条指令地址的预先记录,以此确保能准确回到调用处。返回值通过寄存器传递,因函数执行完毕后,其栈帧及参数空间需释放归还操作系统,故提前将返回值存入寄存器,确保调用方获取结果

相关文章:

C语言 ——— 函数栈帧的创建和销毁

目录 寄存器 mian 函数是被谁调用的 通过汇编了解函数栈帧的创建和销毁 转汇编后(Add函数之前的部分) 转汇编后(进入Add函数之前的部分) 转汇编后(正式进入Add函数的部分) ​编辑 总结 局部变量…...

2025年真实面试问题汇总(二)

jdbc的事务是怎么开启的 在JDBC中,事务的管理是通过Connection对象控制的。以下是开启和管理事务的详细步骤: 1. 关闭自动提交模式 默认情况下,JDBC连接处于自动提交模式(auto-commit true),即每条SQL语…...

【用「概率思维」重新理解生活】

用「概率思维」重新理解生活:为什么你总想找的「确定答案」并不存在? 第1层:生活真相——所有结果都是「综合得分」 现象:我们总想找到“孩子生病是因为着凉”或“伴侣生气是因为那句话”的单一答案现实:每个结果背后…...

Redis——线程模型·

为什么Redis是单线程却仍能有10w/秒的吞吐量? 内存操作:Redis大部分操作都在内存中完成,并且采用了高效的数据结构,因此Redis的性能瓶颈可能是机器的内存或者带宽,而非CPU,既然CPU不是瓶颈,自然…...

APS排程系统(Advanced Planning and Scheduling,高级计划与排程系统)

APS排程系统(Advanced Planning and Scheduling,高级计划与排程系统)是一种基于供应链管理和约束理论的智能生产管理工具,旨在通过动态优化资源分配和生产流程,解决制造业中的复杂计划问题。以下是其核心要点解析&…...

首个窗口级无人机配送VLN系统!中科院LogisticsVLN:基于MLLM实现精准投递

导读 随着智能物流需求日益增长,特别是“最后一公里”配送场景的精细化,传统地面机器人逐渐暴露出适应性差、精度不足等瓶颈。为此,本文提出了LogisticsVLN系统——一个基于多模态大语言模型的无人机视觉语言导航框架,专为窗户级别…...

仓颉Magic亮相GOSIM AI Paris 2025:掀起开源AI框架新热潮

巴黎,2025年5月6日——由全球开源创新组织GOSIM联合CSDN、1ms.ai共同主办的 GOSIM AI Paris 2025 大会今日在法国巴黎盛大开幕。GOSIM 作为开源人工智能领域最具影响力的年度峰会之一,本届大会以“开放、协作、突破”为核心,汇聚了来自华为、…...

《Effective Python》第2章 字符串和切片操作——深入理解Python 中的字符数据类型(bytes 与 str)的差异

引言 本篇博客基于学习《Effective Python》第三版 Chapter 2: Strings and Slicing 中的 Item 10: Know the Differences Between bytes and str 的总结与延伸。在 Python 编程中,字符串处理是几乎每个开发者都会频繁接触的基础操作。然而,Python 中的…...

windows 强行终止进程,根据端口号

步骤1:以管理员身份启动终端‌ 右键点击开始菜单 → 选择 ‌终端(管理员)‌ 或 ‌Windows PowerShell(管理员)‌。 ‌步骤2:检测端口占用状态‌ # 查询指定端口(示例为1806) netst…...

PHP-FPM 调优配置建议

1、动态模式 pm dynamic; 最大子进程数(根据服务器内存调整) pm.max_children 100 //每个PHP-FPM进程大约占用30-50MB内存(ThinkPHP框架本身有一定内存开销)安全值:8GB内存 / 50MB ≈ 160,保守设置为100 ; 启动时创建的进程数&…...

我喜欢的vscode几个插件和主题

主题 Monokaione Monokai Python 语义高光支持 自定义颜色为 self 将 class , def 颜色更改为红色 为装饰器修复奇怪的颜色 适用于魔法功能的椂光 Python One Dark 这个主题只在python中效果最好。 我为我个人使用做了这个主题,但任何人都可以使用它。 插件 1.Pylance Pylanc…...

openharmony 地图开发(高德sdk调用)

1.显示地图 2.利用sdk完成搜索功能,以列表形式展示,并提供定位和寻路按钮 3.利用sdk完成寻路,并显示路线信息和画出路线,路线和信息各自点击后可联动到对方信息显示 4.调用sdk 开始导航 商务合作:...

Kotlin-类和对象

文章目录 类主构造函数次要构造函数总结 对象初始化 类的继承成员函数属性覆盖(重写)智能转换 类的扩展 类 class Student { }这是一个类,表示学生,怎么才能给这个类添加一些属性(姓名,年龄…)呢? 主构造函数 我们需要指定类的构造函数。构造函数也是函数的一种,但是它专门…...

LVS+keepalived实战案例

目录 部署LVS 安装软件 创建VIP 创建保存规则文件 给RS添加规则 验证规则 部署RS端 安装软件 页面内容 添加VIP 配置系统ARP 传输到rs-2 客户端测试 查看规则文件 实现keepalived 编辑配置文件 传输文件给backup 修改backup的配置文件 开启keepalived服务 …...

可视化+智能补全:用Database Tool重塑数据库工作流

一、插件概述 Database Tool是JetBrains系列IDE(IntelliJ IDEA、PyCharm等)内置的数据库管理插件。它提供了从数据库连接到查询优化的全流程支持,让开发者无需离开IDE即可完成数据库相关工作。 核心价值: 统一工作环境&#xf…...

【认知思维】沉没成本谬误:为何难以放弃已投入的资源

什么是沉没成本谬误 沉没成本谬误(Sunk Cost Fallacy)是指人们倾向于根据过去已经投入的资源(时间、金钱、精力等)而非未来收益来做决策的一种认知偏差。简单来说,它反映了"我已经投入这么多,不能就这…...

Linux 系统安全基线检查:入侵防范测试标准与漏洞修复方法

Linux 系统安全基线检查:入侵防范测试标准与漏洞修复方法 在 Linux 系统的安全管理中,入侵防范是至关重要的环节。通过对系统进行安全基线检查,可以有效识别潜在的安全漏洞,并采取相应的修复措施,从而降低被入侵的风险…...

【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)

题意 需要维护 n n n \times n nn 平面上的整点,每个点 ( x , y ) (x, y) (x,y) 有权值 V ( x , y ) V(x, y) V(x,y),初始都为 0 0 0。 同时给定 n n n 次修改操作,每次修改给出 x 1 , x 2 , y 1 , y 2 , v x_1, x_2, y_1, y_2, v x…...

目标检测任务常用脚本1——将YOLO格式的数据集转换成VOC格式的数据集

在目标检测任务中,不同框架使用的标注格式各不相同。常见的框架中,YOLO 使用 .txt 文件进行标注,而 PASCAL VOC 则使用 .xml 文件。如果你需要将一个 YOLO 格式的数据集转换为 VOC 格式以便适配其他模型,本文提供了一个结构清晰、…...

2025深圳杯D题法医物证多人身份鉴定问题四万字思路

Word版论文思路和千行Python代码下载:https://www.jdmm.cc/file/2712074/ 引言 法医遗传学中的混合生物样本分析,特别是短串联重复序列(Short Tandem Repeat, STR)分型结果的解读,是现代刑事侦查和身份鉴定领域的核心…...

利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析

利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析 漫谈图像去雾化的挑战 在计算机视觉领域,图像复原一直是研究热点。其中,图像去雾化技术尤其具有实际应用价值。然而,复杂的气象条件和多种因素干扰使得这…...

Focal Loss 原理详解及 PyTorch 代码实现

Focal Loss 原理详解及 PyTorch 代码实现 介绍一、Focal Loss 背景二、代码逐行解析1. 类定义与初始化 三、核心参数作用四、使用示例五、应用场景六、总结 介绍 一、Focal Loss 背景 Focal Loss 是为解决类别不平衡问题设计的损失函数,通过引入 gamma 参数降低易…...

VScode 的插件本地更改后怎么生效

首先 vscode 的插件安装地址为 C:\Users\%USERNAME%\.vscode\extensions 找到你的插件包进行更改 想要打印日志,用下面方法 vscode.window.showErrorMessage(console.log "${name}" exists.); 打印结果 找到插件,点击卸载 然后点击重新启动 …...

这类物种组织heatmap有点东西

如果想知道研究对象(人、小鼠、拟南芥、恒河猴等​​)某个时候各个器官的fMRI信号强度、炎症程度等指标的差异,gganatogram可以以热图的形式轻松满足你的需求。 数据准备 以男性为例,数据包含四列, 每列详细介绍 org…...

通讯录程序

假设通讯录可以存放100个人的信息(人的信息:姓名、年龄、性别、地址、电话) 功能:1>增加联系人 2>删除指定联系人 3>查找指定联系人信息 4>修改指定联系人信息 5>显示所有联系人信息 6>排序(…...

无需翻墙!3D 优质前端模板分享

开发网站时,无需撰写 HTML、CSS 和 JavaScript 代码,直接调用模板内现成的组件,通过拖拽组合、修改参数,几天内即可完成核心页面开发,开发速度提升高达 70% 以上。让开发者更专注于业务逻辑优化与功能创新,…...

Shinkai开源程序 是一个双击安装 AI 管理器(本地和远程),它允许您使用简单的 UI 在 5 分钟或更短的时间内创建 AI 代理

​一、软件介绍 文末提供程序和源码下载 Shinkai 开源应用程序在 Web 浏览器中解锁了一流 LLM (AI) 支持的全部功能/自动化。它允许创建多个代理,每个代理都连接到本地或第三方LLMs(例如 OpenAI GPT),这些…...

vscode不能跳转到同一个工作区的其他文件夹

明白了,你说的“第二种情况”是指: 你先打开的是项目文件夹(比如 MyProject),然后通过 VS Code 的“添加文件夹到工作区”功能,把 ThirdPartyLib 文件夹添加进来。 结果,项目代码里 #include “…...

containerd 之使用 ctr 和 runc 进行底层容器操作与管理

containerd 是目前业界标准的容器运行时,它负责容器生命周期的方方面面,如镜像管理、容器执行、存储和网络等。而 ctr 是 containerd 自带的命令行工具,虽然不如 Docker CLI 用户友好,但它提供了直接与 containerd API 交互的能力…...

IMU 技术概述

IMU(惯性测量单元,Inertial Measurement Unit)是一种通过传感器组合测量物体运动状态和姿态的核心设备,广泛应用于导航、控制、智能设备等领域。以下从原理、组成、应用和发展趋势展开说明: 一、核心定义与本质 IMU …...

talk-centos6之间实现

在 CentOS 6.4 上配置和使用 talk 工具,需要注意系统版本较老,很多配置可能不同于现代系统。我会提供 详细步骤 自动化脚本,帮你在两台 CentOS 6.4 机器上实现局域网聊天。 ⸻ 🧱 一、系统准备 假设你有两台主机: …...

hivesql是什么数据库?

HiveSQL并非指一种独立的数据库,而是指基于Apache Hive的SQL查询语言接口,Hive本身是一个构建在Hadoop生态系统之上的数据仓库基础设施。 以下是对HiveSQL及其相关概念的详细解释: 一、Hive概述 定义: Hive是由Facebook开发&…...

(1)python开发经验

文章目录 1 安装包格式说明2 PySide支持Windows7 更多精彩内容👉内容导航 👈👉Qt开发 👈👉python开发 👈 1 安装包格式说明 PySide下载地址 进入下载地址后有多种安装包,怎么选择: …...

[论文翻译]PPA: Preference Profiling Attack Against Federated Learning

文章目录 摘要一、介绍1、最先进的攻击方式2、PPA3、贡献 二、背景和相关工作1、联邦学习2、成员推理攻击3、属性推理攻击4、GAN攻击5、联邦学习中的隐私推理攻击 三、PPA1、威胁模型与攻击目标(1)威胁模型(2)攻击目标 2、PPA 概述…...

北三短报文数传终端:筑牢水利防汛“智慧防线”,守护江河安澜

3月15日我国正式入汛,较以往偏早17天。据水利部预警显示,今年我国极端暴雨洪涝事件趋多趋频趋强,叠加台风北上影响内陆的可能性,灾害风险偏高,防汛形势严峻复杂。面对加快推进“三道防线”建设,提升“四预”…...

函数加密(Functional Encryption)简介

1. 引言 函数加密(FE)可以被看作是公钥加密(PKE)的一种推广,它允许对第三方的解密能力进行更细粒度的控制。 在公钥加密中,公钥 p k \mathit{pk} pk 用于将某个值 x x x 加密为密文 c t \mathit{ct} c…...

思维链实现 方式解析

思维链的实现方式 思维链的实现方式除了提示词先后顺序外,还有以下几种: 增加详细的中间步骤提示:通过提供问题解决过程中的详细中间步骤提示,引导模型逐步推导和思考。例如,在解决数学证明题时,提示词可以具体到每一步需要运用的定理、公式以及推理的方向,帮助模型构建…...

深入学习Zookeeper的知识体系

目录 1、介绍 1.1、CAP 理论 1.2、BASE 理论 1.3、一致性协议ZAB 1、介绍 2、角色 3、ZXID和myid 4、 历史队列 5、协议模式 6、崩溃恢复模式 7、脑裂问题 2、zookeeper 2.1、开源项目 2.2、功能 2.3、选举机制 3、数据模型 3.1、介绍 3.2、znode分类 4、监听…...

电商平台一站式安全防护架构设计与落地实践

引言:安全即业务,防御即增长 国际权威机构 Forrester 最新报告指出,2024 年全球电商平台因安全防护不足导致的直接营收损失高达 $180 亿,而采用一体化防护方案的头部企业客户留存率提升 32%。本文基于 10 万 节点防护实战数据&a…...

【Pandas】pandas DataFrame cummin

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

奇妙小博客

import matplotlib.pyplot as plt# 定义顶点坐标 A [0, 0] B [6, 1] C [4, 6] P [4, 3]# 绘制三角形 ABC plt.plot([A[0], B[0], C[0], A[0]], [A[1], B[1], C[1], A[1]], b-, labelTriangle ABC) # 绘制点 P plt.scatter(P[0], P[1], colorr, labelPoint P(4,3))# 标注顶点…...

嵌入式学习笔记 - HAL_ADC_ConfigChannel函数解析

贴函数原型: 一 首先配置规则通道序列 其实所有的配置函数都是在对寄存器进行操作,要想看懂Hal库底层函数驱动就先把寄存器如何配置看懂,以下是配置规则通道寄存器的介绍,以ADC_SQR3为例,也就是通道序列1到序列6&…...

Java反射详细介绍

的反射(Reflection)是一种强大的机制,允许程序在运行时动态获取类的信息、操作类的成员(属性、方法、构造器),甚至修改类的行为。它是框架开发(如 Spring、MyBatis)、单元测试工具&a…...

2025年土木建筑与水利工程国际会议(ICCHE 2025)

2025 International Conference on Civil and Hydraulic Engineering (ICCHE 2025) (一)会议信息 会议简称:ICCHE 2025 大会地点:中国银川 投稿邮箱:icchesub-paper.com 收录检索:提交Ei Compendex,CPCI,C…...

适应性神经树:当深度学习遇上决策树的“生长法则”

1st author: Ryutaro Tanno video: Video from London ML meetup paper: Adaptive Neural Trees ICML 2019 code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees 背景 在机器学习领域,神经网络(NNs)凭借其强大的表示学习能力&…...

IBM BAW(原BPM升级版)使用教程第十四讲

续前篇! 一、流程设计中的编程 在 IBM Business Automation Workflow (BAW) 中,编程部分涵盖了多种技术、工具和策略,帮助用户定制和扩展流程。BAW 主要通过脚本、集成、服务和自定义代码来实现流程的灵活性和定制化。下面将详细讲解 BAW …...

【计算机网络 第8版】谢希仁编著 第四章网络层 题型总结3 SDN OpenFlow

SDN OpenFlow题型 这题其实,认真看书P196-197的例子也不难理解。我个人认为所谓防自学设计主要就是你没看懂这张图的时候就是天书,你知道怎么读这张图的时候就很简单。不过我相信这个用心一点应该也都是能懂的。 题目 4.66-4.69 4-66 我最大的一个问题…...

【React中函数组件和类组件区别】

在 React 中,函数组件和类组件是两种构建组件的方式,它们在多个方面存在区别,以下详细介绍: 1. 语法和定义 类组件:使用 ES6 的类(class)语法定义,继承自 React.Component。需要通过 this.props 来访问传递给组件的属性(props),并且通常要实现 render 方法返回 JSX…...

多线程代码案例-1 单例模式

单例模式 单例模式是开发中常见的设计模式。 设计模式,是我们在编写代码时候的一种软性的规定,也就是说,我们遵守了设计模式,代码的下限就有了一定的保证。设计模式有很多种,在不同的语言中,也有不同的设计…...

langChain存储文档片段,并进行相似性检索

https://python.langchain.ac.cn/docs/how_to/document_loader_pdf/#vector-search-over-pdfs 这段代码展示了如何使用LangChain框架中的InMemoryVectorStore和OpenAIEmbeddings来存储文档片段,并基于提供的查询进行相似性搜索。下面是对每一行代码的详细解释&…...