标题:说说你见过哪些拍案叫绝的C代码?
只看楼主
mindfulness
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:27
专家分:110
注 册:2021-5-8
结帖率:100%
已结贴  问题点数:20 回复次数:19 
说说你见过哪些拍案叫绝的C代码?
说说你见过哪些拍案叫绝的C代码,大佬们一起来聊聊。
我先说两个kenrel的秀儿

1. container_of 的实现

这个由元素到结构体的宏真的秀:((type *)0
程序代码:
#define container_of(ptr, type, member) ({              \         
const typeof( ((type *)0)->member ) *__mptr = (ptr);    \         
(type *)( (char *)__mptr - offsetof(type,member) );})

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)


2. wake up events 计数
一个32位数据分上半部16位和下半部16位,用原子操作同时更新
程序代码:
  53 static void split_counters(unsigned int *cnt, unsigned int *inpr)
  54 {
  55         unsigned int comb = atomic_read(&combined_event_count);
  56
  57         *cnt = (comb >> IN_PROGRESS_BITS); //处理完成的
  58         *inpr = comb & MAX_IN_PROGRESS; // 正在处理的
  59 }
     if  active 
  547         cec = atomic_inc_return(&combined_event_count);
       if deactive
  677         cec = atomic_add_return(MAX_IN_PROGRESS, &combined_event_count);
搜索更多相关主题的帖子: type 代码 member unsigned int 
2021-05-20 02:24
mindfulness
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:27
专家分:110
注 册:2021-5-8
得分:0 
这两个运用是linux kernel的代码,对新手来说可能不太能理解,

但是是真真是“怎一个妙字了得”,这代码,简直比A片还让人剌激!

/*
*  Simple love, simple C.
*/
2021-05-20 02:30
mindfulness
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:27
专家分:110
注 册:2021-5-8
得分:0 
没有Cer来分享一下吗?

/*
*  Simple love, simple C.
*/
2021-05-22 06:12
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:20 
重复执行一条语句16次
循环当然是最简单的
也可以考虑
#define CALL(FUNC) (FUNC);(FUNC);
CALL(CALL(CALL(CALL(func()))));

https://zh.
2021-05-22 13:41
mindfulness
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:27
专家分:110
注 册:2021-5-8
得分:0 
回复 4楼 lin5161678

虽然也算是个办法,只是,可读性和可拓展性也太差了些,,

/*
*  Simple love, simple C.
*/
2021-05-23 05:39
mindfulness
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:27
专家分:110
注 册:2021-5-8
得分:0 

罢了,想来是新人多,老人少。
新人又是求助的多,分享的少,
看来咱论坛的技术环境还是有待改善啊。

/*
*  Simple love, simple C.
*/
2021-05-23 07:30
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:0 
回复 2楼 mindfulness
第一个倒是经常用,第二个没看懂你要表达什么。
2021-05-27 16:47
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:0 
unsigned int randSeed;
void srand(unsigned int value)
{
    randSeed = value;
}
int rand()
{
    randSeed = randSeed*0x343fd+0x269ec3;
    return (randSeed>>16) & 0x7fff;
}
stdlib库伪随机数源码,用到了线性同余方法。
2021-05-27 16:55
diycai
Rank: 8Rank: 8
等 级:贵宾
威 望:19
帖 子:147
专家分:895
注 册:2021-5-18
得分:0 
void reverse(unsigned char *src, unsigned int len)
{
    unsigned char *left;
    unsigned char *right;

    left = src;
    right = src + len - 1;

    while (left < right)
    {
        (*left) ^= (*right);
        (*right) ^= (*left);
        (*left) ^= (*right);
        left++;
        right--;
    }
}
字符串反转
2021-05-27 17:00
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
得分:0 
以下是引用diycai在2021-5-27 17:00:39的发言:

void reverse(unsigned char *src, unsigned int len)
{
    unsigned char *left;
    unsigned char *right;

    left = src;
    right = src + len - 1;

    while (left < right)
    {
        (*left) ^= (*right);
        (*right) ^= (*left);
        (*left) ^= (*right);
        left++;
        right--;
    }
}
字符串反转

^异或交换是非常糟糕的做法 没有任何优点
可读性 没有优势
运行效率低于 第三变量交换

https://zh.
2021-05-28 09:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-505786-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.060075 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved