C语言小知识收集

#define min(x,y) ({ \

typeof(x) _x = (x);    \

typeof(y) _y = (y);    \

(void) (&_x == &_y);    \ // 为了当x,y 是表达式的时候,编译报错如i++,j++; 或者是 x y 不是同一个类型                                        的时候,不同的指针比较编译警告。

_x < _y ? _x : _y; })

// android binder

struct binder_buffer {

struct list_head entry; /* free and allocated entries by address */

struct rb_node rb_node; /* free entry by size or allocated entry */

/* by address */

unsigned free:1;

unsigned allow_user_free:1;

unsigned async_transaction:1;

unsigned debug_id:29;

struct binder_transaction *transaction;

#ifdef BINDER_MONITOR

struct binder_transaction_log_entry *log_entry;

#endif

struct binder_node *target_node;

size_t data_size;

size_t offsets_size;

uint8_t data[0]; // 获得一个内存地址标记并可以节省不必要的存储空间

};

buffer = rb_entry(n, struct binder_buffer, rb_node);

tmp_size = binder_buffer_size(target_proc, buffer);// 计算 buffer 的容量大小。由于内存是线性增长分配的,并且在entry 中按地址排列,所以 由 下一个buffer 的地址- 这个buffer的data 就是 当前buffer大小。

static size_t binder_buffer_size(struct binder_proc *proc,

struct binder_buffer *buffer)

{

if (list_is_last(&buffer->entry, &proc->buffers))

//proc->buffer_size =   vma->vm_end - vma->vm_start

return proc->buffer + proc->buffer_size - (void *)buffer->data;

else

return (size_t)list_entry(buffer->entry.next,

struct binder_buffer, entry) - (size_t)buffer->data;

}

// 位域,不是所有的编译器都支持这种用法,对于有些编译器一个位域不能跨字节,不够的话,从下个字节开始。

struct   _a

{

int   a:1

int     :2                     /*该2位不能使用*/

int   b:3

int   c:2

};

struct   _b

{

unsigned   a:4

unsigned   :0                 /*空域*/

unsigned   b:4               /*从下一单元开始存放*/

unsigned   c:4

}

// 红黑树的实现,红黑树通过着色保持到NULL 节点最长的路径最多是最短的路径两倍。以达到普通二叉树与平衡二叉树的折中选择。

着色只有红黑两种,可以用一位,来表示;tree_node 的三要素 parent ,child_left, child_right ,可以肯定

每个节点都有唯一的parent;看下面的 struct rb_node 是 (aligned(sizeof(long))) 对齐的;这样指向 parent node 的地址parent 两位最低权值的bit 位为00是确定的,没有有效的信息熵,可以用来承载rb_node 的color 信息。所以__rb_parent_color才会有下面 rb_parent 宏 ,以及rb_set_parent ,rb_set_parent_color 函数。

struct rb_node {

unsigned long  __rb_parent_color;

struct rb_node *rb_right;

struct rb_node *rb_left;

} __attribute__((aligned(sizeof(long))));

#define rb_parent(r)   ((struct rb_node *)((r)->__rb_parent_color & ~3)

struct rb_root {

struct rb_node *rb_node;

};

static inline void rb_set_parent(struct rb_node *rb, struct rb_node *p)

{

rb->__rb_parent_color = rb_color(rb) | (unsigned long)p;

}

static inline void rb_set_parent_color(struct rb_node *rb,

struct rb_node *p, int color)

{

rb->__rb_parent_color = (unsigned long)p | color;

}

时间: 2024-10-28 06:59:14

C语言小知识收集的相关文章

C语言小知识

