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

C语言进阶—函数(static,递归,回调,指针,内联,变参,结构体尺寸)

目录

一 static函数

1. static变量

1.静态局部变量

2.静态全局变量

2. static函数

二 递归函数

三 指针函数&函数指针

1. 指针函数

2. 函数指针

四 回调函数

五 内联函数

1. 核心特性表

2. 优缺点分析表

3. 用场景建议

3.1 推荐使用场景

3.2 应避免场景

六 变参函数

1. 核心特性表

2. 优缺点对比表

七 结构体尺寸

1. 内存对齐规则表

2. 结构体布局优化表


一 static函数

功能分析
类型特点使用场景优点缺点内存特点
局部变量生命周期延长至程序结束,作用域保持局部计数器、状态保持、缓存重用保持状态,避免全局污染线程不安全存储在静态存储区
全局变量限制作用域仅在当前文件文件内共享数据避免命名冲突增加内存占用存储在静态存储区
函数限制函数作用域仅在当前文件模块化开发、隐藏实现细节提高封装性无法跨文件调用代码段存储
底层内存分析
内存区域存储内容生命周期访问特点
自动变量函数执行期间自动分配/释放
动态分配内存直到free()手动管理
静态区static/全局变量程序整个生命周期编译时分配
代码段函数/static函数程序整个生命周期只读

1. static变量

1.静态局部变量

1. 初始化在程序启动时执行一次
2. 存储在静态存储区(.data段)
3. 作用域仍为函数内局部
4. 线程不安全(多线程需加锁)

void func() {static int count = 0; 
}

2.静态全局变量

其他文件无法通过extern访问

// file1.c
static int secret = 42; // 其他文件无法通过extern访问// file2.c
extern int secret; // 链接错误:undefined reference

2. static函数

关键字static

  1.修饰变量为静态变量,修饰函数为静态函数

    static 函数:只能本文件使用,其他文件不可访问,static要加在返回类型前

    普通函数:普通函数默认都是可以跨文件可见的,也就是比如A.c 中有一个swap()函数,那么在b.c也可以访问得到

  2.static可以限定变量或者函数为静态存储,static限定的变量或函数不会和同意程序中的其他文件名相冲突

    static 变量,一开始就会有内存,不会随函数的出入栈,分配空间

优点:

  1.静态函数会被自动分配在一个一直使用的存储区,知道程序结束内存消失,避免调用函数时压栈出栈  即全局

  2.其文件可以定义相同的函数,不会冲突

  3.静态函数不能被其他文件调用,对本代码可用

#include <stdio.h>static void function1()
{printf("niho");
}int main()
{function1();return 0;
}

二 递归函数

递归函数: 即函数调用自己

递归解决的问题:

  1.阶乘

     n!=(n-1)!*n=(n-2)!*(n-1)*n.......asm

     0 的阶乘就是0

  2.幂运算

     同底数的幂的乘法

  3.字符反转

     123-321

递归的使用:

  1.必须要有跳出条件,否则无限循环

#include <stdio.h>
#include <stdlib.h>int factorial(int n);
int main(int argc, char const *argv[])
{printf("输入一个不小于0的数值");int b = 0;scanf("%d", &b);int num = factorial(b);printf("%d的递归结构为:num=%d", b, num);return 0;
}
int factorial(int n)
{if (n < 0){printf("n不能小于0");exit(EXIT_FAILURE);}else if (n == 0){return 1;}else{return factorial(n - 1) * n;}
}

三 指针函数&函数指针

概念对比表

特性指针函数(返回指针的函数)函数指针(指向函数的指针)
定义方式int* func(int a)int (*func_ptr)(int)
本质函数的返回类型是指针变量类型为函数指针
内存存储函数代码存储在代码段指针变量存储在栈/静态区,指向代码段地址
主要用途返回动态内存、数组首地址、静态变量地址实现回调函数、策略模式、动态函数调用
优点1. 灵活返回数据结构
2. 支持动态内存管理
1. 提高代码灵活性
2. 实现多态行为
缺点1. 可能返回无效指针
2. 需手动管理内存
1. 语法复杂
2. 类型安全需自行保证
典型应用场景1. 工厂模式创建对象
2. 返回数组首地址
1. 事件处理器
2. 排序算法比较函数

内存结构分析

元素存储区域生命周期访问方式
指针函数代码段程序运行期间函数调用
函数指针变量栈/静态区取决于作用域指针解引用
动态分配内存直到free()通过指针访

使用建议

  1. 指针函数

    • 优先返回动态分配内存(需配套提供释放函数)

    • 避免返回局部变量地址

    • 可返回静态变量地址(但需注意线程安全)

  2. 函数指针

    • 使用typedef定义易读的类型别名

    • 始终检查指针是否为NULL后再调用

    • 适用于插件架构、策略模式等场景

