+ -
当前位置:首页 → 问答吧 → class_register

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 实例分配一个内存。请问这是如何实现的?
我自己写的小样例似乎并不能实现这样的效果。

作者: 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的实例。

很绕......

作者: kouu   发布时间: 2010-12-31



QUOTE:
注释的意思是说:“防止编译器将不同的__key实例合并成同一个”吧? 而不是“防止为每一个 __key 实例分配一 ...
kouu 发表于 2010-12-31 16:18




    谢谢。是我理解短路了。那这种方法岂不是等阶于 static inline class_register() {...}

作者: linyunxian   发布时间: 2010-12-31

热门下载

更多