嵌入式C语言:结构体对齐
目录
一、对齐的原因
1.1. 硬件访问效率
1.2. 内存管理简化
1.3. 编译器优化
1.4. 代码示例
二、对齐规则
2.1. 基本数据类型对齐
2.2. 结构体成员对齐
2.3. 结构体整体对齐
2.4. 代码示例
三、对齐控制
3.1. 使用 #pragma pack
3.2. 使用 __attribute__((packed))(GCC)
四、对齐的影响
4.1. 内存使用
4.2. 数据访问效率
4.3. 可移植性
4.4. 代码维护和可读性
4.5. 硬件接口与缓存效率
4.6. 编译器优化
五、应用场景
5.1. 与硬件寄存器交互
5.2. 内存管理优化
5.3. 数据传输与通信
六、注意事项
6.1. 了解编译器的对齐规则
6.2. 避免不必要的填充
6.3. 考虑跨平台兼容性
6.4. 注意结构体嵌套的对齐
6.5. 使用编译器指令控制对齐
6.6. 平台依赖性和编译器差异
6.7. 性能影响
6.8. 代码可读性和维护性
6.9. 联合(Union)与结构体混合使用
在嵌入式系统编程中,结构体对齐(Structure Alignment)是一个重要的话题,因为它直接影响到内存的使用效率和访问速度。编译器在分配结构体成员的内存时,通常会按照某种对齐规则来排列这些成员,可能导致结构体占用的内存比成员本身所占内存的总和要大。
一、对齐的原因
1.1. 硬件访问效率
-
处理器架构的要求:许多处理器架构要求特定类型的数据必须存储在特定的内存地址边界上。例如,32位处理器可能要求
int
类型的数据(通常是4字节)必须存储在4字节边界上。如果数据没有正确对齐,处理器可能需要执行额外的内存访问操作来读取或写入这些数据,这会导致性能下降。 -
总线宽度:现代计算机系统的总线宽度与数据类型的大小相匹配。如果数据没有对齐到总线宽度,处理器可能需要多次总线访问来读取或写入一个完整的数据项。这增加了总线上的流量,降低了效率。
-
缓存一致性:许多处理器使用缓存来加速内存访问。未对齐的数据可能导致缓存行未充分利用,因为缓存行通常是以特定的字节大小(如64字节)划分的。未对齐的数据可能会跨越多个缓存行,导致缓存未命中增加。
-
异常处理:一些处理器在访问未对齐的数据时会触发异常。意味着程序必须处理这些异常,通常涉及到额外的代码执行和可能的性能损失。
1.2. 内存管理简化
- 简化内存分配和释放:对齐内存可以简化内存管理器的实现。内存管理器通常以块或页的形式分配内存,这些块或页的大小通常是2的幂次方。对齐内存可以确保每个分配的对象都适合这些块或页的大小,从而减少了内存碎片和分配/释放的复杂性。
- 提高数据访问的可靠性:对齐内存还可以减少由于内存访问错误(如越界访问)而导致的程序崩溃或数据损坏的风险。虽然这更多是与编程实践相关,但对齐内存可以提供一种额外的安全层。
- 简化编译器实现:编译器在生成代码时需要考虑内存对齐。如果所有数据类型都遵循相同的对齐规则,编译器可以更容易地优化内存访问指令。有助于生成更高效的代码。
1.3. 编译器优化
- 优化内存访问指令:编译器在生成代码时需要考虑内存对齐,以优化内存访问指令。
- 提高程序的执行速度:对齐的内存布局有助于编译器生成更高效的代码,提高程序的执行速度。
1.4. 代码示例
以下是一个简单的C语言结构体对齐的代码示例,展示如何定义结构体以及如何通过编译器指令来控制对齐方式:
#include <stdio.h>// 默认对齐方式下的结构体定义
struct DefaultAligned {char a; // 1 byteshort b; // 2 bytes, 通常对齐到2字节边界int c; // 4 bytes, 通常对齐到4字节边界char d; // 1 byte, 可能会添加填充字节以满足对齐要求
};// 使用#pragma pack指令改变对齐方式的结构体定义
#pragma pack(push, 1) // 将对齐方式设置为1字节对齐
struct Packed {char a;short b;int c;char d;
};
#pragma pack(pop) // 恢复之前的对齐方式int main() {printf("Size of DefaultAligned: %lu bytes\n", sizeof(struct DefaultAligned));printf("Size of Packed: %lu bytes\n", sizeof(struct Packed));// 输出结构体成员的地址,以观察对齐方式的影响struct DefaultAligned da;struct Packed p;printf("Address of da.a: %p\n", (void*)&da.a);printf("Address of da.b: %p\n", (void*)&da.b);printf("Address of da.c: %p\n", (void*)&da.c);printf("Address of da.d: %p\n", (void*)&da.d);printf("Address of p.a: %p\n", (void*)&p.a);printf("Address of p.b: %p\n", (void*)&p.b);printf("Address of p.c: %p\n", (void*)&p.c);printf("Address of p.d: %p\n", (void*)&p.d);return 0;
}
默认对齐方式下的结构体:
struct DefaultAligned
结构体在默认对齐方式下定义。- 编译器会根据目标平台的对齐要求为结构体成员分配内存,并可能添加填充字节以满足对齐要求。
改变对齐方式的结构体:
- 使用
#pragma pack(push, 1)
指令将对齐方式设置为1字节对齐。 struct Packed
结构体在这种对齐方式下定义,成员之间不会添加填充字节。- 使用
#pragma pack(pop)
指令恢复之前的对齐方式。
输出结果:
通过观察地址,可以直观地看到对齐方式如何影响内存布局。
二、对齐规则
编译器遵循一系列默认的对齐规则来确保数据在内存中的高效存储和访问。
2.1. 基本数据类型对齐
每种基本数据类型(如char
、short
、int
、float
、double
等)在内存中都有一个默认的对齐值。这个对齐值通常与数据类型的大小相等,但也可能因编译器和平台的不同而有所差异。
char
:对齐值为1字节。short
:对齐值通常为2字节(但在某些平台上可能为4字节)。int
和float
:在32位系统上,对齐值通常为4字节。double
:在32位和64位系统上,对齐值通常为8字节。
2.2. 结构体成员对齐
结构体中的每个成员都有一个起始地址,这个地址必须是该成员类型对齐值的整数倍。如果前一个成员占用的空间无法满足这个要求,编译器会在成员之间插入填充字节(padding)以确保对齐。
假设有以下结构体定义:
struct Example {char a; // 1 byteint b; // 4 byteschar c; // 1 byte
};
在不考虑对齐的情况下,期望这个结构体占用 1 + 4 + 1 = 6
字节。然而,由于对齐规则的存在,编译器可能会这样分配内存:
Offset | Member
-------|-------0 | a (1 byte)1 | padding (3 bytes) // 对齐b到4字节边界4 | b (4 bytes)8 | c (1 byte)9 | padding (3 bytes) // 使结构体总大小对齐到下一个合适的边界(通常是最大成员类型的边界)
因此,这个结构体实际上可能会占用 1 + 3 + 4 + 1 + 3 = 12
字节。
2.3. 结构体整体对齐
结构体的总大小(即其最后一个成员后的内存地址加上任何必需的填充字节)必须是其最大成员对齐值的整数倍。这是为了确保当结构体数组或包含结构体的其他结构体被分配时,每个元素都能正确对齐。
2.4. 代码示例
以下是一个C语言代码示例,展示结构体对齐的影响:
#include <stdio.h>
#include <stddef.h> // 包含offsetof宏的定义// 定义一个结构体,不指定对齐方式(使用编译器默认的对齐规则)
struct Example {char a; // 1 byteint b; // 4 bytes, 通常对齐到4字节边界short c; // 2 bytes, 通常对齐到2字节边界,但在这里会受到b的影响char d; // 1 byte, 可能会添加填充字节以满足整体对齐要求
};int main() {// 打印基本数据类型的大小printf("Size of char: %zu bytes\n", sizeof(char));printf("Size of short: %zu bytes\n", sizeof(short));printf("Size of int: %zu bytes\n", sizeof(int));// 打印结构体的大小printf("Size of struct Example: %zu bytes\n", sizeof(struct Example));// 打印结构体成员的偏移量printf("Offset of a: %zu bytes\n", offsetof(struct Example, a));printf("Offset of b: %zu bytes\n", offsetof(struct Example, b));printf("Offset of c: %zu bytes\n", offsetof(struct Example, c));printf("Offset of d: %zu bytes\n", offsetof(struct Example, d));return 0;
}
类似以下的输出(具体数值可能因编译器和平台的不同而有所差异):
Offset of b: 4 bytes // a后添加了3个填充字节以满足b的4字节对齐
Offset of c: 8 bytes // b后没有添加填充字节(因为已经是4字节对齐),c直接对齐到下一个4字节边界(但实际上是2字节对齐要求,这里受b影响已经满足)
Offset of d: 10 bytes // c后添加了2个填充字节,以满足整体对齐要求(假设最大成员对齐值为4字节,但这里因为d是char,所以不影响整体对齐,真正的填充是为了满足可能的后续扩展或结构体数组的对齐)
三、对齐控制
3.1. 使用 #pragma pack
在一些编译器中(如GCC和MSVC),可以使用 #pragma pack
指令来改变对齐规则。例如:
#pragma pack(push, 1) // 将对齐方式设置为1字节对齐
struct PackedExample {char a;int b;char c;
};
#pragma pack(pop) // 恢复之前的对齐方式
PackedExample
结构体将只占用 1 + 4 + 1 = 6
字节,但请注意,这可能会牺牲一些性能,因为处理器可能需要额外的指令来访问未对齐的数据。
3.2. 使用 __attribute__((packed))
(GCC)
在GCC中,可以使用 __attribute__((packed))
来指定结构体应该紧凑对齐:
struct __attribute__((packed)) PackedExample {char a;int b;char c;
};
同样会使结构体占用 6
字节。
四、对齐的影响
4.1. 内存使用
- 增加内存开销:为了满足对齐要求,编译器可能会在结构体成员之间或结构体末尾插入填充字节。会导致结构体实际占用的内存空间大于其成员所需的空间,造成内存浪费。
- 内存碎片化:在动态内存分配时,结构体的对齐可能导致内存块之间出现难以利用的小空隙,从而降低内存的利用率。
4.2. 数据访问效率
- 提高访问速度:对齐的数据可以使CPU更高效地访问,因为现代计算机体系结构通常设计为能够一次性读取对齐的数据。未对齐的数据可能需要多次读取,增加访问时间。
- 硬件限制:某些嵌入式处理器对数据访问有严格的对齐要求。访问未对齐的数据可能会导致硬件异常,需要额外的软件处理,从而降低程序的执行效率。
4.3. 可移植性
- 不同平台对齐方式差异:不同的编译器和硬件平台可能有不同的默认对齐规则。可能导致在不同平台上编译同一个结构体时,其大小和内存布局不同,影响程序的可移植性。
- 跨平台通信问题:当在不同平台之间进行数据通信时,结构体的对齐差异可能会导致数据解析错误。
4.4. 代码维护和可读性
- 隐藏的填充字节:编译器自动插入的填充字节在代码中不会显式体现,给代码维护带来困难。
- 成员顺序影响:结构体成员的顺序会影响对齐方式和大小,要求开发者在设计时考虑成员的排列顺序,增加了代码设计的复杂度。
4.5. 硬件接口与缓存效率
- 硬件接口要求:在与硬件寄存器交互时,对齐尤为重要。结构体的对齐方式必须与硬件要求相匹配。
- 缓存效率:对齐的数据有助于提高缓存效率。未对齐的数据可能导致结构体跨越多个缓存块,增加缓存未命中率和性能下降。
4.6. 编译器优化
- 对齐数据优化:对齐的数据允许编译器使用更高效的指令序列进行优化。未对齐的数据可能无法享受这些优化。
五、应用场景
5.1. 与硬件寄存器交互
在嵌入式系统中,经常需要与硬件寄存器进行交互。硬件寄存器通常有特定的地址边界要求,结构体对齐可以确保软件中的结构体成员与硬件寄存器的布局相匹配。例如,某些微控制器的外设寄存器可能要求特定的对齐方式,通过合理定义结构体对齐,可以方便地访问这些寄存器。
// 假设硬件寄存器要求按4字节对齐
#pragma pack(4)
struct PeripheralRegisters {volatile uint32_t control_register;volatile uint32_t status_register;
};
#pragma pack()
可以保证 control_register
和 status_register
都在 4 字节对齐的地址上,与硬件寄存器的布局一致,便于直接通过结构体指针访问寄存器。
5.2. 内存管理优化
在内存资源有限的嵌入式设备中,合理利用结构体对齐可以优化内存使用。通过精心设计结构体成员的顺序,可以减少填充字节的数量,从而节省内存空间。例如,将较小的成员放在一起,较大的成员放在后面,尽量减少成员之间的填充。
struct MemoryOptimized {char flag; // 1字节short value; // 2字节int data; // 4字节
};
flag
和 value
之间只需要填充 1 字节,比将 int
放在前面时的填充字节数少,从而提高了内存利用率。
5.3. 数据传输与通信
在嵌入式系统间的数据传输或与外部设备通信时,结构体对齐也非常重要。如果发送方和接收方对数据结构的对齐方式不一致,可能导致数据解析错误。例如,在网络通信中,需要确保发送和接收端对结构体的对齐方式相同,以保证数据的正确传输和解析。
// 发送端
#pragma pack(1)
struct NetworkPacket {char type;int length;char data[10];
};
#pragma pack()// 接收端也需要同样的对齐方式
#pragma pack(1)
struct NetworkPacket {char type;int length;char data[10];
};
#pragma pack()
通过设置相同的对齐方式(这里是 1 字节对齐),可以避免因对齐差异导致的通信问题。
六、注意事项
6.1. 了解编译器的对齐规则
- 不同编译器差异:不同的编译器可能有不同的默认对齐规则和对齐控制指令。
- 查阅文档:在编写嵌入式C代码时,需要查阅所使用编译器的文档,了解其对齐规则,并确保代码符合这些规则。
6.2. 避免不必要的填充
- 成员顺序:通过合理地安排结构体成员的顺序,可以减少填充字节的数量。例如,将占用空间较大的成员放在前面,将占用空间较小的成员放在后面。
- 紧凑对齐:在内存资源有限的情况下,可以考虑使用编译器提供的指令(如
#pragma pack
或__attribute__((packed))
)来指定结构体按紧凑方式对齐,但需注意性能影响。
6.3. 考虑跨平台兼容性
- 平台差异:不同的嵌入式平台可能有不同的默认对齐规则。如某些 ARM 架构处理器默认按 4 字节对齐,一些 8 位单片机可能按 1 字节对齐,编写跨平台代码时要注意这些差异。
- 对齐指令:使用特定的编译器指令或预处理宏来定义对齐方式,以确保结构体在不同平台上的对齐方式一致。
6.4. 注意结构体嵌套的对齐
- 嵌套结构体:当结构体中嵌套了其他结构体时,需要特别注意嵌套结构体的对齐方式。
- 最大成员对齐:嵌套结构体的对齐方式应满足其自身最大成员的对齐要求,同时整个结构体的对齐方式也应满足其最大成员(包括嵌套结构体中的最大成员)的对齐要求。例如:
struct InnerStruct {int innerInt; // 假设int为4字节char innerChar; // 1字节
};struct OuterStruct {struct InnerStruct inner;short outerShort; // 2字节
};
这里InnerStruct
的对齐要满足int
的 4 字节对齐,OuterStruct
的对齐要满足InnerStruct
中int
和自身short
两者中最大的 4 字节对齐。
6.5. 使用编译器指令控制对齐
- #pragma pack:在某些情况下,可能需要手动控制结构体的对齐方式。可以使用编译器提供的指令(如
#pragma pack
)来指定对齐方式。 - 性能权衡:手动控制对齐方式可能会影响性能,并增加代码的复杂性。因此,在做出决策时需要权衡内存使用和性能之间的关系。
6.6. 平台依赖性和编译器差异
- 平台对齐规则:不同的嵌入式平台可能有不同的默认对齐规则。编写跨平台的嵌入式代码时,必须注意平台之间的对齐差异。
- 编译器特性:即使在相同的平台上,不同的编译器也可能有不同的默认对齐值或对齐控制指令。因此,要充分了解所使用的编译器的特性。
6.7. 性能影响
- 紧凑对齐与性能:紧凑对齐可以节省内存空间,但可能会降低数据访问的性能。在性能敏感的应用中,需要在内存使用和性能之间进行权衡。
- 频繁访问数据:对于频繁访问的结构体数据,应尽量遵循默认的对齐规则以提高性能。
6.8. 代码可读性和维护性
- 添加注释:为了提高代码的可读性,可以在结构体定义时添加注释,说明结构体的内存布局和对齐方式。
- 修改成员注意影响:在修改结构体成员时,要注意其对对齐方式和结构体大小的影响。有助于保持代码的一致性和可维护性。
6.9. 联合(Union)与结构体混合使用
- 联合对齐方式:联合的对齐方式通常是其最大成员的对齐方式。可能会影响整个结构体的对齐。
- 混合结构考虑:在使用结构体包含联合的混合结构时,要充分考虑对齐对内存布局的影响,并做出适当的调整。
struct MixedStruct {char c;union {short s;int i;} u;
};
此结构体中联合u
对齐方式是int
的 4 字节对齐,char c
后会有 3 字节填充以满足联合对齐要求,使用时要考虑对齐对内存布局的影响。
综上所述,在嵌入式系统编程中,合理地控制结构体对齐是一个需要在性能、内存使用和代码可移植性之间做出权衡的问题。
相关文章:

嵌入式C语言:结构体对齐
目录 一、对齐的原因 1.1. 硬件访问效率 1.2. 内存管理简化 1.3. 编译器优化 1.4. 代码示例 二、对齐规则 2.1. 基本数据类型对齐 2.2. 结构体成员对齐 2.3. 结构体整体对齐 2.4. 代码示例 三、对齐控制 3.1. 使用 #pragma pack 3.2. 使用 __attribute__((packed)…...

【Rust自学】15.5. Rc<T>:引用计数智能指针与共享所有权
喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 15.5.1. 什么是Rc<T> 所有权在大部分情况下都是清晰的。对于一个给定的值࿰…...

谈谈RTMP|RTSP播放器视频view垂直|水平反转和旋转设计
技术背景 我们在做RTMP|RTSP播放器的时候,有这样的技术诉求,有的摄像头出来的数据是有角度偏差的,比如“装倒了”,或者,图像存在上下或者左右反转,这时候,就需要播放器能做响应的处理ÿ…...

decison tree 决策树
熵 信息增益 信息增益描述的是在分叉过程中获得的熵减,信息增益即熵减。 熵减可以用来决定什么时候停止分叉,当熵减很小的时候你只是在不必要的增加树的深度,并且冒着过拟合的风险 决策树训练(构建)过程 离散值特征处理:One-Hot…...