1. 指针函数

指针函数 :一个返回指针的函数,就被称为指针函数

定义全局变量,多个函数需要用到某一个变量的指针,就不能返回局部变量的指针,栈空间用完是销毁的

#include <stdio.h>
int i=9527;//指针函数
int* get_point(int a); int main(int argc, char const *argv[])
{   printf("main  &i=%p\n",&i);//调用int *p=get_point(666);printf("  p=%p\n",p);return 0;
}//指针函数
int* get_point(int a){printf("get_point.....&a=%p,&i=%p\n",&a,&i);//全局变量的指针return &i;
}

2. 函数指针

函数指针:函数指针是一个变量,他存储了一个函数的地址(函数也是要放到内存内,也有地址)。

  指向一个函数的指针,称为函数指针

声明函数指针语言:

  int (*p)(int n);

  指向函数的返回值和参数列表必须一致

#include <stdio.h>int my_function(int, double);
int you_function(int, double);int my_function(int i, double n)
{printf("my_function:%d,and%lf\n", i, n);
}
int you_function(int i, double n)
{printf("you_function:%d,and%lf\n", i, n);
}
int main(int argc, char const *argv[])
{// 1.普通调用函数my_function(1, 1.1);// 2.调用指针函数调用you的值,与函数地址int (*you)(int, double);you = you_function;int you1 = you(2, 2.2);printf("指针调用的值为%d\n", you);printf("指针调用函数地址为%p\n", you);printf("指针调用函数地址为%p\n", you_function); // 此处的函数名和数组名一样,可以当作内存地址。// 3.指针函数的返回值类类型,必须与参数列表一致return 0;
}

四 回调函数

核心概念表

特性描述底层原理
定义方式通过函数指针传递函数作为参数函数指针存储代码段地址
内存存储函数代码存储在代码段,指针变量存储在栈/静态区通过指针间接寻址执行
调用时机由被调用函数在特定条件/事件触发时执行通过函数指针跳转执行
参数传递支持普通参数和函数指针参数遵循C函数调用约定(参数压栈)
生命周期回调函数需在调用时保持有效需避免使用已释放的栈内存指针

特性对比表

维度普通函数调用回调函数调用
调用控制权直接由调用者控制由被调用方在特定时机触发
耦合度高(直接依赖具体实现)低(仅依赖接口)
灵活性固定实现运行时动态绑定
典型应用顺序执行逻辑事件处理、算法策略、异步通知
内存开销无额外开销需存储函数指针(4/8字节)
调试难度简单(线性执行)复杂(执行路径不可见)
#include <stdio.h>
#include <string.h>
/*
回调函数:会点函数是一种特殊函数,他作为参数传递给另一个函数,并在被调用函数执行完毕后被调用回调:旨被传入到另一个函数异步编程:指代码执行时不会阻塞整个程序运行的方式;事件驱动:指程序的执行是由外部时间触发而不是顺序执行的方式;c语言实现回调函数的方法:回调函数可以通过指针来实现*/// 回调函数,接受数值,做出回应。
void callback_function(int num);// 发送数值,请求回应。
void weixin_function(char *str, void (*p)(int));// 回调函数,接受数值,做出回应
void callback_function(int num)
{if (num > 10){printf("回应收到,做的不错\n");}else{printf("回应收到,做的很坏了\n");}
}
// 发送数值,请求回应,然后被main执行。void (*p)(int)即为函数指针
void weixin_function(char *str, void (*p)(int))
{int length = strlen(str);printf("数值已经发送,请求回应中......\n");// 事件驱动:指程序的执行是由外部事件触发而不是顺序执行的方式;// 并在被调用函数执行完毕后被调用p(length);
}
int main(int argc, char const *argv[])
{weixin_function("aaaaaaaaaa", callback_function);return 0;
}

五 内联函数

1. 核心特性表

特性内联函数(inline)普通函数
定义方式inline 返回类型 函数名(参数)返回类型 函数名(参数)
编译行为代码直接嵌入调用处生成独立函数体
执行效率高(无调用开销)低(有调用/返回开销)
代码体积可能增大(多位置展开)较小(单一副本)
调试难度较难(无明确调用栈)容易(完整调用栈)
适用场景简单频繁调用的小函数复杂或递归函数
内存特点代码段多位置复制代码段单一存储
跨文件可见性需在头文件定义通过声明可见

2. 优缺点分析表

优点缺点
1. 消除函数调用开销1. 增加代码体积(代码膨胀)
2. 避免栈操作(push/pop)2. 调试困难(无调用信息)
3. 支持编译器优化3. 不适合复杂函数
4. 减少指令缓存未命中4. 可能被编译器忽略

