class_register
时间:2010-12-31
来源:互联网
__ include/linux/device.h __
/* This is a #define to keep the compiler from merging different
* instances of the __key variable */
#define class_register(class) \
({ \
static struct lock_class_key __key; \
__class_register(class, &__key); \
})
按照注释,定义为 宏 的目的是为了防止为每一个 __key 实例分配一个内存。请问这是如何实现的?
我自己写的小样例似乎并不能实现这样的效果。
/* This is a #define to keep the compiler from merging different
* instances of the __key variable */
#define class_register(class) \
({ \
static struct lock_class_key __key; \
__class_register(class, &__key); \
})
按照注释,定义为 宏 的目的是为了防止为每一个 __key 实例分配一个内存。请问这是如何实现的?
我自己写的小样例似乎并不能实现这样的效果。
作者: linyunxian 发布时间: 2010-12-31
注释的意思是说:“防止编译器将不同的__key实例合并成同一个”吧? 而不是“防止为每一个 __key 实例分配一个内存”……
如果是:
void class_register(class)
{
static struct lock_class_key __key;
__class_register(class, &__key);
}
void A() { class_register(XXX); }
void B() { class_register(XXX); }
那么A和B实际上都使用同一个__key的实例,因为这个__key是在class_register里面申明的。
而如果是define,A和B将使用不同的__key的实例,因为宏展开后,__key分别在A和B里面都申明了。
但是,当然,如果有N个函数都调用了A,那么它们还是共同使用了A里面申明的那个__key的实例。
很绕......
如果是:
void class_register(class)
{
static struct lock_class_key __key;
__class_register(class, &__key);
}
void A() { class_register(XXX); }
void B() { class_register(XXX); }
那么A和B实际上都使用同一个__key的实例,因为这个__key是在class_register里面申明的。
而如果是define,A和B将使用不同的__key的实例,因为宏展开后,__key分别在A和B里面都申明了。
但是,当然,如果有N个函数都调用了A,那么它们还是共同使用了A里面申明的那个__key的实例。
很绕......
作者: kouu 发布时间: 2010-12-31
QUOTE:
注释的意思是说:“防止编译器将不同的__key实例合并成同一个”吧? 而不是“防止为每一个 __key 实例分配一 ...
kouu 发表于 2010-12-31 16:18
kouu 发表于 2010-12-31 16:18
谢谢。是我理解短路了。那这种方法岂不是等阶于 static inline class_register() {...}
作者: linyunxian 发布时间: 2010-12-31
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28