读《编程卓越之道:深入理解计算机》续二

       这本书确实不错,尽管现在读起来感觉其实很多东西对于我现在的编程来说没有实质上的用处(因为我现在编写的程序对性能等要求不高,即使使用了这些优化也未必能感觉到多大差别,呵呵主要还是现在的CPU太快了,memory也比较大),不过我对这些知识还是非常感兴趣,而且,这些真的是编写卓越代码的基础。晚上又去图书馆泡了两个多小时,读完了第七章:复合数据类型。其实我觉得指针也应该算是一种复合数据类型,因为指针和它所真正要表示的目标数据之间仍然存在一种映射机制,而不是直接的表示。
1.指针实际上是内存地址的抽象(不一定就是目标数据的内存地址哦)。程序设计语言可以使用任何可以将指针的值映射到内存中对象地址的机制来定义指针。有些语言,如某些pascal实现,就是使用相对于某个固定内存地址的偏移量来作为指针,而有些动态语言,如LISP,则使用双重间址,即指针对象包含的是某个内存变量的地址,而该内存变量的值是目标对象的地址。
2.有些机器要求应用程序访问的数据必须在字、双字,甚至是四字整数倍的地址边界上,而有些机器不要求这样。因此某种高级语言在实现指针相关运算时就要考虑这一点。其通用的解决方案是在给指针加上一个整数偏移量时,将该偏移量乘以该指针所引用的对象的大小。这样只要数据对象的大小是所要求的对齐大小的整数倍就行了(这个可以通过编译器在对象末尾添加字节来保证)。这种方法可以在那些要求对齐数据访问的体系结构上使用而没有问题。
3.对于结构型变量(C中的struct之流),理论上编译器可以随便放置它的各个成员字段,不过几乎所有的编译器都按各字段在代码中出现的顺序放置。有些编译器会将它们对齐在合适的内存边界上,而且还会确保整个结构的长度是其字段中最大非复合数据类型对象的大小和CPU最优对齐大小中的较小者的整数倍。如果CPU允许字段不对齐,编译器可以通过编译选项的方式来禁止或允许字段对齐,那样将节省空间的使用,但是访问未对齐数据会慢一些。
4.联合(C中的union之流)的作用主要是组合与分解数据类型,比如将一个大对象拆成各个字节。但是由于内存组织存在大小端的区别,这样会降低代码的可移植性(不过可以通过续一中介绍的方法来进行检测,并加以转换)。
( To be continued... )
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值