3. 用场景建议

3.1 推荐使用场景
  1. 频繁调用的小函数(如数学运算)

  2. 硬件寄存器操作(如嵌入式开发)

  3. 关键性能路径代码(如游戏引擎)

  4. 替代宏函数(类型安全的宏)

3.2 应避免场景
  1. 递归函数

  2. 包含循环的大函数

  3. 虚函数/多态函数

  4. 导出库函数

#include <stdio.h>/*
内联函数函数频繁被调用,不断出入栈,会导致栈空间不断被消耗,慢语法:关键字inline必须和函数定义放在一起才能使用成为内联函数,仅将inline放在函数声名为何不所有的函数都使用内联?内联是以代码“膨胀”(赋值代码内容),仅仅省略了函数调用的开销从而提高代码执行效率如果执行函数体内代码的时间相比于函数调用的开下较大,那么效率收货会很少不适用于内联1.如果函数体内的代码较长,使用内联将导致内存消耗代价较高2.如果函数体内出现循环,那么执行函数体内的代码时间比函数调用的开销大
一个好的编译器会将根据函数的定义体,自动地取消不值得的内联(这进一步说了inline不应该出现在函数的声明中);*/// 内联函数在声名的时候,必须要加入static关键字
static inline void in_func();
static inline void in_func()
{printf("内联函数被调用,每一次调用,都要拷贝函数体的内容,消耗空间\n");
}int main(int argc, char const *argv[])
{in_func();// 内联函数调用,拷贝函数体,上面调用和下面的效果等同printf("内联函数被调用,每一次调用,都要拷贝函数体的内容,消耗空间\n");return 0;
}

六 变参函数

1. 核心特性表

特性变参函数(Variable Arguments)普通函数
定义方式使用省略号...声明参数列表固定参数列表
参数数量调用时参数数量可变参数数量固定
参数类型支持不同类型参数混合参数类型固定
内存访问通过指针遍历栈内存编译器自动处理参数访问
类型安全无(需手动校验类型)有(编译器检查)
适用场景格式化输出、日志系统、数学运算常规函数调用
内存特点参数连续存储在调用栈参数按调用约定存储
实现复杂度高(需手动处理参数)低(编译器自动处理)
地址高地址
+-----------------+
| 返回地址         |
| 参数n           | <-- va_arg(args, type)访问位置
| ...             |
| 参数2           |
| 参数1           |
| count参数       | <-- va_start后的args初始指向位置
+-----------------+
低地址

2. 优缺点对比表

优点缺点
1. 参数数量灵活1. 无类型安全检查
2. 支持混合类型参数2. 需要手动管理参数
3. 实现通用接口3. 调试困难(无参数信息)
4. 兼容C标准库函数4. 参数读取顺序敏感
#include <stdio.h>
#include <stdarg.h> //可变参数/*
可变参数:指的是参数的个数以及类型可以根据实际应用有所变化的c语言参数的入栈的顺序是从右往左进行的。
*/// 求传入的参数之和
double sum(int a, ...);
double sum(int a, ...)
{// 声名一个va_list list;// 2.读取参数列表,并给参数列表赋值a是 last最后一个读取到的va_start(list, a);// 3.取出参数double sum = 0;sum = sum + va_arg(list, int);sum = sum + va_arg(list, int);for (int i = 0; i < a - 2; i++){sum = sum + va_arg(list, double);}// 销毁释放listva_end(list);return sum;
}
int main(int argc, char const *argv[])
{printf("ddd\n");printf("%d\n", 4444);printf("%d,%lf\n", 4444, 2.22);/*参数列表的进入顺序是从右往左void fun(int a,)*/// 传入两个参数printf("%lf\n", sum(3, 2, 2, 2.2, 2.2, 2.2));return 0;
}

七 结构体尺寸

1. 内存对齐规则表

数据类型典型尺寸(字节)对齐要求(字节)常见平台
char11所有
short22x86, ARM
int4432/64位系统
float44多数平台
double88x86-64, ARM64
指针4/84/832位/64位系统
结构体不定最大成员对齐值依赖成员类型

2. 结构体布局优化表

策略优点缺点
降序排列成员(大→小)最小化填充空间可能影响代码可读性
使用位域精确控制位级存储增加访问复杂度
#pragma pack(1)完全紧凑布局降低访问性能
人工填充明确控制内存布局需要手动计算
联合体嵌套共享内存空间节省尺寸需要严格管理使用状态
结构体的大小收到存储变量地址对齐规则和编译器优化策略影响:
 1.偏移量从0开始
 2.整体结构体按照最大成员的对齐要求来对齐(通常是基本类型成员)
 3.每个成员按照其自身类型的对齐规则对齐(通常是其类型大小)
 4.结构体的整体大小必须是最大对齐数的整数倍(对齐规则)
 5.编译器为了对齐,可能在成员之间插入填充字节(padiing偏移、补齐)
 6.结构体末尾可能也会补(padiing偏移、补齐)
