内存访问粒度
如果没有深入的了解内存方面的东西, 我们可能会认为内存不过是简单的字节数组, 例如下面的形式
但是实际上, 计算机的处理器并不是以单个字节块为单位读写内存, 而是以2个,4个,8个,甚至16或者32个字节块为单位读写内存,如下图所示 我们将处理器访问内存单元的大小叫做其内存访问的粒度.
知道上面这一点很重要, 这也是C语言alignment的基础.
No Start No End
如果没有深入的了解内存方面的东西, 我们可能会认为内存不过是简单的字节数组, 例如下面的形式
但是实际上, 计算机的处理器并不是以单个字节块为单位读写内存, 而是以2个,4个,8个,甚至16或者32个字节块为单位读写内存,如下图所示 我们将处理器访问内存单元的大小叫做其内存访问的粒度.
知道上面这一点很重要, 这也是C语言alignment的基础.
之前在windows上使用vc++6.0,编写过c的代码,主要是为了完成一些作业,并没有十分深入的学习C语言. 因此当时留下了两个对于c语的言的误区,现在记录一下。
一直以我都认为在调用一个方法之前,必须要在前面声明原型或者直接定义该方法, 大概如下面的形式, 否则程序就会出现编译错误。
1 | int test(); |
这是一个在线的应用,用来短时间存储一些信息,以实现在不同设备上共享这些信息的功能。其实目的就是可以将手机上的一些信息快速的复制到电脑上,尤其是在使用Linux系统的时候。下面是该应用的截图。其中阅后即焚是指信息被访问一次之后就会被销毁。
程序主要的流程就是首先在文本框中输入或者粘贴一些内容,然后保存到服务器(使用的是新浪sae),保存成功之后会返回给客户端一个编号,通过该编号就可以访问存储的内容。因为就是为了给手机和电脑之间的复制粘贴提供一个介质,所以信息的有效时间暂时设为了2分钟,2分钟之后就会清除保存的信息。
Storage Class翻译成中文为存储类(总感觉翻译成汉语不太好),用来修饰C中变量和函数。如果没有显式的指定storage class,会使用默认值。它的作用主要以下几点:
对于局部变量(定义在函数或者代码块中的),声明和定义可以认为是等同的,因为声明变量的同时会为变量分配存储单元,即便在严格意义上认为局部变量的声明和定义是不同的,但是两个过程是不可拆分的,即无法只声明一个局部变量。对于全局变量(定义在函数外)来说,声明和定义是要做区别的,诸如int i
, static int i
这样的代码,变量的声明和定义是在一起的,即执行完代码之后,变量已经有了对应的存储单元。但是如果加上 extern 修饰符extern int i
,此时就仅仅是对变量的声明了,这个过程是不分配存储空间的, extern 会告诉编译器我的定义在其它的地方,你先使用我这个声明,等到编译时再链接到我的定义。
int a(int i);
上面的只是声明(declare)了一个函数a,该声明描述了函数a的返回值类型(return type),函数命名(name),参数(parameters)的个数以及类型。当我们声明完变量a之后,编译器已经知道了函数a信息,但是并没有为函数分配空间,当我们为函数加上函数体(body)之后,函数才真正的被定义(define),如下,此时函数才有了对应的存储单元,执行该函数会返回1.1
2
3int a(int i) {
return 1;
}
在程序中,对同一个函数,可以有多次的声明(没有函数体),但只能有一次的定义(带函数体部分)。需要注意的一点是函数声明默认的存储类(storage class)是 extern 的,但函数的定义并不是。
在HTML5中,我们可以使用drawImage方法在canvas上进行画图操作,其基本代码如下:1
2
3
4
5var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
var image = new Image();
image.src = "images/01.jpg";
context.drawImage(image, 0, 0);
不过我们会发现这样写是无法显示出图片的,因为图片并没有加载完全,我们就调用了drawImage方法,我们可以使用img的onload方法,使图片加载完全后
在执行drawImage操作,代码如下1
2
3
4
5var image = new Image();
image.src = "images/01.jpg";
image.onload = function() {
context.drawImage(image, 0, 0);
}
或者使用<img>
标签先加载图片<img src="images/01.jpg" style="display: none" id="image">
然后使用getElementById来获得图片对象var image = document.getElementById('image');