GO语言 链表(单向链表
链表的前提 GO语言的链表类似于C语言的链表,它通过结构体和结构体指针实现。 结构体 GO语言定义结构体如下 type user struct {name stringage intnext *user } 结构体指针 结构体指针就是指向结构体的指针,我们在链表中会用到结构体指针实现链…...

Java:初识Java
初识Java 一.Java语言概述 1. Java是什么 Java是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。 不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的…...

Spring WebSocket 与 STOMP 协议结合实现私聊私信功能
目录 后端pom.xmlConfig配置类Controller类DTO 前端安装相关依赖websocketService.js接口javascripthtmlCSS 效果展示简单测试连接: 报错解决方法1、vue3 使用SockJS报错 ReferenceError: global is not defined 功能补充拓展1. 安全性和身份验证2. 异常处理3. 消息…...

从0到1:C++ 开启游戏开发奇幻之旅(一)
目录 为什么选择 C 进行游戏开发 性能卓越 内存管理精细 跨平台兼容性强 搭建 C 游戏开发环境 集成开发环境(IDE) Visual Studio CLion 图形库 SDL(Simple DirectMedia Layer) SFML(Simple and Fast Multim…...

基于Flask的哔哩哔哩综合指数UP榜单数据分析系统的设计与实现
【Flask】基于Flask的哔哩哔哩综合指数UP榜单数据分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统旨在通过大数据分析和数据挖掘技术,结合Flask轻量级We…...

在php中怎么打开OpenSSL
(点击即可进入聊天助手) 背景 在使用php做一些项目时,有用到用户邮箱注册等,需要开启openssl的能力 在php系统中openssl默认是关闭状态的,在一些低版本php系统中,有的甚至需要在服务器终端后台,手动安装 要打开OpenSSL扩展,需要进行以下步骤 …...

oracle 分区表介绍
oracle 分区表介绍 Oracle 分区表是一个非常强大的数据库功能,可以将一个大的表分割成多个更小、更易管理的块(分区)。这种分区结构在处理大规模数据时非常有用,因为它能改善性能、简化维护和管理,并支持高效的数据存取…...

wxwidgets直接获取系统图标,效果类似QFileIconProvider
目前只做了windows版本,用法类似QFileIconProvider // 头文件 #ifndef WXFILEICONPROVIDER_H #define WXFILEICONPROVIDER_H#include <wx/wx.h> #include <wx/icon.h> #include <wx/image.h> #include <wx/bmpcbox.h> // Include for wxB…...

Arduino大师练成手册 -- 控制 PN532 NFC 模块
要在 Arduino 上控制 PN532 NFC 模块,你可以按照以下步骤进行: 硬件连接 VCC:连接到 Arduino 的 3.3V 引脚。 GND:连接到 Arduino 的 GND 引脚。 SDA:连接到 Arduino 的 SDA 引脚(通常是 A4)…...

解决日志中 `NOT NULL constraint failed` 异常的完整指南
在开发和运维过程中,日志是我们排查问题的重要工具。然而,当日志中出现类似 NOT NULL constraint failed 的异常时,往往意味着数据库约束与代码逻辑不匹配。本文将详细分析此类问题的原因,并提供完整的解决方案。 © ivwdcwso (ID: u012172506) 问题描述 在同步 AWS …...

C动态库的生成与在Python和QT中的调用方法
目录 一、动态库生成 1)C语言生成动态库 2)c类生成动态库 二、动态库调用 1)Python调用DLL 2)QT调用DLL 三、存在的一些问题 1)python调用封装了类的DLL可能调用不成功 2)DLL格式不匹配的问题 四、…...