#include <stdio.h>
#include <stddef.h> //查看偏移量/*
结构体的大小收到存储变量地址对齐规则和编译器优化策略影响:1.偏移量从0开始2.整体结构体按照最大成员的对齐要求来对齐(通常是基本类型成员)3.每个成员按照其自身类型的对齐规则对齐(通常是其类型大小)4.结构体的整体大小必须是最大对齐数的整数倍(对齐规则)5.编译器为了对齐,可能在成员之间插入填充字节(padiing偏移、补齐)6.结构体末尾可能也会补(padiing偏移、补齐)*/
// 1.无嵌套的结构体
struct student
{int id;      // 4字节long age;    // 8字节int ranking; // 4字节char gender; // 1字节
};// 2.含有数组的结构体大小
struct student2
{// 如果下一个成员是数组,则不填充额外的字节int id;          // 4字节char name[5];    // 5字节char address[5]; // 5字节long age;        // 8字节int ranking;     // 4字节char gender;     // 1字节
};// 3.嵌套结构体的大小
struct student3
{int id; // 4字节struct{long a; // 8字节char c; // 1字节} my;int age;     // 4字节int ranking; // 4字节char gender; // 1字节
};int main(int argc, char const *argv[])
{printf("struct student 结构体大小:%lu 字节\n", sizeof(struct student));            // 24printf("struct student  id的偏移量=%lu\n", offsetof(struct student, id));           // 0printf("struct student  age的偏移量=%lu\n", offsetof(struct student, age));         // 8printf("struct student  ranking的偏移量=%lu\n", offsetof(struct student, ranking)); // 16printf("struct student  gender的偏移量=%lu\n", offsetof(struct student, gender));   // 20printf("struct student2 结构体大小:%lu 字节\n", sizeof(struct student2));            // 32printf("struct student2 id的偏移量=%lu\n", offsetof(struct student2, id));            // 0printf("struct student2 name的偏移量=%lu\n", offsetof(struct student2, name));        // 4printf("struct student2  address的偏移量=%lu\n", offsetof(struct student2, address)); // 9printf("struct student2  age的偏移量=%lu\n", offsetof(struct student2, age));         // 16printf("struct student2  ranking的偏移量=%lu\n", offsetof(struct student2, ranking)); // 24printf("struct student2  gender的偏移量=%lu\n", offsetof(struct student2, gender));   // 28printf("struct student3 结构体大小:%lu 字节\n", sizeof(struct student3));            // 40printf("struct student3 id的偏移量=%lu\n", offsetof(struct student3, id));            // 0printf("struct student3  my的偏移量=%lu\n", offsetof(struct student3, my));           // 8printf("struct student3  age的偏移量=%lu\n", offsetof(struct student3, age));         // 24printf("struct student3  ranking的偏移量=%lu\n", offsetof(struct student3, ranking)); // 28printf("struct student3  gender的偏移量=%lu\n", offsetof(struct student3, gender));   // 32return 0;
}

 2. 总结

即,想要求结构体的尺寸,首先要知道其最大字节的type,依据这个,来算出整个结构体的字节大小,以64位处理器来算,不满8的字节,系统自己填充为8,然后继续下个类型,数组除外,数组按照顺序进行排列。

相关文章:

C语言进阶—函数(static,递归,回调,指针,内联,变参,结构体尺寸)

目录 一 static函数 1. static变量 1.静态局部变量 2.静态全局变量 2. static函数 二 递归函数 三 指针函数&函数指针 1. 指针函数 2. 函数指针 四 回调函数 五 内联函数 1. 核心特性表 2. 优缺点分析表 3. 用场景建议 3.1 推荐使用场景 3.2 应避免场景 六…...

碰一碰发视频源码搭建的定制化开发实践

在数字化营销与信息交互的浪潮中&#xff0c;碰一碰发视频技术以其便捷性和高效性&#xff0c;成为吸引用户的重要手段。然而&#xff0c;通用的碰一碰发视频系统往往难以满足企业多样化的业务需求。通过对源码进行定制化开发&#xff0c;可以打造出契合特定场景的专属系统。本…...

代码mark:脚本获取包含全角字符的字符串的长度

