如何优化结构体和类的大小?

类和结构体的区别,大家应该都知道,但是在开发过程中到底是用类还是结构呢?

要想知道这个问题的答案首先应该知道怎样估算对象和结构体的大小。

一、如何估算结构体的大小

结构是值类型,它的结构体的实例是存放在栈中或者堆中。结构体在内存中所占的大小,就是其字段所占的大小,但是,它的大小并不是所有字段大小相加,而是存在一个对齐的规则,在默认的对齐规则中,基本类型字段是按照自身大小对齐的,如byte是按1字节对齐。

struct A
{
byte a1;
}

如上面这个结构体的大小就是1字节,如果是下面这个:

struct A
{
byte a1;
int a2;
}

这个结构体所占内存大小是8字节,因为int是4字节对齐的,所以只能从第四个字节开始。

如果再添加一个字段:

struct A
{
byte a1;
int a2;
byte a3;
}

这个结构体大小是12,由于struct本身也要是对齐的,所以它的对齐规则是按照其中元素最大的对齐规则决定的。也就是说上面这个结构体要按照4字节对齐,不足4字节要补齐,所以是12个字节大小。

如果想要优化它的大小,可以调整顺序如下:

struct A
{
byte a1;
byte a3;
int a2;
}

这个时候这个结构体所占的大小就是8字节了。

二、如何估算类的大小

类是引用类型,它的对象实例存放在堆中,对象实例一定是会占用堆内存的,而在栈中,保存的是实例的引用。对象在堆中分成3个区域,vtable、monitor和字段。其中vtable是类的共有数据,包含静态变量和方法表,这个应该就是类本身所占用的大小和具体的对象无关。monitor是线程同步用的,这2个指针分别占用一个inptr.Size大小,字段是从第9个字节或17个字节开始的,字段的对齐规则和结构体的对齐规则相同,区别是Mono中对象的实例会把引用类型的引用放在最前面。一个对象实例的大小就是 inptr.Size *2+字段的大小。

通过调整字段的顺序,也可以优化对象的大小。

还可以通过StructLayoutAttribute自定义类和结构体的对齐方式。

[StructLayout(LayoutKind, Sequential, Pack = 1)]
public struct A
{
byte a1;
int a2;
byte a3;
}

上面这个结构体强制按照1字节对齐,所以他的大小是6字节。但是这样做可能会降低性能。

所以具体情况还是要具体分析,懂得了如何估算结构体和类的大小,就更容易知道该如何使用它们了。

计算机是怎样把精彩的世界展现给我们?


为什么计算机上能看到动人的图片,精彩的视频和悦耳的音乐?


在上一篇如何读懂计算机文章中讲到,计算机只能处理二进制数字信息,也只能存储二进制数据。


那么计算机是如何把二进制数据转化为我们人类能看懂的图片,视频和能听懂的音乐呢?


接下来就为大家揭晓,计算机的秘密。


计算机是怎样把一张张美艳动人的图片呈现在我们眼前的?

我们知道图片都是由一个个的颜色点组成,这些颜色点被称为像素点,而颜色又可以分为三种基本色,即红、绿、蓝。其他颜色都是由这3种基本色按照不同的比例混合而成的。

计算机中存储图片是用二进制存储的,那么当显示器要显示一张图片的时候,其实是计算机把二进制信息转换为颜色点信息然后显示出来的。

红、绿、蓝三种基本色简称为RGB,在计算机中通常用24位二进制数表示一个颜色点(像素点),红(R)占8位,绿(G)占8位,蓝(B)占8位,那么根据二进制转换为十进制的规则红绿蓝每个色的取值范围是0—255。


这样根据红绿蓝不同数值的组合就可以形成不同的颜色点,成千上万不同颜色的点就组合成了图片


所以这就解释了为什么通常一张图片在计算机中所占的存储空间会比文本大,因为图片上的颜色信息多,像素越多的图片所占的空间越大,所能表示的颜色点越多,图片也越清晰。


