6.Type and Member Basics】的更多相关文章

1. Different Kinds  of Type Members        A type can define zero or more of the following kinds of members:        Constants           A constant is a symbol that identifies a never-changing data value        Fields           A field represents a re…
1.The Different Kinds of Type Members 1.Constants:a symbol that identifies a never-changing data value.Constants are always associated with a type, not an instance of a type. Logically, constants are always static members 2.Fields:represents a read-o…
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)宏的运行机理:1. ( (TYPE *)0 ) 将零转型为TYPE类型指针; 2. ((TYPE *)0)->MEMBER 访问结构中的数据成员; 3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址; 4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型.巧妙之处在于将0转 换成(TY…
前言 本文讲解typeof( ((type *)0)->member )的含义,并在此基础上学习offset_of()的用法.typeof( ((type *)0)->member ) ANSI C标准允许值为0的常量被强制转换成任何一种类型的指针,并且转换的结果是个NULL,因此((type *)0)的结果就是一个类型为type *的NULL指针. 如果利用这个NULL指针来访问type的成员当然是非法的,但typeof( ((type *)0)->member )是想取该成员的类型(…
#include <iostream> #define IOFFSETOF(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) using namespace std; int main(){ struct Demo{ char sex; int id; }; cout << "IOFFSETOF(Demo, sex): " << IOFFSETOF(Demo, sex) << end…
#include <iostream> #include <cmath> #include <sstream> using namespace std; class aa; class bb; class root { public: virtual ~root() {} virtual root add(const aa& a) const=0; virtual root add(const bb& a) const=0; }; class aa: p…
平常写代码,类中最长用到的字段,属性,方法.虽然经常用属性,但是对属性的认知只是停留在{get;set;}上,也知道可以逻辑判断,只读什么的,没有深入研究: 此篇随笔用来做做属性的文章,加深下认知,文中有讲的不对的地方,还肯请各位批评指正. Properties:A property is a mechanism that allows a simple, field-like syntax for setting or querying part of the logical state of…
 container_of(ptr,type,member) 用于在已知结构体里面成员member和该成员指针ptr(就是地址)和结构体类型type, 返回该成员所在的结构体的指针(就是地址), 例如已知 struct student a { char *name; int age; } int *page = &age; container_of(page, struct student, a.age); 返回a的地址 实现该方法可以分三步:0 算出a.age在a里面的偏移,可以通过将零地址强…
如何根据一个结构体成员的地址.结构体类型以及该结构体成员名获得该结构体的首地址? #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 其中,ptr为指向该结构体成员的指针,type为该结构的类型,member为该结构成员的名称. 理解:   &((type *)0)->member的目的是为了获得上图中问号表示的范围的大小.…
Cadence关于UVM的简单介绍,包括UVM的各个方面.有中文和英文两种版本. UVM SV Basics 1 – Introduction UVM SV Basics 2 – DUT Example UVM SV Basics 3 – UVM Environment UVM SV Basics 4 – Interface UVC UVM SV Basics 5 – Collector UVM SV Basics 6 – Monitor UVM SV Basics 7 – Sequence I…
Linux内核大量使用面向对象的设计思想,通过追踪源码,我们甚至可以使用面向对象语言常用的UML类图来分析Linux设备管理的"类"之间的关系.这里以4.8.5内核为例从kobject,kset,ktype的分析入手,进而一探内核对于设备的管理方式 container_of宏 这个宏几乎是linux数据结构的基础,Linux中的链表与传统的链表不同,其链表的节点本身并不包含任何数据,任何想要插入到链表的数据只需要包含一个事先写好的节点 //include/linux/types.h 1…
1.结构体变量中的元素如何访问? (1)数组中元素的访问方式:表面上有2种方式(数组下标方式和指针方式):实质上都是指针方式访问.(2)结构体变量中的元素访问方式:只有一种,用.或者->的方式来访问.(.和->访问结构体元素其实质是一样的,只是C语言规定用结构体变量来访问元素用. 用结构体变量的指针来访问元素用->.实际上在高级语言中已经不区分了,都用.)(3)结构体的访问方式有点类似于数组下标的方式 2.利用指针访问结构体元素 结构体元素地址=结构体首地址+元素偏移量 struct m…
linux内核中offsetof与container_of的宏定义 #define offsetof(TYPE, MEMBER)    ((size_t) &((TYPE *)0)->MEMBER) /** * container_of - cast a member of a structure out to the containing structure * @ptr:        the pointer to the member. * @type:       the type…
时隔 15.6 个月,终于发布了一个新版本 v1.1.0. 新版本除了包含了这些日子收集到的无数的小改进及 bug fixes,也有一些新功能.本文尝试从使用者的角度,简单介绍一下这些功能和沿由. Photo by Ian Schneider JSON Pointer 也许 RapidJSON 一直最为人垢病的地方,是它奇怪的 API 设计.例如,对 DOM 加添数据要给于 allocator 参数: #include "rapidjson/document.h" using name…
Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为广泛的数据结构,具体你可以 查看 这里.首先让我们看一下主要的结构体:    struct list_head {    struct list_head *next, *prev;    };你可以看到其与常见的结构体实现有显著不同,比如 glib 中所使用到的双向链表实现.    struct…
Linux 内核提供一套双向链表的实现,你可以在 include/linux/list.h 中找到.我们以双向链表着手开始介绍 Linux 内核中的数据结构 ,因为这个是在 Linux 内核中使用最为广泛的数据结构,具体你可以 查看 这里. 首先让我们看一下主要的结构体: struct list_head { struct list_head *next, *prev; }; 你可以看到其与常见的结构体实现有显著不同,比如 glib 中所使用到的双向链表实现. struct GList { gp…
5,数组指针的不同含义 int a[5][10]; printf(%d, %d, %d\n", a, a+1, &a+1);  //1310392,1310432,1310592 a和&a都是数组a[5][10]的首地址. a 是 int a[10]的类型,而 &a 则是 a[5][10]的类型.指针运算中的"1"代表的是指针类型的长度.所以 a + 1 和 &a + 1 中的1代表的长度分别为 a 的类型 a[10]即 sizeof(int)…
关于这个话题,其实在(六)里面已经讨论了一半了.学过Haskell的都知道,这个世界上很多东西都可以用monad和comonad来把一些复杂的代码给抽象成简单的.一看就懂的形式.他们的区别,就像用js做一个复杂的带着几层循环的动画,直接写出来和用jquery的"回调"写出来的代码一样.前者能看不能用,后者能用不能看.那有没有什么又能用又能看的呢?我目前只能在Haskell.C#和F#里面看到.至于说为什么,当然是因为他们都支持了monad和comonad.只不过C#作为一门不把&quo…
1.<c> <c>text</c> 其中: text 希望将其指示为代码的文本. 备注 <c> 标记为您提供了一种将说明中的文本标记为代码的方法.使用 <code> 将多行指示为代码. 使用 /doc 进行编译可以将文档注释处理到文件中. 示例 // xml_c_tag.cs // compile with: /doc:xml_c_tag.xml /// text for class MyClass public class MyClass {…
为什么说这个链表做的经典呢,哥哥我从Linux内核里边儿扣出来的,要么怎么说内核不是一般人能写的,这代码太TM优美了! 这里有一篇参考文章:http://isis.poly.edu/kulesh/stuff/src/klist/,下面的分析来自其他人的分析这里做了整理,使得它便于阅读. 在linux内核中,有大量的数据结构需要用到双循环链表,例如进程.文件.模块.页面等.若采用双循环链表的传统实现方式,需要为这些数据结构维护各自的链表,并且为每个链表都要设计插入.删除等操作函数.因为用来维持链表…
iOS分类.延展和子类的区别 类别.延展.子类的区别   类别 延展 子类 功能 为类添加方法,不用知道类的源码,添加变量(通过运行时,具体参考下面注解) 为类添加私有变量和私有方法,在类的源文件中书写,所以知道类的源代码 即能为类添加方法又能添加变量 特点 添加的方法称为类的一部分,可以被子类继承 添加的变量和方法只有这个类内部访问,正常情况下外边不能访问(可以通过运行时,见注解),不能被子类继承 新添加的变量和方法只能子类才能具有,父类不具有 使用 使用原始类的对象(调用-方法)或者类(调用…
  OpenFileDialog obj = new OpenFileDialog(); if (obj.ShowDialog() == System.Windows.Forms.DialogResult.OK) { Assembly ass = Assembly.LoadFrom(obj.FileName); foreach(var type in ass.GetTypes()) { MethodInfo[] members = type.GetMethods(BindingFlags.Pub…
Linq的排序一般是这样写的: query.OrderBy(x => x.Tel).Skip().Take(); 实际使用中排序字段可能是通过字符类型的参数来设置的,于是想这样实现: query.OrderBy(x=>x.GetType().GetField().Take(); 上面的写法是无法编译通过的,此路不通,于是找到一个order扩展类: using System; using System.Linq; using System.Linq.Expressions; using Syst…
本文转载自:http://blog.csdn.net/coding__madman/article/details/51325646 链表简介: 链表是一种常用的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或者删除数据.链表的开销主要是访问的顺序性和组织链的空间损失. 内核链表的好主要体现为两点,1是可扩展性,2是封装.可扩展性肯定是必须的,内核一直都是在发展中的,所…
struct内存对齐:gcc与VC的差别 内存对齐是编译器为了便于CPU快速访问而采用的一项技术,对于不同的编译器有不同的处理方法. Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T的大小,即sizeof(T).比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始.Linux下的GCC奉行的是另外一套规则:任何2字节大小的数据类型(比如short)的对齐模数是2,而其它所有…
#include <stdio.h> #include <stdlib.h> #include <string.h> struct list_head { struct list_head *next, *prev; }; #define list_entry(ptr, type, member) \ (type *)( (char *)ptr - ((size_t) &((type *)0)->member)) #define list_for_each…
原文地址:http://broadcast.oreilly.com/2010/09/build-html-documentation-for-y.html#comments Sandcastle 功能概述 如果您使用过的程序集中,带有详细的 API 说明文档,并且文档的格式和 MSDN 上的一样,您将发现这样 API 说明文档的是多么的方便.生成类似的 HTML 格式文档的方法有很多,不过,我发现其中最简单的方法是使用 Sandcastle 工具来生成这样的 API 文档.Sandcastle …
1.前言 今天在看代码时,遇到offsetof和container_of两个宏,觉得很有意思,功能很强大.offsetof是用来判断结构体中成员的偏移位置,container_of宏用来根据成员的地址来获取结构体的地址.两个宏设计的很巧妙,值得学习.linux内核中有着两个宏的定义,并在链表结构中得到应用.不得不提一下linux内核中的链表,设计的如此之妙,只需要两个指针就搞定了.后续认真研究一下这个链表结构. 2.offsetof宏 使用offsetof宏需要包含stddef.h头文件,实例可…
概要 前面一章"介绍双向链表并给出了C/C++/Java三种实现",本章继续对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法.其中,也会涉及到Linux内核中非常常用的两个经典宏定义offsetof和container_of.内容包括:1. Linux中的两个经典宏定义2. Linux中双向链表的经典实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3562146.html 更多内容: 数据结构与算法系列 目录 L…
概要 前面分别介绍了红黑树的理论知识 以及 通过C语言实现了红黑树.本章继续会红黑树进行介绍,下面将Linux 内核中的红黑树单独移植出来进行测试验证.若读者对红黑树的理论知识不熟悉,建立先学习红黑树的理论知识,再来学习本章. 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3624202.html 更多内容:数据结构与算法系列 目录 (01) 红黑树(一)之 原理和算法详细介绍(02) 红黑树(二)之 C语言的实现(03) 红黑树(三)之 Linux…