- 博客(57)
- 资源 (1)
- 收藏
- 关注
原创 矩阵相乘_重排序(reordering)算法的C++实现
矩阵在内存中存储的时候是按行存的,cache在读取的时候,也是按行取的(下面的代码可以证明)。如果按照正常算法执行矩阵相乘,依次计算新矩阵每个位置的结果,用第一个矩阵的行去乘第二个矩阵的列,然后累加求和,那第二个矩阵每次运算都跨行了,这涉及到3层循环,第1层表示行,第2层表示列,第3层表示累加。如果能设计一个算法,让第3层循环的不要跨行,而是一直在执行某一行的计算,该行的所有元素都取完了再去执行下一行,那就可以避免cache-miss了。
2024-10-26 19:53:42
466
原创 cache miss问题C++示例
第二层是高速缓存,或者简称为缓存,它本来是属于主存的一部分,但是它在架构上离CPU更近一些,其每行有64字节数据,称为“高速缓存行”。我的云桌面的主存就是12G的(本书是2017年及以前更新和编写的,那时的容量可能就只有1-8G),主存里存的东西都是暂时的,当电脑关机后,就丢失了。当步长是16时,共有4M,就算运行这些指令不需要花时间,那也才比步长为2的快了16ms,但是程序的整体运行时间是300ms+,由此说明,存取数据的时间比指令运行时间长得多,二者不是一个数量级的。和我们的想象很不一样,why?
2024-09-10 20:46:17
1090
原创 函数指针C++示例
第一部分是一个函数指针int (*fun)(int),,这其中有2个int,第一个int表示它对外显示的就是一个整形的数,第二个int表示它有一个输入,且输入也要是整形,而fun是函数名称,它只是一个形参,不用太在意。(注:int (*fun(int))的写法是错误的,因为只有函数名称是函数指针,而int仅仅代表它接收的参数类型,并不是指针的一部分。这个链接http://c.biancheng.net/view/228.html可以好好学习一下。第二部分是int b,没啥好说的。
2024-09-10 19:26:54
383
原创 std::vector的reserve(), resize()和shrink_to_fit()
std::vector 是 C++ 标准库中的动态数组类型,提供了多种调整其大小的接口函数。以上就是 std::vector 主要的调整大小接口函数,它们提供了足够的灵活性来适应不同的数据管理需求。
2024-08-26 20:57:29
293
原创 将一串数字拆分成几个递增的连续数字
Split a string to a list of integers and the integers must be incrementally increased.
2024-08-22 02:23:32
276
原创 使用vs code生成UUID保护宏
点开这个插件的详情页,在“细节”一栏有动态图教你如何使用它生成保护宏(动态图加载比较慢)。(如果原来有宏保护,也直接输入这个指令,可以将原来的替换掉,而不用先删除之前的)此时新建一个a.h文件,就可以看到自动生成头文件保护宏了。
2024-08-21 17:11:03
268
转载 零拷贝详解
零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储(比如从网络设备到用户程序空间)的技术。通过减少数据拷贝次数,减少系统调用和上下文切换,实现CPU的零参与,彻底消除 CPU在这方面的负载。
2024-05-25 11:01:06
104
原创 typedef和#define的区别
unsigned YourInt c的写法不行,是因为编译器读到unsigned后,先将unsigned看作一个类型了(和unsigned int同义),再编译到YourInt时,将它处理为int,此时就变成unsigned int int,所以报错。三、使用#define定义指针时,容易犯“就近原则”的错误,但typedef不会。一、typedef一般用来给类型取别名(type即类型)。说明a, c, d是指针,而b不是。阶段直接进行,而typedef是。二、#define是。
2024-05-18 17:20:15
288
原创 把M个同样的宝石放在N个同样的盘子_C++实现
把M个同样的宝石放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(其中1,5,1和5,1,1代表同一种方法),用C++实现。注意最后是输出n行字符,不是算出来有几种分法。
2024-04-14 18:30:51
241
原创 如何用C++判断一个系统是16位、32位还是64位?
如何用C++判断一个系统是16位、32位还是64位?方法一:使用指针的sizeof()判断。方法二:使用预定义宏来判断(同时能判断出是intel还是arm)。方法三:使用整数溢出来判断。
2024-04-10 10:35:45
810
原创 用O(1)时间复杂度实现bitset()函数
注:1ULL 的含义是将整数1显式地标记为 64 位的无符号 long long 类型。这样做是为了确保该整数字面量被作为 64 位无符号整数来处理。这些写法可以用于显式指定整数字面量的数据类型,以确保在进行表达式计算时使用指定的数据类型。
2024-04-05 16:09:59
313
原创 static_cast, dynamic_cast, const_cast, reinterpret_cast和C风格转换(如(int)x)的用法详解
本文对比了几个类型转换函数
2024-03-28 17:21:32
639
原创 基于Linux内核的共享内存C语言示例
本篇文章用C语言完成这样一个功能:创建一块共享内存,然后开辟2个进程。用户在后台控制父进程,输入字符串,父进程会往共享内存里写这段内容。子进程每秒钟去读一次共享内存的内容,然后将读到的内容打印出来。全篇使用C语言完成。
2024-03-17 18:12:29
482
原创 使用fork()创建子进程示例
这就像是:bash进程是爷爷,程序的主进程是父亲,子进程是儿子。父亲“挂”了后,爷爷给父亲收尸。爷爷不管儿子,所以儿子进了孤儿院~但是子进程没有结束。会继续输出,但是此时它已经没有父进程了,所以它结束后不会再交给bash接管,也就不会出现。父进程在输出3次“parent process”就结束了,交给了bash进程接管。
2024-03-11 19:12:53
465
原创 实现一个栈,使得出栈、入栈、获取最大值的时间复杂度为O(1)
思路:用2个栈,其中一个叫数据栈,用来做入栈、出栈操作。第二个叫最大值栈,用来返回最大值。
2024-03-08 01:11:26
556
原创 一副扑克牌一共54张,平均分成2份,求这2份都有2张A的概率。
这是一道高中数学题,此处介绍2个解法,第1个是我喜欢用的快速解法,第2个是公式解法。
2024-02-04 00:13:57
1085
1
原创 RAII: autoMsg在带union时使用placement new的实现
实现了一个简单的AutoMsg在带union时使用placement new的情况
2024-01-30 11:31:47
408
原创 比较两个版本号 version1 和 version2
如果 version1 > version2 返回 1,如果 version1 < version2 返回 -1, 除此之外返回 0。你可以假设版本字符串非空,并且只包含数字和 . 字符。 . 字符不代表小数点,而是用于分隔数字序列。
2024-01-20 18:02:50
1044
FizzBuzzWhizz的2个版本在win10上使用gtest测试框架的实现
2023-01-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人