照片上精彩的世界也就是通过这样二进制转换为颜色点的方式呈现在了我们的眼前。



计算机又是如何把精彩的视频播放给我们的呢?

其实原理很简单,我们小时候都看过电影,小时候那种电影是有胶片的,在放映机上面有一个强光灯泡把胶片上的图像投影到幕布上,然后胶片不断的滚动替换,它们像一堆画面串在一条塑料胶片上。


每一个画面称为一帧,代表电影中的一个时间片段。每一帧的内容总比前一帧有稍微的变化,这样,当电影胶片在投影机上放映时就产生了运动的错觉:每一帧都很短并且很快被下一帧所代替,这样就产生了运动。

于是动画电影就产生了。


在计算机中也是根据这个原理实现动画的效果,计算机中的视频其实就是一张张图片不断轮换然后实现了会动的效果,一个视频文件其实就是一堆图片,一部电影也是一堆图片链接起来的文件而已。


而图片是二进制组成的,所以视频也就被二进制组成了。

计算机把一堆二进制数据先翻译成了图片然后再把一堆图片有序的链接起来组成了一个视频。



计算机又是如何播放出悦耳的音乐呢?

我们都知道,声音是一种机械波,人的鼓膜感受到声波的振动,并通过听觉神经传给大脑,于是我们就听到了声音。


声音是一种模拟信号,而电脑只能处理二进制信息。


因此,首先要把模拟的声音信号变成电脑能够识别处理的数字信号,就是把模拟信号转换成二进制信息,这个过程称为数字化,也叫模数转换。

如果把一堆二进制信息直接输送给扬声器,那我们根本就听不懂。

因此,必须把数字声音信号转变成模拟声音信号,然后再输出到扬声器,也就是把二进制信息转换成模拟信号,这个过程叫做数模转换。

计算机中存储的声音信息经过数模转换后输出到扬声器播放,然后我们就能听到悦耳的音乐了。


欢迎提出宝贵的建议和想法。


关注我的公众号:理想的键盘,学习更多计算机知识。


cli_300px.png



如何读懂计算机


每天叫醒你的不是闹钟,而是知识


我在上一篇文章人人都能学编程中讲到,计算机是如何读懂人类的语言,今天我要讲的是人类如何读懂计算机语言

 

640.jpg


想要读懂计算机,就需要把计算机输出的内容转化为我们人类所能理解的语言,然后显示在屏幕上。

 

我在人人都能学编程中说到过,计算机只能处理二进制数据,那么如果计算机处理完二进制直接输出到屏幕上人是看不懂的。那么也是需要一套翻译系统根据一套规则帮我们把二进制翻译成自然语言

 

学过英语的都知道把英语翻译成汉语,其实就是根据语法规则和单词。那么其实计算机也是这样。

 

很久以前有一群聪明人他们决定8个可以开合晶体管来组合成不同的状态,来表示人类所能理解的数字和符号,他们把这8个晶体管称为字节。

640 (1).jpg


 

再后来,他们又做了一些可以处理这些字节的机器,可以用晶体管组合出很多种状态,然后计算机的雏形就诞生了。

 

世界上第一台通用计算机“ENIAC”于1946214日在美国宾夕法尼亚大学诞

 

第一台计算机是美国国防部用来计算弹道的,也就是说第一台计算机是美国用在军事上的。它非常大,用了18000个电子管,占地170平方米,重达30吨,耗电功率约150千瓦,每秒钟可进行5000次运算


640 (2).jpg

 

为什么要用这么多电子管,因为电子管越多能处理的状态就越多,这样能处理的速度就越快。

 

用八位的二进制表示一个字节,一共可以组合出256(28次方)种不同的状态

字节,它是计算机信息技术用于计量存储容量的一种计量单位,8位二进制数组合起来就有28次方种不同的状态,因为每一位二进制有2种状态01

 

