宏定义踩坑实战:嵌套调用宏定义
问题背景:在刷题的过程中,要使用 min 函数,但是线上 OJ 并没有这个函数。因为一时也想不起它到底属于哪个头文件,所以为了偷懒,顺手就写下了以下宏定义:
|
1 |
#define min(x, y) (x) < (y) ? (x) : (y) |
正常情况下这个宏定义是没有问题的,代码提交错误我也从没怀疑过它有问题。因为我认为自己 ... 阅读更多
问题背景:在刷题的过程中,要使用 min 函数,但是线上 OJ 并没有这个函数。因为一时也想不起它到底属于哪个头文件,所以为了偷懒,顺手就写下了以下宏定义:
|
1 |
#define min(x, y) (x) < (y) ? (x) : (y) |
正常情况下这个宏定义是没有问题的,代码提交错误我也从没怀疑过它有问题。因为我认为自己 ... 阅读更多
刷 OJ 的时候惊喜的发现,我竟然不会给二维数组动态分配内存。写了 n 年的代码了,竟然被这个难倒了!没想到好多年没搞算法,不仅脑袋不灵光了,连基础都丢了。真是自惭形秽! 方法一 先分配指针数组的内存,然后给数组中的每个 int *指针分配内存: [crayon-6954bc180eb06863672268/ ... 阅读更多
做代码优化,发现代码中获取系统 CPU 核数是通过 system 调用命令得到的,想想最近被 system 支配的恐惧,果断改掉。 linux c 中获取 CPU 核数的函数原语有两个:
|
1 2 3 |
#include <sys/sysinfo.h> get_nprocs_conf(); get_nprocs(); |
第二个函数是返回当前可用的 CPU 数量,不可用的意思是 CPU HA ... 阅读更多
epoll 中的触发模式有两种,边缘触发和水平触发,默认情况下使用的是水平触发。 边缘触发 (ET) 的意思是当电平出现变化的时候才触发事件,如果设置了边缘触发,执行 epoll_wait 时,内核检测到数据到达后立马返回到应用层。但是这仅仅只返回这一次,如果缓冲区中的数据没有读取完,再次执行 epoll_wa ... 阅读更多
一、猴子拿苹果问题 逛脉脉时,看到一网友遇到的面试题:有 9 个苹果,2 只猴子。一个猴子每次拿 2 个苹果,一个猴子每次拿 3 个苹果。如果剩余的苹果数量不够猴子拿的数量,则停止拿苹果。请用多线程的方式模拟上面的描述。 看到问题的第一眼,觉得很有趣,脑海中第一个想到的就是通过信号量来实现,因为信号量是最适合做线 ... 阅读更多
共享内存是所有 IPC 通信中效率最高的,它通过把文件映射到用户进程空间,然后直接通过地址访问来实现多进程通信。相对于其他 IPC 通信方式而言,少去了把数据从用户空间复制到内核空间,再从内核空间复制到用户空间的过程,因此效率相当高。 用图形来表示就是: 操作共享内存的函数: [crayon-6954bc1 ... 阅读更多
EAGAIN 和 EWOULDBLOCK 是 linux 环境下的两个错误码,在非阻塞 IO 中经常会碰到,对新手而言,如何处理这两个值非常头疼。如果处理不当,很容易导致程序异常。 EAGAIN 的官方定义: 「Resource temporarily unavailable.」 The call might wo ... 阅读更多