- 博客(12)
- 收藏
- 关注
原创 内存对齐规则
第二个成员是char类型,它与有效对齐值4相比,char是较小的,偏移量是char的整数倍(char的size是1,即1的整数倍),只需要把前面int类型偏移出来就行。因此,目前总大小为5。L2中,第二个成员的偏移量是int,4的倍数,所以要填充3个字节+1个char,第三个成员的偏移量是char,1的倍数,要偏移出 填充3个字节 + 1个char + 1个int 一共8字节。3)结构体总大小是有效对其值的整数倍,因此L1的大小需要是4的倍数,6不是4的倍数,所以要补充2个字节,总大小为8字节。
2026-03-17 11:50:49
179
原创 小端、大端、网络字节顺序、主机字节顺序
当CPU处理的数据的能力大于8位的时候,如16位、32位、64位的CPU处理器,由于寄存器宽度大于一个字节,那么必然存在一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式的出现。上图是小端、大端的实际存储情况,,具体分析如下。
2026-03-17 11:32:05
391
原创 Linux内核container_of宏
_same_type、offsetof、container_of 不在一个文件,分别在 linux-6.1.83/include/linux/compiler_types.h、linux-6.1.83/include/linux/stddef.h、linux-6.1.83/include/linux/container_of.h 中,下面详细介绍。
2026-03-16 12:32:43
454
原创 学习栈回溯原理
能直接处理 64 位的整数和内存地址。栈向下生长,入栈操作rsp的数值要减少,出栈rsp的数值要增加。当前rbp的值是16,rbp+8=24,这个24是头指针,* (24)也就是*(rbp+8) 是从头指针8字节取数据,取的数据就是24到32之间的返回地址。使用*(rbp)取的就是从16到24的数据,就是旧 RBP(上层函数的RBP)。找到存调用者的RBP寄存器(上层函数的),就可以找到返回地址,确定返回地址在哪个函数的范围,查找符号表确定这个函数符号,以此继续的向上找RBP、返回地址确定全部的调用关系。
2026-03-15 22:24:24
360
原创 学习ftrace
ftrace(Function Tracer)是 Linux 内核内置的一套轻量级、高性能的跟踪(tracing)框架,用于动态监控内核函数调用、事件流、延迟分析等。
2026-02-02 22:44:04
580
原创 学习perf
perf(默认时间源)、clock_gettime(CLOCK_MONOTONIC(单调递增))、/proc/uptime,它们都是开机到但在系统运行的单调递增时间,它抛去精度它们的功能是一样的(都是秒单位,但是小数点位数不同,perf是6位,uptime是2位)。使用这命令安装后还是报下面的错误,发现还有其他的版本6.8.0,应该是6.14.0的内核中没有perf,查看/usr/bin/perf应该是空的,要删除/usr/bin/perf,在重新创建软连接,如下。函数调用栈(后续多行)
2026-02-01 23:58:45
766
原创 Lambda 表达式实现原理分析
本文从实现原理的角度解析了C++中Lambda表达式的内部机制。Lambda表达式本质上是编译器生成的匿名类(closure class),该类重载了operator()方法以实现表达式的调用。同时,编译器会创建一个匿名结构体来捕获环境变量,并将其存储为结构体的成员变量。
2025-05-18 23:55:58
765
原创 文件I/O中的缓存机制
操作系统和文件系统在处理文件 I/O 时通常会使用缓存来提高性能,而程序员也可以通过一些机制(例如 fflush 或 文件模式)控制缓存行为。这些缓存机制,主要也是分为在用户态下的标准库缓冲区、内核态下的页缓存、磁盘本身的硬件缓存这三部分。数据从用户态缓冲区到磁盘的完整路径是:用户态缓冲区 → 内核缓冲区(页缓存) → 磁盘(不考虑mmap的情况)。
2025-05-05 19:59:51
1246
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