刚开始计算机把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机收到约定好的这些字节被传过来时,就要做一些约定的动作。


640 (3).jpg


如收到 0001 0000, 终端就换行,收到0000 0111, 计算机就向人们嘟嘟叫,收到0000 1001, 打印机就打印反白的字,或者计算机就用彩色显示字母。于是就规定把这些0010 0000以下的字节状态称为控制码

 

然后把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。


640 (4).jpg

 


大家看到这样,都感觉很好,于是大家都把这个方案叫做ANSI”Ascii”编码(美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。

 

后来计算机发展越来越广泛,世界各国为了可以在计算机保存他们的文字,他们决定采用127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128255这一页的字符集被称扩展字符集


640 (5).jpg


 

这样的话所有的状态都被用完了。

 

等到中国人民开始使用计算机了,发现状态都被你们用完了,那我们如何来表示中文字符呢?况且有6000多个常用汉字需要保存呢。


聪明的中国人就想,靠你们来开发是不可能的了。

 

于是就自主研发,把那些127号之后的奇异符号们直接取消掉。规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字。

 

这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文都编进去了。

 

连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫半角字符(也就是占一个字节)了。

 

中国人民看到这样很不错,于是就把这种汉字方案叫做 “GB2312″GB2312是对ASCII的中文扩展。


640 (6).jpg

 

但是中国的汉字太多了,后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。

 

结果扩展之后的编码方案被称为GBK标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK扩成了GB18030

 

因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码。

 

第一个发明汉字输入法的是王永民(王码键盘输入发明者)从此字登上了信息化的舞台。


640 (7).jpg

 

当时的中国人想让电脑显示汉字,就必须装上一个”汉字系统”,专门用来处理汉字的显示、输入的问题,装错了字符系统,显示就会乱码。

 

就在这时,一个叫ISO(国际标准化组织)的国际组织看不过去了,决定着手解决这个问题。

 

他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!

 

于是所有问题的解决了,也统一的各个国家的所有语言。

 

他们打算叫它”Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称“UNICODE”

 

UNICODE 来到时,计算机网络刚好兴起,UNICODE如何在网络上传输也是一个必须考虑的问题。

 

于是面向传输的众多 UTFUCS Transfer Format)标准出现了,顾名思义,UTF8就是每次8个位传输数据,而UTF16就是每次16个位,只不过为了传输时的可靠性,从UNICODE UTF时并不是直接的对应,而是要过一些算法和规则来转换。

 

现在我们所使用的计算机基本上所有的操作系统都自带了UNICODEUTF8等基本的字符集,可以随时切换。Windows XPWindows7操作系统自带的都是GBK字符集(含2万余汉字)

 

这样的话操作系统就可以帮我们把计算机输出的二进制翻译成人类能读懂的文字了。

 



那么图片和视频又是如何翻译的呢?请观看后续文章


 

请关注我的微信公众号:理想的键盘,获取更多编程知识。

 

扫描二维码关注:

 

640 (8).jpg

 


 

总结一下计算机编码的发展历程:

 

●  第一台计算机诞生,美国国家标准学会制定了 ASCII 编码。基础ASCII码,使用位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字9、标点符号,以及在美式英语中使用的特殊控制字符

 

●中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字。

 

●汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。

 

●中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK编码扩充为 GB18030 编码。

 

●每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。

 

●  终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。

 

●  UNICODE在网络传输中,出现了两个标准 UTF-8  UTF-16,分别每次传输 8个位和 16个位。


人人都能学编程

在看电影和电视剧的时候我们经常能看到,一个电脑黑客随便在键盘上敲几下就破解了别人的电脑系统进入里面盗取资料。


每当看到这样的片段就觉的黑客很牛逼,很羡慕,崇拜,幻想着自己也能有这样的技术。

 

我经常这么幻想着,所以我从小就很喜欢计算机,喜欢捣鼓各种黑科技,高考完几乎全部志愿都是填的计算机相关的专业。

 

