返回信息流基本信息:
B类, 类成员变量含有一个 链表
一直弄不懂啥意思?
这是一条镜像帖。来源:北邮人论坛 / cpp / #91388同步于 2016/4/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
((B *)0)->*node代表啥意思?
hduyu
2016/4/29镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
把0转换成指针,得到的是NULL。然后对NULL来读写,是未定义行为,也就是什么都可能发生,从什么都不发生到机器冒烟都有可能。
但是,很久很久以前,很多人用这种方法来计算一个结构体的某个成员的偏移量。比如,struct SSS {int foo; char bar; double baz;} x; 那么((unsigned char*)(&x->baz) - (unsigned char*)(&x))可以知道x的baz字段距离x的开头的距离。但其实这个距离和对象无关。如果取x=NULL,那么得到的表达式就是((struct SSS*)NULL)->baz。当然,这种用法完全是利用了某些C语言实现上把指针当成地址来翻译,而且把NULL指针翻译成0的结果。C语言其实并不允许这样做。
现代的C语言中,偏移量正确的表达式是offsetof(struct SSS, baz)。
如果结构体里面有一个链表节点,那就更好解释了:所有的结构里的那个链表元素构成一个链表。然后,如果计算了这个链表节点在大结构体中的偏移量,就可以通过链表节点的指针恢复出指向大结构体的指针。Linux内核里经常这样做。
暖神说的基本全了...找一本内核书,都会介绍这个。。。大结构里面包含一个统一的链表节点,这样子用统一的链表操作函数操作统一的链表,然后通过偏移得到真正的数据内容
((B *)0)->*node 第二个*号是啥意思?
【 在 nuanyangyang 的大作中提到: 】
: 把0转换成指针,得到的是NULL。然后对NULL来读写,是未定义行为,也就是什么都可能发生,从什么都不发生到机器冒烟都有可能。
: 但是,很久很久以前,很多人用这种方法来计算一个结构体的某个成员的偏移量。比如,struct SSS {int foo; char bar; double baz;} x; 那么((unsigned char*)(&x->baz) - (unsigned char*)(&x))可以知道x的baz字段距离x的开头的距离。但其实这个距离和对象无关。如果取x=NULL,那么得到的表达式就是((struct SSS*)NULL)->baz。当然,这种用法完全是利用了某些C语言实现上把指针当成地址来翻译,而且把NULL指针翻译成0的结果。C语言其实并不允许这样做。
: 现代的C语言中,偏移量正确的表达式是offsetof(struct SSS, baz)。
【 在 xiaobing307 的大作中提到: 】
: ((B *)0)->*node 第二个*号是啥意思?
指向成员的指针。
摘自http://en.cppreference.com/w/cpp/language/pointer
struct C { int m; };
int main()
{
int C::* p = &C::m; // pointer to data member m of class C
C c = {7};
std::cout << c.*p << '\n'; // prints 7
C* cp = &c;
cp->m = 10;
std::cout << cp->*p << '\n'; // prints 10
}
看着好蛋疼,真的有用么?
struct A
{
int m;
// const pointer to non-const member
int A::* const p;
};
int main()
{
// non-const pointer to data member which is a const pointer to non-const member
int A::* const A::* p1 = &A::p;
const A a = {1, &A::m};
std::cout << a.*(a.*p1) << '\n'; // prints 1
// regular non-const pointer to a const pointer-to-member
int A::* const* p2 = &a.p;
std::cout << a.**p2 << '\n'; // prints 1 这一句应该这样解析? a.*(*p2),看来*的优先级高于.*
}
【 在 nuanyangyang 的大作中提到: 】
:
: 指向成员的指针。
: 摘自http://en.cppreference.com/w/cpp/language/pointer
: ...................
从来没用过。但直觉告诉我它比offsetof安全一些。
【 在 xiaobing307 的大作中提到: 】
: 看着好蛋疼,真的有用么?
: struct A
: ...................
我在用protocol buffer时用到过。
// .proto
message A {
optional int32 x = 1;
optional string y = 2;
}
message B {
optional A f1 = 1;
optional A f2 = 2;
optional A f3 = 3;
}
// .cc
B b;
for (auto* mutable_a : {&B::mutable_f1, &B::mutable_f2, &B::mutable_f3}) {
auto* a = (b.*mutable_a)();
a->set_x(10);
a->set_y("something");
}
【 在 xiaobing307 的大作中提到: 】
: 看着好蛋疼,真的有用么?
: [code=c]
: struct A
: ...................