UE求职Demo开发日志#7 强化属性完善
1 实现思路设计 定义一个结构体记录技能树一个单元的信息,命名为FStrengthenCellInfo,一个TArray记录技能树整体信息,需要以下信息: 1.TArray前置技能index 2.FString 描述文本 3.TArray<FMyItemInfo>激活需要的物品ID和…...

Day35:字符串的大小写转换
在 Python 中,字符串的大小写转换是一个常见的操作,它可以帮助我们快速地将字符串中的字母从大写转换为小写,或者从小写转换为大写。Python 提供了多种方法来进行字符串大小写的转换,包括 upper()、lower()、capitalize()、title(…...

喜报丨迪捷软件入选2025年浙江省“重点省专”
根据《浙江省经济和信息化厅 浙江省财政厅关于进一步支持专精特新中小企业高质量发展的通知》(浙经信企业〔2024〕232号)有关要求,经企业自主申报、地方推荐、材料初审以及专家评审等程序,浙江省经济和信息化厅发布了2025年浙江省…...

深度剖析 PyTorch框架:从基础概念到高级应用的深度学习之旅!
目录 一、引言 二、PyTorch 简介 (一)诞生背景与发展历程 (二)核心特点 三、PyTorch 基础概念 (一)张量(Tensor):数据的基石 (二)自动微分&…...

基于C++的DPU医疗领域编程初探
一、大型医院数据处理困境与 DPU 的崛起 在数字化浪潮的席卷下,医疗行业正经历着深刻变革,大型医院作为医疗服务的核心枢纽,积累了海量的数据,涵盖患者的基本信息、诊断记录、检验报告、影像资料等多个维度。这些数据不仅规模庞大,而且增长速度迅猛,传统的中央处理器(C…...

Linux 执行 fdisk -l 出现 GPT PMBR 大小不符 解决方法
目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. 问题所示 执行fdisk -l的时候出现如下提示: [root@VMS-Centos-test1 ~]# fdisk -l GPT PMBR 大小不符(419430399 != 4294967295),将用写入予以更正…...

图漾相机搭配VisionPro使用简易教程
1.下载并安装VisionPro软件 请自行下载VisonPro软件。 VisionPro 9.0 /9.5/9.6版本经测试,可正常打开图漾相机,建议使用图漾测试过的版本。 2.下载PercipioCameraForVisionPro软件包 使用浏览器下载:https://gitee.com/percipioxyz/camport…...

第一届“启航杯”网络安全挑战赛WP
misc PvzHE 去这个文件夹 有一张图片 QHCTF{300cef31-68d9-4b72-b49d-a7802da481a5} QHCTF For Year 2025 攻防世界有一样的 080714212829302316092230 对应Q 以此类推 QHCTF{FUN} 请找出拍摄地所在位置 柳城 顺丰 forensics win01 这个软件 云沙盒分析一下 md5 ad4…...

大模型训练策略与架构优化实践指南
标题:大模型训练策略与架构优化实践指南 文章信息摘要: 该分析全面探讨了大语言模型训练、架构选择、部署维护等关键环节的优化策略。在训练方面,强调了pre-training、mid-training和post-training的不同定位与目标;在架构选择上…...

新电脑安装系统找不到硬盘原因和解决方法来了
有不少网友反馈新电脑采用官方u盘方式装win10或win100出现找不到硬盘是怎么回事?后来研究半天发现是bios中开启了rst(vmd)模式。如果关闭rst模式肯定是可以安装的,但这会影响硬盘性能,有没有办法解决开启rst模式的情况安装win10或win11呢&…...

【Linux】21.基础IO(3)
文章目录 3. 动态库和静态库3.1 静态库与动态库3.2 静态库的制作和使用原理3.3 动态库的制作和使用原理3.3.1 动态库是怎么被加载的 3.4 关于地址 3. 动态库和静态库 3.1 静态库与动态库 静态库(.a):程序在编译链接的时候把库的代码链接到可…...

深度学习算法:从基础到实践
简介 深度学习作为人工智能领域的一个重要分支,近年来在多个领域取得了显著的成就。本文将从基础概念出发,探讨深度学习算法的核心原理,并介绍一些实际应用案例。 深度学习算法的核心概念 深度学习算法基于人工神经网络,通过构…...

27. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表服务
报表是每个记账应用所具备的功能,要实现报表功能就需要把账本的核心功能(记账)完成,因此报表服务作为本专栏第一部分单体应用开发中最后一个要实现的功能,这一篇文章很简单,我们一起来实现一个简单的报表服…...

coffee销售数据集分析:基于时间趋势分析的实操练习
**文章说明:**对coffee销售数据集的简单分析练习(时间趋势分析练习),主要是为了强化利用python进行数据分析的实操能力。属于个人的练习文章。 **注:**这是我第一次使用md格式编辑博客文章,排版上还是不是很…...

【转帖】eclipse-24-09版本后,怎么还原原来版本的搜索功能
【1】原贴地址:eclipse - 怎么还原原来版本的搜索功能_eclipse打开类型搜索类功能失效-CSDN博客 https://blog.csdn.net/sinat_32238399/article/details/145113105 【2】原文如下: 更新eclipse-24-09版本后之后,新的搜索功能(CT…...