结构体类型

接口、反射

此生再无相见时 提交于 2019-12-23 22:56:21
接口 1、定义   Interface类型可以定义一组方法,用来表示一个对象的行为特征。   interface不能包含任何变量。 type Animal interface{ Talk(参数列列表) 返回值列列表 Eat(参数列列表) 返回值列列表 … } 2、 interface类型是引用类型 3、接 口实现    a. Golang 中的接 口,不需要显示的实现。只要 一个对象,实现了接 口类型中的所有 方法,那么这个对象就实现这个接 口。   b. 如果 一个对象实现了多个 interface 类型的 方法,那么这个对象就实现了多个接 口。 package main import ( "fmt" ) type Animal interface { Eat() Talk() } type Dog struct { } func (d *Dog) Eat() { fmt.Println("dog is eating") } func (d *Dog) Talk() { fmt.Println("dog is wawa!") } type Cat struct { } func (d *Cat) Eat() { fmt.Println("cat is eating") } func (d *Cat) Talk() { fmt.Println("cat is miaomiao!")

Shader之小白入门学习七

本秂侑毒 提交于 2019-12-23 17:57:20
Shader之小白入门学习七 前言 上一篇中学习了变量的来龙去脉,在本篇中继续深入了解顶点片段着色器,但是在此之前还是需要大概了解下渲染管线的相关知识点。 渲染管线 图形渲染管线之所以被叫做 管线 ,就是因为它和一根管子的概念很像,我们可以理解为这根管子的末端连接的是我们最终的显示屏幕,管子的起始端连接的是我们的原始素材。 把我们想展示在屏幕上的素材从起始端放入,然后素材通过管子经过一系列操作最终战士在屏幕上。 而我们如果想加工一下素材最后的显示效果就可以在这根管子中最一些特殊的操作处理,以使素材经过我们所定义的操作使其最终达到我们想要的效果。 这根管子从头到尾大致流程可以分为以下三个大阶段(概念上): 应用程序阶段 (The Application Stage) 就是我们的原始素材准备阶段,包括我们的模型,贴图,相机和光源等,经过这个阶段会将所有的素材转换成渲染图元并提交到下一阶段中(几何阶段)。 几何阶段 (The Geometry Stage) 主要是对上一阶段中传过来的数据进行顶点上的加工处理,包括各种矩阵转换与顶点着色等,最后处理完成后会输出屏幕空间的二维顶点坐标,顶点着色等信息,并再提交到下一阶段(光栅化阶段)。 光栅化阶段 (The Rasterizer Stage) 经过几何阶段处理完后输送到光栅化阶段,从像素级别上对每个像素进行加工处理,最终显示在屏幕上。 结构体

C#学习笔记_12_枚举&结构体

做~自己de王妃 提交于 2019-12-23 15:53:38
12_枚举&结构体 枚举 是一种数据类型 适用于某些取值范围有限的数据 语法: [访问权限修饰符] enum 枚举名 { 枚举值 } 枚举名遵循大驼峰命名法 枚举一般情况下是和switch case结合使用的 注意: 1、虽然枚举中的元素的值可以相同,但是强烈不推荐这样使用 2、枚举元素默认的值类型是int型,可以修改为其他的 整型 结构体 结构体和类基本一样 相同点: 都包含字段、属性、方法 修饰的访问权限 都是通过关键字new来实例化对象 区别点: 结构体对象是在栈上开辟的空间 类对象在堆上开辟空间 结构体是值类型,不是引用类型 构造方法 结构体中不允许写无参构造方法 结构体的有参构造方法中必须要给所有的字段进行赋值 结构体中始终包含一个public权限的无参构造方法 结构体中不允许写析构方法 结构体只有一个父类叫Object,结构体不能被其他结构体或类继承,也不能继承自其他结构体和类 语法: [访问权限修饰符] struct 结构体名字 {} 来源: https://www.cnblogs.com/chriswong/p/10363178.html

Linux DM9000网卡驱动程序完全分析

我是研究僧i 提交于 2019-12-23 09:27:15
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 说明1:本文分析基于内核源码版本为linux-2.6.31 说明2:本文在理解了linux中总线、设备和驱动模型的基础上加以分析代码 天猫爆款 联想 ibm ThinkPad E320 129862C 代替55C 笔记本 包邮 虽然Linux驱动程序应该是和具体的硬件平台分离的,但是为了更好的理解DM9000的驱动程序,这里还是结合一下Mini2440开发板,这样也可以更好的体会如何实现驱动和平台分离。 本文分成以下几个部分: 一、Mini2440开发板上DM9000的电气连接和Mach-mini2440.c文件的关系。 二、两个重要的结构体介绍:sk_buff和net_device 三、具体代码分析 一、Mini2440开发板上DM9000的电气连接和Mach-mini2440.c文件的关系 Mini2440开发板上DM9000与S3C2440的连接关系如下: 其中片选信号AEN使用了nGCS4,所以网卡的内存区域在BANK4,也就是从地址0x20000000开始。DM9000的TXD[2:0]作 为strap pin在电路图中是空接的,所以IO base是300H。中断使用了EINT7。这些内容在Mach文件中有如下体现: [c-sharp] view plain copy #define S3C2410

C++ 字节对齐

折月煮酒 提交于 2019-12-23 03:52:00
1. 缘起 来自BBS上的面试题目,struct{int a; char b;}的大小是多少?答案是8。上网看了下,是字节对齐。 2. 字节对齐的基本规则 首先,每种类型的变量的默认对齐长度都是自己的变量长度,比如:char占一个字节,那么对齐长度就是一个字节,int占四个字节,对齐长度就是四个字节,double占八个字节,对齐长度就是8。int的对齐长度为4的实际意义是,int变量必须存储在四的倍数的地址上。 那么对于struct{char b; int a},其长度是8,因为b虽然只占用1个字节,但是a必须从4的倍数开始存储,因此b后面的3个字节都废掉了。因此一共需要8个字节才能把b和a存下来。 那么对于struct{int a; char b},其长度还是8!晕菜了!原因如下: 字节对齐的细节和编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding); 3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。 规则1是控制结构体变量的首地址的,与结构体变量的长度没关系。

