6.1 存储技术 1.随机访问存储器(RAM),是易失性存储器,掉电存储信息会丢失,与之相对的是非易失性存储器(ROM),它掉电后存储信息不丢失,但前者访问速度较快,但容量有限,通常只有几百或几千兆字节. 2.它分为静态RAM(SRAM)和动态RAM(DRAM),前者更快,价格也更高,密集度更低. 3.磁盘由盘片构成,一个盘片两个面,盘片中央有旋转轴以固定速率旋转,多个盘片组合并封装形成了一个磁盘,也就是所谓的机械硬盘.盘片可以被划分为许多同心圆,这些被称为磁道.每个磁道被分为许多扇区,每个扇区…
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十六章:实例化和截头锥体裁切 代码工程地址: https://github.com/jiabaodan/Direct12BookReadingNotes 学习目标 学习如何实现硬件实例化: 熟悉包围体,学习如何创建和使用它们: 学习如何实现截头锥体剔除. 1 硬件实例化 给每个实例都复制一份顶点和索引是非常浪费的,所以我们只保存一份物体在局部坐标系下的数据,然后使用…
线程有时称为轻权进程(lightweight process) 同一进程内的所有线程共享相同的全局内存.这使得线程之间易于共享信息,然后这样也会带来同步的问题 同一进程内的所有线程处理共享全局变量外还共享: 1.进程指令 2.大多数数据 3.打开的文件(即描述符) 4.信号处理函数和信号处置 5.当前工作目录 6.用户ID和组ID 不过每个线程有各自的: 1.线程ID 2.寄存器集合,包括程序计数器和栈指针 3.栈(用于存放局部变量和返回地址) 4.errno 5.信号掩码 6.优先级 基本线程…
仅从寻址上看,32位和64位机器能寻址的内存空间大小不同. 需要知道的是,计算机系统对存储器作了抽象,程序“认为”内存是一个很大的字节数组,然而实际上它是由多个硬件存储器和操作系统组合起来实现的. 程序看到的内存地址是虚拟地址,是操作系统为了让程序使用方便作的映射,实际当程序运行时,要从某个地址取信息时,需要由操作系统作一层映射,将虚拟地址转换为实际内存的物理地址.这样,程序方就可以不用管底层的细节,只需要“认为”内存是个很大的字节数组,用就完事了. 32位机器能寻址的内存空间是232个字节,大…
1.数据对齐 为什么要对齐:通俗点解释就是CPU对数据访问时,每次都是取固定数量的字节数,假如一次取4个字节,若有个int存在0x01-0x04,则一次就能取出,若存在0x03-0x06,则需要分两次才能取到(第一次0x01-0x04,第二次0x05-0x08),这样会降低CPU效率,更何况还有像short,char之类的不是4个字节的数据.因此,编译器会对数据进行强制对齐. 对齐规则: 1.任何K字节的基本对象的地址必须是K的倍数 2.在结构末尾根据需要会做一些填充,使其一旦被拓展为数组时可以…
1.如何由机器代码生成汇编代码? objdump -d再加上文件名即可直接在终端看到由反汇编器恢复的汇编代码.注意,文件名并不一定得是.o文件,任何可执行文件都可以. 结果如下: 仅列举了反汇编test.o的结果,其它的也测试过,不放图了. 2. 32位和64位的基本数据类型大小对比: 32位: char:1字节,char*:4字节,short int:2字节,int:4字节,unsigned int:4字节,float:4字节,double:8字节,long:4字节,long long:8字节…
gcc是一种C编译器,这次我们根据书上的代码尝试着使用它. 使用之前,先补充前置知识.编译器将源代码转换为可执行代码的流程:首先,预处理器对源代码进行处理,将#define指定的宏进行替换,将#include包含的文件插入,随后,编译器生成源文件对应的汇编代码,以.s结尾.然后汇编器会将汇编代码转换为机器代码,以.o结尾,最后,链接器将多个机器代码(如果有多个的话)以及代码中用到的库函数(如printf)合并,产生可执行文件. 若要比较详细地了解gcc常用参数,可以参考这篇文章: https:/…
链接概述 经预处理器->编译器->汇编器处理后,源文件可被转化为一组可重定位目标文件,链接器将它们组合起来形成可执行文件. 每个可重定位目标文件由不同的“代码节”和“数据节”组成,每一个节都是一个连续的字节序列.由于每个可重定位目标文件的生成是独立的,因此组合时会出现两个问题: 一是若某个可重定位目标文件中使用了外部的全局变量,而此变量定义于另一个可重定位目标文件中,怎么办? 二是生成目标文件时如何确定地址.链接器生成的可执行文件在实际运行时,需要由加载器将其代码及数据复制到内存,再将控制转移…
一.几个关于指针的小知识点: 1.  malloc是在堆上动态分配内存,返回的是void *,使用时会配合显式/隐式类型转换,用完后需要用free手动释放. alloca是标准库函数,可以在栈上分配任意字节数量的内存,用完自动释放. 2.指针的优先级较低: char (*p)[3],括号中优先级最高,所以p是一个指针,指向一个3个元素的char数组. char *p[3],  因为指针优先级较低,所以*与char结合,p代表一个3个元素的数组,每个元素都是一个char *. 3.函数指针: 它的…
这一节比较简单,仅记录几个比较重要的点: 1.C语言允许对指针进行运算,计算出的值会根据该指针引用的数据类型大小进行伸缩. 例子: 其中,xE是数组的起始地址.注意,指针运算时,若最终结果为指针,则指针的值会根据引用的数据类型进行拉伸.若最终结果为数值,则结果会被压缩,如最后一行所示,算出的结果不是4i,是4i/4=i. 2.对于多维数组,以二维数组为例,如int A[5][3],实际上等价于:typedef int row3_t[3];  row3_t A[5]; 此外,数组元素在内存中存储时…