inline;strlen&sizeof

inline:

C++关键字,在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数。关键字inline必须与函数定义放在一起才能使函数成为内联,仅仅将inline放在函数声明前面不起任何作用。inline是一种"用于实现的关键字",而不是一种"用于声明的关键字"。一般的,用户可以阅读函数的声明,但是看不到函数的定义。

C&C++inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义

表达式形式的宏定义一例:

#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))

 C++中引入了类及类的访问控制,这样,如果一个操作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)inline 推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。

Strlen&sizeof:

strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')

sizeof是运算符,可用于任何变量名、类型名或常量值,当用于变量名(不是数组)或常量时,它不需要用圆括号。它在编译时起作用,而不是运行时。

二者区别

⒈sizeof操作符的结果类型是size_t,它在头文件中typedefunsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。

⒉sizeof是取字节运算符(关键字)strlen是函数。

⒊sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。sizeof还可以用函数做参数,比如:

short f();

printf("%d\n",sizeof(f()));

输出的结果是sizeof(short),即2

数组做sizeof的参数不退化,传递给strlen就退化为指针了。

大部分编译程序 在编译的时候就把sizeof计算过了是类型或是变量的长度。这就是sizeof(x)可以用来定义数组维数的原因

char str[20]="0123456789";

long a=strlen(str); //a=10;

int b=sizeof(str); //b=20;

6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。

7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。

当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 归还全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸

在Linux内核中,`hlist_head` 和 `hlist_node` 结构常用于实现哈希链表的查找。这里提供一个简化版的示例,假设我们有一个简单的哈希表结构 `MyHashTable` 和相关的节点结构 `MyHashNode`,它们使用 `hlist_node` 来存储数据: ```c #include <linux/list.h> // 哈希节点结构 typedef struct MyHashNode { char key; // 这里假设key是我们哈希的关键字 struct hlist_node node; } MyHashNode; // 哈希表结构 typedef struct MyHashTable { size_t size; // 哈希表大小 struct hlist_head *buckets; // 每个桶是一个hlist_head } MyHashTable; // 初始化哈希表 void my_hash_table_init(MyHashTable *table, size_t size) { table->size = size; table->buckets = kcalloc(size, sizeof(struct hlist_head), GFP_KERNEL); if (!table->buckets) panic("Failed to allocate memory for buckets"); } // 计算键值的哈希索引 static inline int hash_key(const char *key, size_t size) { return (unsigned long)key % table->size; } // 插入节点到哈希表 void my_hash_table_insert(MyHashTable *table, const char *key, void *data) { MyHashNode *node = kmalloc(sizeof(MyHashNode), GFP_KERNEL); if (!node) return; node->key = *key; // 将数据复制到节点 memcpy(&node->data, data, sizeof(void*)); // 假设数据是void* int index = hash_key(key, strlen(key)); hlist_add_tail(&node->node, &table->buckets[index]); } // 查找节点(在这里只是一个基本的例子,实际查找需要遍历链表) void *my_hash_table_search(MyHashTable *table, const char *key) { int index = hash_key(key, strlen(key)); struct hlist_node *node = table->buckets[index].first; while (node) { MyHashNode *hash_node = container_of(node, MyHashNode, node); if (hash_node->key == *key) { return hash_node->data; // 如果找到匹配,返回数据 } node = node->next; } return NULL; // 没有找到匹配 } // 示例用法 void main() { MyHashTable table; my_hash_table_init(&table, 10); // 插入一些项 my_hash_table_insert(&table, "A", (void*)0x123); my_hash_table_insert(&table, "B", (void*)0x456); // 查找并打印结果 void *found_data = my_hash_table_search(&table, "A"); if (found_data) { printk(KERN_INFO "Found key 'A': 0x%p\n", found_data); } else { printk(KERN_INFO "Key 'A' not found.\n"); } } ``` 注意这仅是一个简化的示例,实际应用中可能需要处理更多的边界情况和错误处理。此外,`hlist_head` 的操作通常在中断上下文中不是安全的,因此在实际的内核代码中可能会有所调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值