现在我虽然没有像电影情节那样随便破解别人电脑,但是以现在的技术找工作还是挺容易的,而且工作挺快乐轻松的。


如果要问世界上什么工作最好,那么我的回答是:做你喜欢的事,感兴趣的事,那就是最好的工作了

 

很多人对编程都很感兴趣,但是苦于不知道如何去学。觉得编程很难,自己数学不好,英语不好,学不下去。 刚开始学的时候其实我也觉的很难,但是现在我告诉你们其实编程一点也不难,要不是傻子人人都能学会,关键看你有没有这个兴趣和耐心了。

 

学习一样东西最好的时刻是现在,当然有兴趣还需要一个好老师,不然再大兴趣也会被磨灭。


想要学习计算机,首先你需要认识它,不要以为你都认识它了,其实你只是认识它的皮囊而已,你只是知道它长什么样



你要了解它的心,才能和它交流,你要知道它想要什么,它才会把你当朋友

 

那么今天小猿就来做这个老师教你如何认识计算机,如何和它交流。

 

大家都知道计算机是一个机器,如何和机器打交道?

 

假如你在大街上遇到一个外国人,你想和他交流,你会怎么做?是不是应该说他能听懂的语言和他打招呼。

 

那么其实计算机也是一样,你如果想要和它交流,你就要学会一门语言,就像你要和英国人交流一样你要学习英语。


这个语言就是计算机语言,也就是计算机能处理和理解的语言,现在世界上有几百种计算机语言,常用的有C,C++,JAVA,PHP,lua等等,这些都叫做计算机编程语言。


 

而这些语言只是我们人类能学习的语言,对计算机来说是一种高级语言,实际上计算机真正能直接处理的语言是机器语言,什么是机器语言?


其实就是二进制代码,什么是二进制代码?


就是010101这样一串0和1的数字组合而已


 

为什么计算机只能处理这样的一串01组合的数字呢,原因是计算机内部使用了成千上万个微型的“通断型”电子开关进行工作:


这些开关在任何时刻要么是通电,要么是断电


或者说,该电路只有两种工作状态:通或断,所以只需要用0和1表示这两种状态。多种状态的组合即多个0和1的组合。

 

为什么我们不直接学习机器代码呢?


机器代码是一堆0和1的数字,你想想如果要你用一串0和1的数字去表示一句话或者是一个数学计算,有多困难,是不是很麻烦呢。只用0和1 去描述一件事或者去计算一个公式是很复杂的过程。所以人类就想出了用其他语言替代机器语言。

QQ截图20180724115129.png



然后再通过编译软件把高级语言翻译成机器语言,再由计算机去执行机器语言。

 

就像是你虽然学习了英语但是你的英语口语并不是很好,外国人并没有听懂你讲什么,这个时候有一个专业的英语老师过来了给你做翻译。

QQ截图20180724120224.png

 

既然是交流,那么就是双方都需要输入和输出。上面讲的是如何把我们人类所要表达的翻译成计算机能理解和处理的,那么计算机理解和处理后如果反馈给我们人类呢?


那就需要把计算机输出的内容转化为我们人类所能理解的语言,然后显示在屏幕上。


 

小猿将会在下一篇文章为您解答二进制的01代码如何转换为人类所能理解的语言。


请关注我的公众号:理想的键盘,学习更多编程知识。


2018_07_24_2158296960.png

人人都应该学点编程

周末去市图书馆逛了一下,本想去找本“人生鸡汤”看看,不知不觉就走到了计算机书架区了,真是职业毛病啊。心想都走到这里了,就看看现在有什么感兴趣的书吧!



