C语言---结构体 、联合体、枚举
一、初识结构体
1、结构体类型
结构体和数组都是集合,但是结构体有成员,类型可以不同;数组有成员,类型相同。
int main()
{struct tag{member--list //一个或者多个成员,成员变量}variable--list;//可以省略,结构体变量列表
}
2、结构体的自引用
int main()
{struct Node{int data;//数据域struct Node* next;//指针域,自己类型指针};
}
3、结构体的内存对齐
int main()
{struct S1{char c1;char c2;int n;};struct S2{char c1;int n;char c2;};
}
(1)宏
偏移量(相较于结构体开始位置) :offsetof-----宏(需要包含头文件:stddef.h)
可以计算出结构体的成员,相较于结构体起始位置的偏移量。
类型:offsetof (type,member)
举例如下:
int main()
{struct S1{char a;char b[10];char c;};printf("%d\n", offsetof(struct S1, a));printf("%d\n", offsetof(struct S1, b));printf("%d\n", offsetof(struct S1, c));
}
运行结果:
(2)offsetof的返回类型是
无符号整型(只表示0和正数),该返回值代表类型中成员的偏移值。(偏移量是相较于结构体开始位置)
(3)对齐的规则
1、结构体第一个成员对齐到和结构体变量起始位置偏移量为0的地址处
2、其他成员变量要对齐到 某个数字(对齐数)的整数倍的地址处。
(对齐数=编译器默认的一个对齐数与该成员变量大小的较小值)
vs默认对齐数是8。
3、结构体总大小为最大对齐数(结构体中每个成员变量都有一个对齐数,所有对齐数中最大的)的整数倍处。
4、如果嵌套的结构体的情况,嵌套结构体成员对齐到自己成员中最大对齐数的整数倍处结构体的· 整体大小就是所有最大对齐数(包含嵌套结构中成员的对齐数的整数倍)。
举例如下:
(4)结构体对齐的原因
1、提高内存访问效率:
cpu并非按照单个字节读取,而是以块为单位读取比如2字节、4字节、8字节等。假如数据在内存中未对齐,CPU可能需要多次读取并拼凑数据会导致耗时增加。
2、满足硬件平台特定要求:
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
(5)修改默认对齐数
#pragma pack(n)默认对齐数x64是8字节对齐,x86是4字节对齐,结构体的内存对齐其实是拿空间换时间做法。
1、修改默认对齐数的场景
情况1:增大对齐数(用空间换时间):比如将4字节变为16字节,优化CPU访问效率。
原理:CPU访问对齐的内存时效率更高(某些架构上如SSE/AVX指令集要求16/32字节);
对齐数据可以减少缓存行的加载次数,提升缓存利用率。
代价:结构体因填充更多字节导致内存占用增加。
情况2:减小对齐数(用时间换空间)
目的:减少内存占用(如嵌入式系统或网络传输场景)
原理:压缩结构体大小,减少填充字节。
代价:可能导致未对齐内存访问,某些平台上引发性能下降甚至崩溃(需要硬件支持非对方访问)
适用类型:空间换时间适用于内存充足、对游戏高敏感的场景(如:游戏、高频交易)
时间换空间:适合内存受限场景(如嵌入式设备、网络数据包)
(6)结构体实现位段(节省储存空间,方便位操作)
在C语言中,位段是结构体的一种特殊形式,允许在结构体中定义具有指定位数的成员,这些成员可以占用结构体变量内部的连续比特位。以下是关于结构体实现位段的详细介绍:
位段的声明
位段的声明和结构体类似,但有两个特点:
1. 成员类型限制:位段的成员必须是 int 、 unsigned int 或 signed int ,在C99标准中,位段成员的类型也可以选择其他类型,如 char 等 。
2. 成员定义格式:位段的成员名后边有一个冒号和一个数字,这个数字代表该成员变量在结构体内占用的 bit 位数。例如:
int main()
{struct BitField {unsigned int a : 3; // 成员a占用3个比特位unsigned int b : 4; // 成员b占用4个比特位int c : 6; // 成员c占用6个比特位};
}
位段的内存分配
1. 分配单位:位段的空间按照需要以4个字节( int 类型时)或者1个字节( char 类型时)为单位来开辟。
2. 分配方式:当一个字节(或4字节)的空间不足以容纳下一个位段成员时,会根据编译器规则决定是否开辟新的空间。例如:
int main()
{struct BitField {char a : 3; // 先开辟1个字节(8比特位)存放a,占用3比特位char b : 4; // 剩余5比特位,可容纳b,继续在该字节存放char c : 5; // 该字节剩余1比特位,不够存放c,此时编译器会决定是开辟新字节//,还是舍弃剩余位等(不同编译器处理不同)};
}
位段的使用注意事项
1. 不能取地址:因为位段的几个成员可能共用同一个字节,有些成员的起始位置并非字节起始位置,而内存中是以字节为单位分配地址,位内的比特位没有地址,所以不能对位段成员使用取地址符 & 。
2. 输入方式:不能使用 scanf 直接给位段成员输入值,一般先输入到一个普通变量中,再赋值给位段成员 。举例如下:
#include <stdio.h>// 定义包含位段的结构体
struct BitField {unsigned int a : 3; // 3位(0~7)unsigned int b : 4; // 4位(0~15)unsigned int c : 5; // 5位(0~31)
};int main() {struct BitField bf;unsigned int temp; // 临时变量用于接收输入// 输入a的值(范围0~7)printf("输入a(0~7): ");scanf("%u", &temp);bf.a = temp; // 赋值给位段成员// 输入b的值(范围0~15)printf("输入b(0~15): ");scanf("%u", &temp);bf.b = temp;// 输入c的值(范围0~31)printf("输入c(0~31): ");scanf("%u", &temp);bf.c = temp;// 输出位段值printf("a = %u, b = %u, c = %u\n", bf.a, bf.b, bf.c);return 0;
}
位段的取值范围是:位段成员的取值范围是由其占用的位数决定的。对于无符号整数类型的位段,范围的计算方法如下:
- 对于占用 n 位的无符号位段成员,其取值范围是 0 到 2^n - 1 。例如,占用3位的无符号位段成员, n = 3 ,则取值范围是 0 到 2^3 - 1 ,即 0 到 7 ;占用4位的无符号位段成员,取值范围是 0 到 2^4 - 1 ,即 0 到 15 ;占用5位的无符号位段成员,取值范围是 0 到 2^5 - 1 ,即 0 到 31 。
如果是有符号整数类型的位段,其取值范围的计算会更复杂一些,要考虑符号位。一般来说,对于占用 n 位的有符号位段成员,其取值范围是 -2^(n - 1) 到 2^(n - 1)- 1 。例如,一个8位有符号整数,取值范围是 -2^7 到 2^7 - 1 ,即 -128 到 127 。
二、联合体
联合体关键字:union
编译器只为最大的成员分配足够的内存空间,联合体的特点是所有成员共用同一块内存空间。联合体也叫共用体。
给联合体中一个成员赋值,,其他成员的值也跟着变化。
联合体大小计算:(1)联合体的大小至少是最大成员的大小;(2)当最大成员大小不是最大对齐数整数倍时就要到最大对齐数的整数倍。
联合体对齐规则
1、确定最大成员大小
- 首先找出联合体中占用内存空间最大的成员。例如,有一个联合体包含 int (通常占4字节)、 char (占1字节)和 double (通常占8字节),那么最大成员是 double ,大小为8字节。
2、考虑内存对齐
- 联合体的大小需要满足其所有成员的对齐要求。对齐规则与结构体类似,通常是按照最大成员的对齐方式来对齐。在上述例子中, double 的对齐要求可能是8字节对齐(不同平台可能有所不同),那么联合体的大小就需要是8的倍数。由于最大成员 double 本身大小为8字节,已经满足8字节对齐,所以该联合体的大小就是8字节。
#include <stdio.h>union MyUnion {int i;char c;double d;};int main() {printf("联合体大小: %lu 字节\n", sizeof(union MyUnion));return 0;}
三、枚举
关键字:enum,自定义数据类型,用于一组具名的整型常量。它通过关键字enum声明,使代码更容易读、易维护,常用于表示有限的取值集合(如状态、颜色、方向等)
1、核心特性
.(1) 默认值规则
- 未指定初始值时,第一个枚举常量默认值为 0 ,后续常量依次递增 1 。例如:
enum Color { RED, GREEN, BLUE }; // RED=0, GREEN=1, BLUE=2
(2)- 可显式指定某个常量的值,后续常量以此为基础递增。
enum Week { MON=1, TUE, WED }; // MON=1, TUE=2, WED=3
2. 本质为整数
- 枚举常量本质是整数常量,可直接赋值给 int 类型变量,反之需强制类型转换。
enum Color c = RED; // 正确:枚举变量赋值为枚举常量
int num = GREEN; // 正确:枚举常量自动转为int(1)
c = (enum Color)3; // 正确:int转为枚举类型(需强制转换)
3. 作用域与类型安全
- 枚举常量在所属枚举类型的作用域内唯一,但不同枚举类型的常量可重名。
enum Season { SPRING, SUMMER };
enum Month { SPRING=1, SUMMER=2 }; // 合法,与上一个枚举无关
4、定义与使用示例
(1)匿名枚举并声明变量
#include <stdio.h>int main() {// 匿名枚举:无枚举名,直接声明变量 statusenum { FAIL = 0, SUCCESS = 1 } status;status = SUCCESS;if (status == SUCCESS) {printf("操作成功!\n");}return 0;
}
(2)枚举作为函数参数,类型安全检查
#include <stdio.h>// 定义枚举类型:方向
enum Direction { UP, DOWN, LEFT, RIGHT };// 函数参数为枚举类型,增强可读性
void move(enum Direction dir) {switch(dir) {case UP: printf("向上移动\n"); break;case DOWN: printf("向下移动\n"); break;case LEFT: printf("向左移动\n"); break;case RIGHT: printf("向右移动\n"); break;}
}int main() {enum Direction d = LEFT;move(d); // 传递枚举变量move(RIGHT); // 直接传递枚举常量return 0;
}
(3)枚举与结构体结合:复杂数据类型
#include <stdio.h>// 定义枚举类型:性别
enum Gender { MALE, FEMALE, OTHER };// 结构体中使用枚举
struct Person {char name[20];enum Gender gender; // 枚举作为结构体成员int age;
};int main() {struct Person p = { "Alice", FEMALE, 25 };printf("%s 的性别:%s\n", p.name, p.gender == FEMALE ? "女" : "男"); // 条件判断枚举值return 0;
}
5、枚举类型优点
枚举类型具有以下优点:
(1)增强代码可读性:用有意义的枚举常量名(如 RED GREEN BLUE )代替无意义的数字或字符串,使代码更易理解。
(2)提高代码可维护性:当需要修改枚举值对应的实际意义时,只需在枚举定义处修改,而无需在所有使用该值的地方逐一修改。
(3 实现类型安全检查:编译器会检查枚举变量的赋值是否在枚举类型定义的范围内,避免将不相关的值赋给枚举变量,减少错误。
(4)方便代码复用:可以在不同的函数、模块中使用相同的枚举类型,提高代码的复用性。
(5)便于代码组织和管理:将相关的常量组织在一个枚举类型中,使代码结构更清晰,便于管理和维护。
今天的分享就到这里了,谢谢大家,有不足之处请指正!!!感谢
相关文章:
C语言---结构体 、联合体、枚举
一、初识结构体 1、结构体类型 结构体和数组都是集合,但是结构体有成员,类型可以不同;数组有成员,类型相同。 int main() {struct tag{member--list //一个或者多个成员,成员变量}variable--list;//可以省略&#x…...
Web Workers 使用指南
文章目录 前言基础使用高级特性 使用 ES Modules实际应用场景图像处理大数据处理轮询任务 性能优化技巧现代开发方式使用 worker-loader (Webpack) Vite中的Worker使用 限制与注意事项DOM限制:通信限制:同源策略:最佳实践 前言 Web Workers 是浏览器提供的 JavaScript 多线程解…...
JVM 与容器化部署调优实践(Docker + K8s)
📌 文章目录 📘 前言1️⃣ 容器环境下 JVM 面临的新挑战2️⃣ JVM 的容器资源感知机制详解3️⃣ JVM 内存调优:如何正确使用堆内存4️⃣ JVM CPU 调优:GC 与编译线程控制5️⃣ Kubernetes 典型配置误区与对策6️⃣ 实战案例&#…...
Android OkHttp控制链:深入理解网络请求的流程管理
OkHttp作为Android和Java平台上广泛使用的HTTP客户端,其核心设计之一就是"控制链"(Chain)机制。本文将深入探讨OkHttp控制链的工作原理、实现细节以及如何利用这一机制进行高级定制。 一、什么是OkHttp控制链 OkHttp控制链是一种责任链模式的实现&#…...
《易经》的数学表达:初级版和高级版
《易经》的数学表达, 一、初级版,可基于以下框架构建, 涵盖符号系统、结构代数及变换规则: 此框架将《易经》抽象为离散数学结构,兼容符号逻辑、概率论与群论,为算法化占断、卦象拓扑分析及跨文化比较提供…...
卷积神经网络基础(十)
之前我们学习了SGD、Momentum和AdaGrad三种优化方法,今天我们将继续学习Adam方法。 6.1.6 Adam 我们知道Momentum参照的是小球在碗中滚动的物理规则进行移动而实现的,AdaGrad为参数的每个元素适当地调整更新步伐。那如果我们将这两种方法融合在一起会不…...
怎么把cursor(Cursor/ollama)安装到指定路径
使用PowerShell命令 打开电脑开始菜单,输入powerShell,使用管理员权限打开powerShell窗口,使用cd命令到cursor或ollama安装包的下载目录,如我的Cursor所在的目录为D:\environment\cursor\soft,输入以下 cd E:\downloa…...
第21天-pyttsx3语音播放功能
示例1:语音参数控制(语速/音量/音调) import pyttsx3def speech_demo():engine = pyttsx3.init()# 获取当前语音参数print("默认语速:", engine.getProperty(rate))print("默认音量:", engine.getProperty(volume))print("可用语音:", engin…...
Multi-Query Attention:传统自注意力( Self-Attention)优化显存和加速方案
本文导读:Multi-Query Attention(MQA)是 Google Research 2022 年提出的一项轻量化注意力技术,通过“多查询、单键值”的设计,把自注意力层的 KV 缓存从 O(hnd) 降到 O(nd),在不牺牲模型精度的前提下大幅节…...
学习路之uniapp--unipush2.0推送功能--服务端推送消息
学习路之uniapp--unipush2.0推送功能--服务端推送消息 一、二、三、 一、 二、 三、...
如何使用AI搭建WordPress网站
人工智能正迅速成为包括网页设计在内的许多行业在其功能设置中添加的一种工具。在数字设计和营销领域,许多成熟的工具都在其产品中添加了人工智能功能。WordPress 也是如此。作为目前最流行的网站建设工具之一,WordPress 的人工智能插件越来越多也就不足…...
Java 项目管理工具:Maven 与 Gradle 的深度对比与选择
Java 项目管理工具:Maven 与 Gradle 的深度对比与选择 在 Java 开发领域,项目管理工具对于项目的构建、依赖管理等起着至关重要的作用。Maven 和 Gradle 是目前最主流的两款工具,它们各自有着独特的优势和适用场景。本文将对 Maven 与 Gradl…...
Elasticsearch简单集成java框架方式。
Elasticsearch 在 Java 中最常用的客户端是什么?如何初始化一个 RestHighLevelClient?如何用 Spring Boot 快速集成 Elasticsearch?Spring Data Elasticsearch 如何定义实体类与索引的映射? 最常用的 Java 客户端 目前官方推荐使用…...
50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Hidden Search Widget (交互式搜索框)
📅 我们继续 50 个小项目挑战!—— Hidden Search Widget 组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ ✨ 组件目标 点击按钮展开隐藏的搜索框 再次点击按钮…...
python爬虫和逆向:百度翻译数据采集的几种方式
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、官方API方式(推荐)1.1 百度翻译开放平台API二、网页版逆向方式(代码可直接运行)2.1 拿到js加密方法2.2 python解密代码三、浏览器自动化方式3.1 Selenium自动化操作3.2 Playwright自动化四、移动端API逆向4.1 分…...
spring5-配外部文件-spEL-工厂bean-FactoryBean
spring配外部文件 我们先在Spring里配置一个数据源 1.导c3p0包,这里我们先学一下hibernate持久化框架,以后用mybites. <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>5.2.…...
Ubuntu部署私有Gitlab
这个东西安装其实挺简单的,但是因为我这边迁移了数据目录和使用自己安装的 nginx 代理还是踩了几个坑,所以大家可以注意下 先看下安装 # 先安装必要组件 sudo apt update sudo apt install -y curl openssh-server ca-certificates tzdata perl# 添加gi…...
Activiti 7建表语句及注释
Activiti数据库表Oracle兼容DM建表语句及字段注释。 附件下载版地址点这里 --通用属性表 create table ACT_GE_PROPERTY (NAME_ NVARCHAR2(64),VALUE_ NVARCHAR2(300),REV_ INTEGER,primary key (NAME_) );COMMENT ON TABLE ACT_GE_PROPERTY IS 通用属性表;COMMENT ON COLUMN …...
React中使用 Ant Design Charts 图表
// 引入 Ant Design Charts 的柱状图组件 Column import { Column } from ant-design/charts;// 定义函数组件 App,用于展示柱状图 function App() {// 数据源:每个对象代表一个柱子,包含类型(type)和销售额࿰…...
佰力博科技与您探讨压电材料的原理与压电效应的应用
压电材料的原理基于正压电效应和逆压电效应,即机械能与电能之间的双向转换特性。 压电材料的原理源于其独特的晶体结构和电-机械耦合效应,具体可分为以下核心要点: 1. 正压电效应与逆压电效应的定义 正压电效应:当压电…...
vscode打开vue + element项目
好嘞,我帮你详细整理一个用 VS Code 来可视化开发 Vue Element UI 的完整步骤,让你能舒服地写代码、预览界面、调试和管理项目。 用 VS Code 可视化开发 Vue Element UI 全流程指南 一、准备工作 安装 VS Code 官网下载安装:https://code…...
一步步解析 HTTPS
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
使用vue2做一个生成二维码的案例【可当组件使用】
最近有个需求需要用前端来生成一个二维码,就封装了一个简单的组件,这篇文章来分享给大家。 使用的技术: Vue2 Ant Design Vue QRCodeJS2 node版本:16.20 组件样式: 大家可以根据自己的需求来调整代码。 依赖安装&am…...
Hadoop-HA高可用集群启动nameNode莫名挂掉,排错解决
Hadoop-HA高可用集群启动nameNode莫名挂掉,排错解决 nameNode错误日志 2025-05-21 16:14:12,218 INFO org.apache.hadoop.ipc.Client: Retrying connect to server: node01/192.168.191.111:8485. Already tried 5 time(s); retry policy is RetryUpToMaximumCoun…...
从零基础到最佳实践:Vue.js 系列(2/10):《模板语法与数据绑定》
Vue.js 模板语法与数据绑定:从基础到实践 关键点 Vue.js 的模板语法使用 HTML 结合特殊指令(如 v-bind、v-on),实现动态界面。插值({{ }})显示数据,指令控制 DOM 行为,双向绑定简化…...
第二章:Android常用UI控件
1、介绍: 控件是界面组成的主要元素,界面中的控件有序排放和完美组合,便可在用户眼前呈现出丰富多彩的页面。 2、常用控件: 一、TextView控件: 在使用手机时,经常会看见一些文本信息,这些文本…...
LeetCode 1004. 最大连续1的个数 III
LeetCode 1004题 “最大连续1的个数 III” 是一道关于数组和滑动窗口的问题。题目描述如下: 题目描述 给定一个由若干 0 和 1 组成的数组 nums,以及一个整数 k。你可以将最多 k 个 0 翻转为 1。返回经过翻转操作后,数组中连续 1 的最大个数…...
Flink CDC 3.4 发布, 优化高频 DDL 处理,支持 Batch 模式,新增 Iceberg 支持
引言 Apache Flink 社区很开心地宣布,在经过4个月的版本开发之后,Flink CDC 3.4.0 版本已经正式发布。Flink CDC 是流行的流式数据集成框架,CDC 3.4.0 版本强化了框架对于高频表结构变更的支持,框架支持了 batch 执行模式&#x…...
NIFI的处理器:JSLTTransformJSON 2.4.0
该处理器使用JSLT转换FlowFile JSON有效负载的格式。使用转换后的内容创建新的FlowFile,并将其路由到“成功”关系。如果JSLT转换失败,则将原始FlowFile路由到“失败”关系。 需要注意的是,编译JSLT转换可能相当昂贵。理想情况下,…...
k8s-ServiceAccount 配置
在 Kubernetes 中 ServiceAccount 是一种为 Pod 提供身份认证的机制,允许 Pod 以特定的身份访问 Kubernetes API 服务器。 **Role(角色)**是 Kubernetes 中定义权限的资源对象,它只能在特定的命名空间内生效。Role 用于定义一组权…...
Python Lambda 表达式
在 Python 编程中,Lambda 表达式是一个非常强大且实用的工具,它就像一把瑞士军刀,能在各种场景下帮助我们写出简洁、优雅的代码。接下来,就让我们一起深入探索 Python Lambda 表达式的奥秘。 一、Lambda 表达式的基础认知 1…...
【ffmpeg】ffprobe基本用法
ffprobe 是 FFmpeg 工具集中的一个强大命令行工具,主要用于分析多媒体文件(如视频、音频等)的格式和内容信息。它可以提取文件的元数据、编解码器信息、流详情、帧信息等,而无需对文件进行转码或修改。 基本用法 ffprobe [选项] …...
Java 代码生成工具:如何快速构建项目骨架?
Java 代码生成工具:如何快速构建项目骨架? 在 Java 项目开发过程中,构建项目骨架是一项繁琐但又基础重要的工作。幸运的是,Java 领域有许多代码生成工具可以帮助我们快速完成这一任务,大大提高开发效率。 一、代码生…...
模板初阶【C++】
一、 泛型编程 前言: 我们经常会用到数据的交换,C中的函数重载可以完成 //函数重载 void swap(int& x,int& y) {int tmp x;x y;y tmp; }void swap(double& x, double& y) {double tmp x;x y;y tmp; }void swap(char& x, ch…...
URL 类知识点详解
URL 类知识点详解 1. 基本概念与位置 所属包: java.net.URL核心功能: 表示统一资源定位符(Uniform Resource Locator),用于标识和定位网络资源(如网页、文件、API接口)。支持多种协议:HTTP、HTTPS、FTP、file(本地文件)等。不可变类:一旦创建,内容不可修改(线程安全…...
如何使用redis做限流(golang实现小样)
在实际开发中,限流(Rate Limiting)是一种保护服务、避免接口被恶意刷流的常见技术。常用的限流算法有令牌桶、漏桶、固定窗口、滑动窗口等。由于Redis具备高性能和原子性操作,常常被用来实现分布式限流。 下面给出使用Golang结合Redis实现简单限流的几种常见方式(以“固定…...
OpenHarmony外设驱动使用 (九),Pin_auth
OpenHarmony外设驱动使用 (九) Pin_auth 概述 功能简介 口令认证是端侧设备不可或缺的一部分,为设备提供一种用户认证能力,可应用于设备解锁、支付、应用登录等身份认证场景。用户注册口令后,口令认证模块就可为设备…...
MySQL基础(InnoDB)
✅ InnoDB:支持事务、行级锁、外键。 为什么要用事务? 安全:如果中途发现错误(比如改错分数),可以一键撤销所有操作,就像游戏里的“回档”功能! 原子…...
自建srs实时视频服务器支持RTMP推流和拉流
文章目录 一、整体示意图二、服务器端1.srs简介及架构2.docker方式安装3.k8s方式安装4.端口 三、推流端1.OBS Studio2.ffmpeg推流3.streamlabs苹果手机4.twire安卓手机5.网络推流摄像头 四、拉流端1.vlc2.srs 参考awesome系列:https://github.com/juancarlospaco/aw…...
C++性能优化的7大核心策略与实战案例
在大型C项目中,性能优化需从语言特性、系统架构、硬件特性等多维度切入。以下是经过验证的关键技术路径👇 🔧 一、内存管理的极致控制 问题:频繁的动态内存分配会导致性能抖动和内存碎片,尤其在实时系统中可能…...
《国家高等教育智慧平台:重塑学习新时代》
时代之需:平台应运而生 在数字化浪潮席卷全球的当下,高等教育领域也在经历着深刻的变革。数字化技术的迅猛发展,正以前所未有的力量重塑着高等教育的形态。从在线课程的兴起,到虚拟实验室的应用,再到智能化教学工具的普…...
【Django】Django DRF 中如何手动调用分页器返回分页数据(APIView,action场景)
📦 Django DRF 中如何手动调用分页器返回分页数据(APIView,action场景) 在使用 Django REST Framework(DRF)时,很多人习惯了用 GenericAPIView 或 ViewSet 自动帮我们处理分页。但在某些场景中…...
遨游科普:三防平板有哪些品牌?哪个品牌值得推荐?
在工业数字化与户外作业场景日益多元化的今天,三防平板凭借其卓越的防护性能与功能集成能力,成为电力巡检、地质勘探、应急救援等领域不可或缺的智能终端。所谓“三防”,即防尘、防水、防摔,国际标准IP68与军用标准MIL-STD-810H的…...
Flannel后端为UDP模式下,分析数据包的发送方式(一)
Flannel 使用的是 UDP 模式,分析发往 10.244.2.5 的数据包会从哪个网卡发出。 路由表 以下是提供的路由表: Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.1.1 …...
华为鸿蒙电脑发布,折叠屏怎么选?
1⃣屏幕特性: 分辨率:高分辨率能保证图像和文字的清晰细腻 屏幕材质:OLED 屏幕通常具有更好的对比度、色彩表现和更广的色域 刷新率:支持自适应刷新率的屏幕可以根据不同的使用场景自动调整刷新率,在保证流畅度的同时优…...
将VMware上的虚拟机和当前电脑上的Wifi网卡处在同一个局域网下,实现同一个局域网下实现共享
什么是桥接模式:桥接模式(Bridging Mode)是一种网络连接模式,常用于虚拟机环境中,将虚拟机的虚拟网络适配器直接连接到主机的物理网络适配器上,使虚拟机能够像独立的物理设备一样直接与物理网络通信 1.打开…...
论文阅读:Auto-Encoding Variational Bayes
对图像生成论文自编码变分贝叶斯Auto-Encoding Variational Bayes原理理解和记录 Abstract 我们如何在有向概率模型中,在具有难以处理的后验分布的连续潜在变量z和大型数据集的存在下,执行有效的推理和学习? 我们介绍了一种随机变分推理和学…...
API面临哪些风险,如何做好API安全?
API面临的风险 API(应用程序编程接口)在现代软件开发和集成中扮演着至关重要的角色,但同时也面临着多种安全风险,主要包括以下几个方面: 数据泄露风险: API通常涉及敏感数据的传输和交换,如用…...
C# Prism框架详解:构建模块化WPF应用程序
1. Prism框架简介 Prism是一个用于构建松散耦合、可测试和可维护的WPF桌面应用程序的框架。它最初由微软模式与实践团队开发,现在由社区维护,是构建企业级WPF应用程序的首选框架之一。 Prism框架的核心优势: 模块化设计:将应用…...
【工具教程】图片识别内容改名,图片指定区域识别重命名,批量识别单据扫描件批量改名,基于WPF和腾讯OCR的实现方案
基于WPF和腾讯OCR的图片指定区域识别与批量重命名实现方案 一、应用场景 电商商品管理 电商平台每天需处理大量商品图片,原始文件名无规律(如IMG_001.jpg)。通过指定图片中商品名称、颜色、尺码等区域,OCR识别后自动重命名…...