C语言结构体初始化的小技巧

≡放荡痞女 提交于 2019-12-22 03:58:25
我们使用C去新建结构体变量时,如果这个变量是局部变量,那么其成员变量的默认初始值就是随机值,所以一般在创建变量时会对其成员的值进行初始化。 本文会介绍一种操作简单的结构体初始化方法,并与常规初始化方式进行对比,下面举例说明这个过程, 一 常规初始化 假设结构体类型定义如下, struct Test { int a ; int b ; char c ; double d ; } ; 我们在main()函数里新建变量,不做初始化,然后打印其成员值, int main ( void ) { struct Test test ; printf ( "test.a: %d, test.b: %d, test.c: %c, test.d: %f\n" , test . a , test . b , test . c , test . d ) ; return 0 ; } 输出如下, 可以看出大部分都是随机值(除了double,不过这个应该和具体编译器有关) 下面使用常规初始化方式,主要有2种,一种是挨个成员赋值,一个是使用memset()去把整个变量所占的内存空间清0,都比较麻烦, int main ( void ) { // 挨个初始化 struct Test test1 = { . a = 0 , . b = 0 , . c = 0 , . d = 0.0 } ; printf (

memcached 源码阅读笔记

允我心安 提交于 2019-12-21 23:28:15
阅读 memcached 最好有 libevent 基础, memcached 是基于 libevent 构建起来的. 通由 libevent 提供的事件驱动机制触发 memcached 中的 IO 事件. 个人认为, 阅读源码的起初最忌钻牛角尖, 如头文件里天花乱坠的结构体到底有什么用. 源文件里稀里哗啦的函数是做什么的. 刚开始并没必要事无巨细弄清楚头文件每个类型定义的具体用途; 很可能那些是不紧要的工具函数, 知道他的功能和用法就没他事了. 来看 memcached 内部做了什么事情. memcached 是用 c 语言实现, 必须有一个入口函数 main() , memcached 的生命从这里开始. 初始化过程 建立并初始化 main_base, 即主线程的事件中心, 这是 libevent 里面的概念, 可以把它理解为事件分发中心. 建立并初始化 memcached 内部容器数据结构. 建立并初始化空闲连接结构体数组. 建立并初始化线程结构数组, 指定每个线程的入口函数是 worker_libevent() , 并创建工作线程. 从 worder_libevent() 的实现来看, 工作线程都会调用 event_base_loop() 进入自己的事件循环. 根据 memcached 配置, 开启以下两种服务模式中的一种: 以 UNIX 域套接字的方式接受客户的请求 以

C++内存对齐的理解

痞子三分冷 提交于 2019-12-21 11:02:51
程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。 编译器中提供了 #pragma pack(n)来设定变量以n 字节对齐 方式。 n字节对齐就是说变量存放的起始地址的 偏移量 有两种情况: 第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式, 第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。 结构的总大小也有个约束条件,分下面两种情况: 如果n大于所有 成员变量 类型所占用的字节数,那么 结构的总大小必须为占用空间最大的变量占用的空间数的倍数 ; 否则必须为n的倍数。 重要的规则 1,复杂类型中各个成员按照它们被声明的顺序在 内存中顺序存 储,第一个成员的地址和整个类型的地址相同; 2, 每个成员分别对齐,即每个成员按 自己的方式对齐 ,并最小化长 规则就 是每个成员 按其类型的 对齐参数(通常是这个类型的大小) 和 指定对齐参数 中 较小的一个对齐(对齐指的是数据类型在内存中的起始的N倍的跨度) ; (指 复杂类型中成员类型 中自己的对齐方式,并不是结构体等整体的对齐方式) 3, 结构 、 联合 或者 类的数据成员 ,第一个放在偏移为0的地方;以后每个数据成员的对齐,按照#pragma

go--反射

佐手、 提交于 2019-12-21 04:15:20
变量的内在机制 go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息 值信息:程序运行过程中可动态变化的。 反射介绍 反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。 支持反射的语言可以在编译器就将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改他们。 在go语言中,空接口可以存储任意类型的变量,要获取这个空接口保存的数据是什么,就要使用反射。 reflect包 任意接口值在反射中都可以理解为由 reflect.Type 和 reflect.Value 两部分组成,并且reflect包提供了 reflect.TypeOf 和 reflect.ValueOf 两个函数来获取任意对象的Value和Type。 TypeOf 在go语言中,使用 reflect.TypeOf() 函数可以获得任意值得类型对象(reflect.Type),程序通过类型对象可以访问任意值的类型信息。 func reflectType(x interface{}) { v := reflect.typeOf(x) fmt.Printf("type:%v\n", v) } func

结构体和类的区别

你。 提交于 2019-12-20 06:38:51
1.C的结构体和C++结构体的区别 1.1 C的结构体内不允许有函数存在,C++允许有内部成员函数,且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。 1.2 C的结构体对内部成员变量的访问权限只能是public,而C++允许public,protected,private三种。 1.3 C语言的结构体是不可以继承的,C++的结构体是可以从其他的结构体或者类继承过来的。 以上都是表面的区别,实际区别就是 面向过程 和 面向对象 编程思路的区别: C的结构体只是把数据变量给包裹起来了,并不涉及算法。 而C++是把数据变量及对这些数据变量的相关算法给封装起来,并且给对这些数据和类不同的访问权限。 C语言中是没有类的概念的,但是C语言可以通过结构体内创建函数指针实现面向对象思想。 2.C++的结构体和C++类的区别 2.1 C++结构体内部成员变量及成员函数默认的访问级别是public,而c++类的内部成员变量及成员函数的默认访问级别是private。 2.2 C++结构体的继承默认是public,而c++类的继承默认是private。 3.obective-c结构体和obective-c类的区别   3.1 objeive-c的结构体和c的结构体最接近的,不可以继承且不允许函数存在。   3.2 obective-c类和java的类是最接近的