1C语言不允许嵌套注释,如不允许/* /* / / 的嵌套注释,因为第三个注释符将会与第一个注释符匹配形成注释,而第四个注释符将会被看成可执行程序的一部分,这时会报错. 2.为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 sizeof 运算符.表达式 sizeof(type) 得到对象或类型的存储字节大小.列如,sizeof(int)得到int类型所占字节数 基本类型书写 整数 1.默认为10进制 ,10 ,20. 2.八进制以0开头,036,026. 3.2进制以0b开头,0b1

关于C语言中的一些宏的小知识

关于C语言中的一些宏的小知识 1.##和# c语言中,##表示把两个宏参数贴合在一起,即,#define call(x,y) x##y ,执行call(x,y)结果为xy,例如,int x=2,y=5;int xy=90;printf("%d\n",call(x,y));//结果为90 ##被称为连接符,用来将两个宏参数连接为一个宏参数.而单个#的功能是将其后面的宏参数进行字符串化操作,简单地说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号,使其成为字符串. 以上引自百度知

拿不到想要的offer,只缘身在CV中,关于一些面试小知识

在平时我们面试的过程总总会遇到一些面试官问一些平时我们不怎么注意的问题,当问出来的时候,面试者通常都是一脸懵逼,这和我想象中的不一样阿,怎么不按照套路出牌,当然一些小知识更能体现出你的细心和好学,以下分析20个面试中的小知识,共勉~.·整理的这份PDF有从基础到进阶.含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有.还有辅之相关的视频+学习笔记 (更多完整项目下载.未

C语言小游戏设计报告

课程设计名称:贪吃蛇小游戏 专业班级:计科15-2 学号:150809229 姓名:XXX 一.设计目标 通过设计,培养学生对电脑的动手能力,使学生巩固<C语言程序设计>课程学习的内容,掌握编写程序的基本方法,强化对其的动手能力,可以独自完成程序的编写. 二.设计内容和要求 设计内容 编写贪吃蛇的小游戏,使其可以成功运行并且操作玩耍. 设计要求 1)源程序要有适当的注释,使程序便于阅读. 2)要有程序运行结果作为依据 三.程序流程 1.编写地图 运用函数,数组编写地图 2.相同的方法把蛇添加进

Java的一些基础小知识之JVM与GC (转)

一.JVM是什么 Java虚拟机(英语:Java Virtual Machine,缩写为JVM),又名爪哇虚拟器,一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做.最早由太阳微系统所研发并实现第一个实现版本,是Java平台的一部份,能够运行以Java语言写作的软件程序. Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多

Linux 小知识翻译 - 「编译器和解释器」

这次聊聊「编译器和解释器」. 编程语言中,有以C为代表的编译型语言和以Perl为代表的解释型语言.不管是哪种,程序都是以人类能够理解的形式记录的,这种形式计算机是无法理解的. 因此,才会有编译器和解释器. 对于编译型语言,是使用编译器将人类可读的代码转换为机器能够理解的「机器语言」文件,然后通过执行这个「机器语言」文件来实现程序的执行. 另一方面,对于解释型语言,是使用解释器将人类可读的代码逐行解释,一边解释一边执行这个程序.(这里的解释是将代码解释成机器语言,让计算机能够理解) 甚至有的语言既

网络知识收集

最近学习Ravello虚拟化,遇到一些和网络相关的知识,收集后整理如下: L2其实是指七层网络协议中的第二层数据链路层,它的传输是以mac地址为基础 L3指网络层:是以ip地址为基础网络层属于OSI中的较高层次了,从它的名字可以看出,它解决的是网络与网络之间,即网际的通信问题,而不是同一网段内部的事.网络层的主要功能即是提供路由,即选择到达目标主机的最佳路径,并沿该路径传送数据包.除此之外,网络层还要能够消除网络拥挤,具有流量控制和拥挤控制的能力. 个人总结:数据链路层数据传输在寻找mac地址,

你不一定知道的几个前端小知识

1 大家都知道js在进行小数运算时会有丢失精度问题(其他语言也是),比如: 0.1+0.2 //0.30000000000000004 有一种比较快捷的方式是先把小数乘以10的整数倍,然后再运算,如: (0.1*10+0.2*10)/10 //0.3 但是这种方式也不是100%准确的,乘以整百也可能精度丢失,比如: 2177.74*100 //217773.99999999997 所以常用的几种处理方式有: 把小数转化为字符串,拆分整数部分和小数部分分别计算,然后再把结果进行拼接; 先乘10的整

学习笔记:Java的一些基础小知识之JVM与GC

一.JVM是什么 Java虚拟机(英语:Java Virtual Machine,缩写为JVM),又名爪哇虚拟器,一种能够运行Java bytecode的虚拟机,以堆栈结构机器来进行实做.最早由太阳微系统所研发并实现第一个实现版本,是Java平台的一部份,能够运行以Java语言写作的软件程序. Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多