脚本获取包含全角字符的字符串的长度 function myLen(s) { var r 0; for (var i 0; i < s.length; i) { var c s.charCodeAt(i); // Shift_JIS: 0x0 &#xff5e; 0x80, 0xa0 , 0xa1 &#xff5e; 0xdf , 0xfd &#xff5e; 0xff // Unicode : 0x0 &…...

FPGA----基于ZYNQ 7020实现petalinux并运行一个程序

引言&#xff1a;上一节我们讲到了使用Alinx 7020b自带的sd卡中的petalinux进行epics的编译&#xff0c;但此种方案个性化程度不足。如&#xff1a;我们项目需要FPGA侧的配合&#xff0c;那么我们需要重新编译petalinx。 注意&#xff1a;本文的知识点来自下面两篇文章&#x…...

微服务架构详解

微服务架构的思想本质 我们为什么需要微服务架构&#xff0c;它一定是为了解决我们某些问题才出现了。这篇文章我们讨论下微服务架构模式所解决的问题&#xff0c;带来的挑战&#xff0c;以及他的核心思想本质。 1 早期的服务架构 ​ 上图是一个典型的服务分层架构&#xff1a;…...

error:0308010C:digital envelope routines::unsupported

npm run dev 报错&#xff1a; \node_modules\webpack\hot\dev-server.jsnode:internal/crypto/hash:71 this[kHandle] new _Hash(algorithm, xofLen); Error: error:0308010C:digital envelope routines::unsupported opensslErrorStack: [ error:03000086:digital env…...

Blender 初学者指南 以及模型格式怎么下载

glbxz.com glbxz.com 可以直接下载Blender格式模型 第 1 步&#xff1a;打开 这就是 blender 打开时的样子。 您面对的是左侧和右侧的工具栏&#xff0c;顶部是文件作&#xff0c;底部是时间轴&#xff0c;中间是 3D 视图。 Blender 的默认起始网格是一个立方体&#xff0c…...

开个帖子记录一下自己学spring源码的过程

一、写在开头 简单记录下来时路&#xff0c;以后也能回头看看鼓励下自己。我以前不喜欢拍照&#xff0c;觉得没什么意思&#xff0c;有一天百度云盘给我推不知道什么时候从相册推到百度云相册的照片&#xff0c;那是我口罩时期在家上体育课的照片&#xff0c;我现在回头望过去…...

【coze】工作流(B站视频总结改写)

【coze】工作流&#xff08;B站视频总结改写&#xff09; 1.创建智能体2.工作流2.1 获取视频文案2.2 串联试运行2.3 二次创作&#xff08;大模型&#xff09;2.4 MD格式2.5 输出2.6 发布并调用 关于工作流&#xff1a; 简单业务&#xff0c; 如果智能体的逻辑比较简单&#xf…...

文化符号与隐形的社会话语权力:解码布尔迪厄理论下的意识形态操控机制

文化符号与隐形的社会话语权力&#xff1a;解码布尔迪厄理论下的意识形态操控机制 引言&#xff1a;符号背后的权力博弈 在当代社会&#xff0c;文化符号早已超越其表层的审美或实用功能&#xff0c;成为维系社会等级、塑造意识形态的隐形权力工具。从故宫博物院的金色琉璃瓦…...

一个关于fsaverage bem文件的说明

MNE文档&#xff1a;基于模板 MRI 的 EEG 前向算子 Head model and forward computation 在了解了脑图谱发展的过程之后&#xff0c;对脑的模版有了更深的认识&#xff0c;所以&#xff0c;对于之前使用的正向的溯源文件&#xff0c;进行一下解析&#xff0c;查看包含的信息&a…...

如何解决Kafka集群中Broker磁盘IO瓶颈?

针对Kafka集群Broker磁盘IO瓶颈问题&#xff0c;这里从实际运维场景出发给出解决方案&#xff1a; 1. 分区负载均衡优化 分区迁移策略 # 查看Topic分区分布&#xff08;识别热点Broker&#xff09; kafka-topics --bootstrap-server broker1:9092 --describe --topic high_t…...

42 python http之urllib库

作为办公室牛马,日常工作中总少不了和网络数据打交道。比如从公司内部系统抓取数据做报表。Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理 一、Urllib 基础入门 urllib 是 Python 内置的一个强大的处理 URL 和网络请求的库,它包含了多个模块,每个模块都有…...

如何把阿里云a账号下面的oss迁移到阿里云b账号下面(同区域)

1.登录a账号进入bucket选择同区域复制 2.登录b账号进入bucket选择bucket授权策略&#xff0c;选择接受复制对象&#xff0c;手动输入&#xff0c;然后是a账号的id和角色名字即可。 3.然后在去a账号保存下同步任务&#xff0c;开始同步了就。...

cuda多维线程的实例

1、注意&#xff1a;在多维中的变化时与平常的不一样&#xff0c;如下图所示&#xff0c;横向变换x&#xff0c;纵向变换y 2、cuda内置变量&#xff1a; 1、thread&#xff08;线程&#xff09;&#xff1a; 一个线程可作为一个运算单元&#xff0c;多个thread可组成一个block(…...

哈希表的设计

1. 哈希表的基本原理 哈希表是一种通过 哈希函数 将元素的键&#xff08;Key&#xff09;映射到存储位置的数据结构。 哈希函数 的作用&#xff1a;通过键值计算存储位置&#xff0c;公式一般为 index hash(key) % capacity。 哈希冲突&#xff1a;不同的键可能被映射到同一…...

前端取经路——入门取经:初出师门的九个CSS修行

大家好&#xff0c;我是老十三&#xff0c;一名前端开发工程师。CSS就像前端修行路上的第一道关卡&#xff0c;看似简单&#xff0c;实则暗藏玄机。在今天的文章中&#xff0c;我将带你一起应对九大CSS难题&#xff0c;从Flexbox布局到响应式设计&#xff0c;从选择器优先级到B…...

网络安全等级保护有关工作事项[2025]

公安部发布公网安〔2025〕1846号文件&#xff0c;关于对网络安全等级保护有关共工作事项的进一步说明 一、备案相关问题 1、如何执行系统备案动态更新工作? 全面梳理与重新填报&#xff1a; 答复&#xff1a;运营者需**全面梳理已备案系统**的情况&#xff0c;对于已完成定…...

柯西不等式应用题

第一种方法是作两个相似三角形ABC和CDE,求出AE长度为3。那么BD最大长度为3。 方法二&#xff1a;柯西不等式&#xff08;a&#xff0b;b&#xff09;&#xff08;c&#xff0b;d&#xff09;≥&#xff08;ac&#xff0b;bd&#xff09; &#xff08;1√&#xff08;5-2x&…...

聚焦多种检测场景,华大基因推出全流程本地化检测综合解决方案

“从毫米到微米&#xff0c;神秘的微观世界被发现&#xff1b;从微米到纳米&#xff0c;生命的本源被不断认知。”在时代背景及战略机遇的多重影响下&#xff0c;精准医学已成为新兴的发展趋势&#xff0c;对医学模式的发展具有重要的意义。一直以来&#xff0c;华大基因都致力…...

职场口语之名词从句

目录 一、主语从句 二、宾语从句 三、表语从句 四、同位语从句 一、主语从句 1. Who will win the game is uncertain. 谁将赢得这场比赛还不确定。 2. Why he was late isnt clear. 他为什么迟到还不清楚。 3. What we should do next is important. 我们接下来应该做什么…...

DVWA靶场保姆级通关教程--03CSRF跨站请求伪造

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一、low级别的源码分析 二、medium级别源码分析 安全性分析 增加了一层 Referer 验证&#xff1a; 关键点是&#xff1a;在真实的网络环境中&a…...

LangChain:大语言模型应用的“瑞士军刀”入门指南

LanChain入门指南 什么是LangChain&#xff1f;LangChain的核心价值1. 模块化设计 - AI界的"乐高积木"2. 典型应用场景 快速入门实战环境准备&#xff08;5分钟&#xff09;第一个示例&#xff1a;公司命名生成器&#xff08;10分钟&#xff09;进阶功能&#xff1a;…...

Mac电脑,idea突然文件都展示成了文本格式,导致ts,tsx文件都不能正常加载或提示异常,解决方案详细说明如下

有一天使用clean my mac软件清理电脑 突然发现idea出现了文件都以文本格式展示&#xff0c;如图所示 然后就卸载&#xff0c;计划重新安装&#xff0c;安装了好几个版本&#xff0c;并且setting->file types怎么设置都展示不对&#xff0c;考虑是否idea没卸载干净&#xff…...

如何将本地 Jar 包安装到 Maven 仓库(以 Aspose 为例)

在实际开发中&#xff0c;我们经常会遇到一些第三方库&#xff08;如商业库 Aspose&#xff09;无法通过 Maven 仓库直接引入的情况。这时&#xff0c;我们可以手动将 jar 包安装到本地 Maven 仓库&#xff0c;然后像普通依赖一样使用它。 本文以 Aspose.Slides 和 Aspose.Wor…...

[Linux]多线程(一)充分理解线程库

标题&#xff1a;[Linux]多线程 水墨不写bug 文章目录 一、线程的概念1、一句话总结区分进程和线程2、如何理解&#xff1f;3、那么进程和线程的对比&#xff1f;4、Linux为什么要这样设计进程和线程&#xff0c;难道不乱吗&#xff1f;5、从CPU的角度看待执行流&#xff1f;-…...

Mysql order by 用法

ORDER BY 是 SQL 里用于对查询结果进行排序的子句&#xff0c;它能够让查询结果按照指定的列或表达式进行升序或者降序排列&#xff0c;使数据呈现出更有规律的顺序&#xff0c;方便用户查看和分析。下面详细阐述其作用和用法 作用 ORDER BY 的主要作用是对查询结果集进行排序…...

嵌入式学习--江协51单片机day1

今天学习了led灯的相关操作以及独立按键对于led灯的控制。 led灯的相关操作 led灯的相关操作包括点亮&#xff0c;闪烁&#xff0c;流水灯以及流水灯plus 点亮 开发板的led灯是低电平有效&#xff0c;也就是当我们设置0时亮&#xff0c;1时灭。 P2是开发板的led灯模块的8位…...

uniapp开发11-v-for动态渲染list列表数据

uniapp开发11-v-for动态渲染list列表数据&#xff01;下面是一个简单的动态渲染list列表数据的案例。我们现在还未对接真正的后台接口&#xff0c;所以我们直接在页面组件内部&#xff0c;返回一个json数组&#xff0c;模拟从服务器远程获取到的新闻列表信息。来达到渲染输出的…...

qt国际化翻译功能用法

文章目录 [toc]1 概述2 设置待翻译文本3 生成ts翻译源文件4 编辑ts翻译源文件5 生成qm翻译二进制文件6 加载qm翻译文件进行翻译 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发经验 &#x1f448; 1 概述 在 Qt 中&#xff0c;ts 文件和 qm 文件是用于国…...

nut-list和nut-swipe搭配:nut-cell侧滑定义无法冒泡打开及bug(含代码、案例、截图)

nut-list和nut-swipe搭配:nut-cell侧滑定义无法冒泡打开及bug(含代码、案例、截图) Nut-UI 官方文档: swipe侧滑手势: https://nutui.jd.com/h5/vue/4x/#/zh-CN/component/swipelist 虚拟列表: https://nutui.jd.com/h5/vue/4x/#/zh-CN/component/list疑问+bug+解决方式:…...

WebRTC并非万能:RTMP与RTSP的工程级价值再认识

不是所有低延迟场景都需要WebRTC&#xff1a;RTMP/RTSP的技术硬实力解析 ——来自大牛直播SDK的实战分析与底层技术对比 一、WebRTC是热潮&#xff0c;但不是银弹 近年来&#xff0c;WebRTC频频出现在技术选型会议上&#xff1a; “浏览器直连&#xff0c;免插件”&#xff1b…...

Factorio 异星工厂 [DLC 解锁] [Steam] [Windows SteamOS]

Factorio 异星工厂 [DLC 解锁] [Steam] [Windows & SteamOS] 注意 这个符号表示 可打开折叠内容 需要有游戏正版基础本体&#xff0c;安装路径不能带有中文&#xff0c;或其它非常规拉丁字符&#xff1b;请务必阅读 使用说明 &#xff08;最新以网站说明为准&#xff09…...

LLM的min_p 参数详

min_p 参数详解 min-p采样,源自论文"Min P Sampling: Balancing Creativity and Coherence at High Temperature"。在大语言模型(LLM)中,min_p 通常是指在生成文本时的最小概率阈值(Minimum Probability),用于控制输出 token 的选择,特别是在核采样(Nucleus…...

C语言_可变参数_LOG宏

LOG宏一般处理&#xff0c;没有参数&#xff0c;只有字符串参数&#xff0c;字符串格式和一个参数&#xff0c;多个参数的场合。以下是针对常见的应用场合举例说明&#xff0c;可便参数的使用。 代码 #include <stdio.h>#define LOG(format, ...) printf("[%s][%…...

19.第二阶段x64游戏实战-vector容器

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;18.第二阶段x64游戏实战-MFC列表框 vector是一个封装了动态大小数组的顺序容器…...

第九节:图像处理基础-图像几何变换 (缩放、旋转、平移、翻转)

引言 在计算机视觉和图像处理领域&#xff0c;几何变换是最基础且应用最广泛的技术之一。通过改变图像的几何结构&#xff0c;我们可以实现图像缩放以适应不同分辨率设备&#xff0c;旋转图像以校正方向偏差&#xff0c;平移目标物体进行位置对齐&#xff0c;或通过翻转操作增…...

jmeter 执行顺序和组件作用域

本章节主要讲解“JMeter执行顺序与作用域”的内容&#xff0c;类似于运算符或操作符的优先级&#xff0c;当JMeter测试中包含多个不同的元素时&#xff0c;哪些元素先执行&#xff0c;哪些元素后执行&#xff0c;并不是严格按照它们出现的先后顺序依次有序执行的&#xff0c;而…...

mvc-review

review: 1.最初的做法&#xff1a;一个请求对应一个servlet&#xff0c;这样存在的问题是servlet太多了 2.改动&#xff1a;把一系列请求都对应一个servlet&#xff0c; IndexServlet / AddServlet / DelServlet / UpdateServlet ...-> 合并成FruitServlet 通过一个oper…...

基于ResNet50的手写符号识别系统

基于ResNet50的手写符号识别系统 项目概述 本项目实现了两个手写符号识别模型&#xff1a; ABCD字母识别模型&#xff1a;用于识别手写的A、B、C、D四个字母✓符号识别模型&#xff1a;用于识别手写的对勾(✓)和叉号() 两个模型均基于ResNet50预训练模型&#xff0c;采用迁…...

SpringBoot教学管理平台源码设计开发

概述 基于SpringBoot框架开发的​​教学管理平台​​完整项目&#xff0c;帮助开发者快速搭建在线教育平台。该系统包含学生端、教师端和管理后台&#xff0c;实现了课程管理、随堂测试、作业提交等核心功能&#xff0c;是学习SpringBoot开发的优质案例。 主要内容 1. 系统架…...

C++负载均衡远程调用学习之集成测试与自动启动脚本

目录 01 Lars-LbAgentV0.7-route_lb获取路由全部主机信息 02 Lars-LbAgentV0.7-API模块注册功能实现和测试工 03 Lars-LbAgentV0.7-项目构建工具 04 Lars-LbAgentV0.7-启动工具脚本实现 05 Lars-有关fd泄露的调试办法 06 Lars-qps性能测试 07 git企业开发基本流程 01 Lar…...

双ISP(双互联网服务提供商)

目录 核心作用 适用场景 实现方式 优缺点 假设一家外贸公司 双ISP&#xff08;双互联网服务提供商&#xff09; 是指用户同时接入两个不同的网络服务提供商&#xff08;Internet Service Provider&#xff09;&#xff0c;通过冗余设计或负载均衡技术&#xff0c;提升网络…...

网工实验——静态路由与BFD联动

网络拓扑图 实验目的&#xff1a; PC与Server通信的时候主要走上面&#xff0c;当主用电路失效的时候走下面 设备&#xff1a; 一台PC主机 一台Server服务器 两台Router路由器 一台S3700交换机 配置 1.配置PC和Server的IP地址 PC Server 2.配置路由器 R3配置对应接口…...

谷歌在即将举行的I/O大会之前,意外泄露了其全新设计语言“Material 3 Expressive”的细节

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

【网络原理】IP协议

目录 ​编辑 一. IP协议的作用 二. IP协议报头 三. 拆包和组包 四. 地址管理 1&#xff09;动态分配IP地址 2&#xff09;NAT机制&#xff08;网络地址映射&#xff09; 3&#xff09; IPV6 五. IP转换 1&#xff09;客户端到服务器 2&#xff09;服务器到客户端 六…...

【Python 文件I/O】

Python 的文件 I/O 操作是数据处理的基础技能&#xff0c;涉及文件的读写、路径管理、异常处理等核心功能。以下是文件 I/O 的核心知识点&#xff1a; 一、基础文件操作 1. 打开文件 # 通用模式&#xff1a;r(读)/w(写)/a(追加) b(二进制)/t(文本&#xff0c;默认) f open(…...

torchrun单机多卡运行

torchrun命令使用 torchrun示例 export CUDA_VISIBLE_DEVICES0,1,2 nohup torchrun \--nproc_per_node3 \--nnodes1 \--node_rank0 \--master_addr"127.0.0.1" \--master_port1225 \/data/train.py \--batch_size 32 \--size 320运行如上sh命令发现&#xff0c;即 …...

数据管理平台是什么?企业应如何做好数据化管理?

目录 一、数据管理是什么&#xff1f; 二、数据管理平台有哪些作用&#xff1f; 1. 数据采集与整合 2. 数据清洗与预处理 3. 数据分析与挖掘 4. 数据共享与协作 三、企业应如何做好数据化管理&#xff1f; 1. 建立数据管理战略 2. 完善数据管理制度 3. 培养数据管理人…...

GuassDB如何创建兼容MySQL语法的数据库

GaussDB简介 GaussDB是由华为推出的一款全面支持OLTP和OLAP的分布式关系型数据库管理系统。它采用了分布式架构和高可靠性设计&#xff0c;可以满足大规模数据存储和处理的需求。GaussDB具有高性能、高可靠性和可扩展性等特点&#xff0c;适用于各种复杂的业务场景&#xff0c…...