走到编程书架旁看着那一排排编程语言的书,仿佛又回到了大学时代,感觉自己就像在学校的图书馆一样,还能感受到刚上大学时那种兴奋感。这个时候突然一个小学生打断了我的幻想,那个小学生说:我要买VB的书,我觉得VB比较实用,后面跟着他的爸爸妈妈,他爸爸说:不是应该学C语言吗?那个小男孩在书架上翻找着。我顿时来了兴趣,没想到现在这么小的小学生都开始学习编程开发了,居然还讨论着哪个语言好坏来了!这通常不是我们正规的程序猿应该讨论的问题吗?毕竟都说PHP是世界上最好的语言,虽然我不这么觉得,但是也轮不到小学生来评价啊。



我心想,现在已经是2018年了,互联网发展如此之快,小学就开始学习编程似乎并不奇怪,毕竟在大城市教育环境和孩子爸妈的教育都比较好,乔布斯曾经说过:”每个人都应该学习编程,因为它教会你思考的方式”,这样类似的话好像特朗普也说过,说明了编程在我们的生活中还是帮助挺大的,毕竟现在互联网如此普遍,以后我们的生活肯定会越来越方便化科技化,如果不学习一些如何与计算机沟通的东西还真的会被OUT掉。


      

从现在小学生就开始学习编程的趋势来看,如果我们成年人还不学习的话我相信马上就会被小学生超越了,到时候或许连小学生讨论的都是编程语言VB,C,PHP,Python这些专业词语。你一个做父母的可能都听不懂,这难道不是一种危机吗?未来的一切设备都可能是可编程的东西,现在越来越流行的是智能家居系统,买房子销售都喜欢吹他们的楼盘带智能装修,智能装修是什么?就是开发商在盖房子的时候已经想到了各种物联网智能家居的东西,把这些高科技的东西都装修到了房子里面,比如你家里的监控和门禁系统都是可以联网的,你只需要手机上装一个APP就可以直接开你家里面的门,开照明,开空调,看监控,各种你想的到和想不到的。



你可能会觉得这些好像和编程没有什么关系,是的现在是没什么很大关系,但是现在发展是这样,你想想以后会怎样呢?  你是不是发现现在的电视是越来越智能,几乎就是一台能看电视的电脑,未来很可能所有的智能家电都会设计成那样,直接互联网化,甚至没有屏幕,一个投影出来,像美国大片那样,手指随便点击几下就可以控制所有的家电。说到这里你可能还觉得好像和你会不会编程依然没有半毛钱关系,下面小猿就来说说他们到底有什么联系。



大家都知道现在手机上的APP和智能家电上的软件和系统都是编程开发出来的,那么在这个越来越讲究个性化,定制化的世界,这些功能能满足你们所有人的需求吗?每个家庭甚至是每个人对自己家的电视的要求都是不一样的。就比如有些人只喜欢看娱乐节目,有些人只需要看电视剧。然后每次看电视都是一个遥控器从头翻到尾,然后继续循环。是不是很烦?那么如果这些电视的生产商把电视做成可编程化,提供编程接口,让你自己定制你的电视,你自己写代码控制遥控器的功能,你可以让你的遥控器只循环娱乐节目,甚至是根据你的喜好自动选择一个频道给你播放,还可以根据你平时看电视的时间自动开机关机。



这些你都可以自己定制开发,我知道你心里肯定会说,这些东西生产商直接做进去不就好了,你要知道无论什么东西都不能让所有的人满意,就像你不能让所有的人都喜欢你吧,你喜欢的东西未必其他人喜欢,有些人喜欢简单,有些人喜欢科技化智能化。把功能都做进去只会让一个产品越来越臃肿,并且价格还越来越贵。现在很多软件都是可定制化的,我相信未来的硬件也一样是可定制化的(现在已经有很多),而且是可编程扩展的。只要发挥你的想象,每个人都能成为产品经理。


      

我只是举了个小例,未来会编程不只这一点好处,编程以后会是在生活上工作上的基本技能。来你想做的事,你只需要写个程序就可以帮你完成了。




欢迎关注公众号:理想的键盘,获取更多编程知识