背景: sleep函数会将进程投入睡眠, 直到被时钟中断唤醒. 而”睡眠”这个状态含义是进程不在CPU上运行, 并不是 CPU 投入”睡眠”, 当时钟中断到来时经过进程调度重新将 CPU 让给之前睡眠的进程

那么问题就来了, 如果一个系统中每个进程都主动或者被动进入睡眠状态, 比如10个进程都[……]

阅读全文

一. 最近邻插值

这是最简单的插值办法, 为了方便描述, 先考虑一维的情况:

最近邻插值将连续坐标x近似为最近的整数u0, 输出值g_out(x) = g_in(u0) , 其中u0 = round(x)

假设给定一个输入 123, 60, 255 长度为3, 那么每个点对应的坐标分别是0, 1[……]

阅读全文

一. 首先看看默认情况下是如何对齐

IA32:

无论数据是否对齐, IA32硬件都能正确工作, 不过, Intel还是建议要求对齐数据以提高存储器系统的性能. Linux沿用的对齐策略是, 2字节数据类型 (例如 short) 的地址必须是2的倍数, 而较大的数据类型 (例如 int, int *[……]

阅读全文

曾经一直好奇c编译器如何做的类型转换, 最近研究了几天, 有了个大概的了解, 这里做个总结:

一.整型间转换

整型间的转换比较简单, 如果字长变化, 只需进行扩展或者截断

这方面gcc和msvc编译器做法大同小异, 就不分开讨论了, 就以gcc为例

1. 扩展:

比如int8到int32的扩展,[……]

阅读全文

前段时间看了下glibc的一些string库函数实现

自己照猫画虎的写了几个函数测了测, 比起windows vc中自带的实现, 并没有更快, 反倒是慢了很多.

比如memset函数, 微软公开的vc crt中memset.c是以字节为单位循环的.  如果用glibc中操作块与循环展开[……]

阅读全文

近来打算阅读glibc源码, 便从最简单的string.h开始. 说道string库, 第一个想到的是什么函数? 当然是strlen

于是翻开strlen.c , 大牛写的代码就是不一样, 总像是故意把原本简单的东西写得复杂, 仔细阅读才发现简直是神作.

对任何c程序员来说以下代码可以说是信手拈[……]

阅读全文

这个问题一开始源于用vc编译一个utf8文件, 遇到了错误error C2001: 常量中有换行符

原本是个mingw下写的程序, gcc编译时没问题的, 后来网上搜了下, 说是因为vc对无bom的utf8文件支持不太好, 得加上bom才能正常编译
在vc上面测试以下代码

#include &lt[......]

阅读全文

我们可以定义一些最基本的计算,比如加减乘除、移位等,然后通过对基本计算进行高阶组合,形成更复杂的计算,比如幂、开方、阶乘等等

而计算机中除了基本的计算,还有基本的控制指令,比如循环、判断、递归、函数调用等

当具备这些特性后,我们就可以用他们进行组合,模拟出一个高阶的机器

比如我们可[……]

阅读全文

有时会需要测试一个函数的运行时间, 用标准库的时间函数精度不够, 打印出来的运行时间是0.00000…
用循环来放大这个时间一般不会有问题的
但是如果多个算法之间时间开销差别很大, 比如函数aa()运行一次的时间是1.0s, 而函数bb()运行时间是0.000000s, 这时候再对他们用循环10[……]

阅读全文