• Linux内核源码之红黑树


    概要                                                                                                              

    对Linux内核源码的学习,目前阶段也是学习前辈们的总结,站在巨人的肩膀上。

    博客园主skywang12345发布的源码:http://www.cnblogs.com/skywang12345/p/3624202.html

    struct rb_node结构体                                                                                   

    参考CSDN博客:http://blog.csdn.net/cwcmcw/article/details/17174891

    1 struct rb_node  
    2 {  
    3     unsigned long  rb_parent_color;  
    4 #define RB_RED      0  
    5 #define RB_BLACK    1  
    6     struct rb_node *rb_right;  
    7     struct rb_node *rb_left;  
    8 } __attribute__((aligned(sizeof(long))));  

    sizeof(long):返回long类型的字节数n(32位机器n = 4, 64位机器n=8);

    aligned(n):指明结构体n字节对齐;

    __attribute__是GCC编译器的扩展,属性约束;

    这句话的含义:struct rb_node按照4字节(long)对齐!

    对于__attribute__和aligned详细说明和用法可以查阅gcc在线用户手册

    为什么成员变量rb_parent_color既可以表示父节点指针,又可以表示颜色?

    首先,要搞清楚结构体对齐的机制,以 32 位机器举例,structrb_node结构体4字节对齐,那么它在内存中的基地址base一定是的4的倍数(base % 4 == 0);由于指针在32位系统之上占用4B,则32bit基地址base的低两位一定为0(否则“base % 4 == 0”不成立,不再是4B对齐)。

    红黑树节点的颜色只有两个——红(0)和黑(1),使用1bit就足够表示!而struct rb_node结构体基地址低2位“不使用”,那么可以使用最低位来存储节点的颜色,把基地址和颜色值或(|)运算整合成一个变量__rb_parent_color,这样就节省了一个存储颜色的变量。

    如果单独定义一个变量来存储颜色值,假设4B无符号整型(即使是shot或者char类型,在4B对齐状态下也是占用4B)那么当树的节点数量增长时,每增长一个树节点,就会多开销4B!并且存储父节点地址的变量低两位又不使用,4个树节点就浪费1B;记住:核心内存有限,每消耗1B,核心就少1B——不损失性能的情况下,能节约就节约!

  • 相关阅读:
    【LOJ #2290】「THUWC 2017」随机二分图(状压DP)
    【LOJ #2136】「ZJOI2015」地震后的幻想乡(状压DP)
    【CSP-S 2019模拟】题解
    异步编程补漏
    Git(七) 查漏补缺
    ES6(二) let const
    ES6(一) 数组
    JS判断对象是否存在
    Git(六)
    Git(五)
  • 原文地址:https://www.cnblogs.com/wangxiaokun/p/6936899.html
Copyright © 2020-2023  润新知