随笔分类 - 知其所以然
摘要:上一篇《语义陷阱-数组和指针》聊过数组和指针的区别,主要是对于数组和指针在内存中的访问方式加以区分,这篇博文则从更深层的角度剖析数组和指针的联系如果你也对底层感兴趣、我向这篇文章会对你有所帮助,什么时候数组和指针相同(When an Array Is a Pointer )在实际应用中,他们可以互换的情形要大大多于不能互换的情形。首先再回顾一下声明和定义,(上一篇中有提到这里在深入一下)声明本身还可以进一步分为三种情况:1)外部数组的声明(external array)2)数组的定义(它是声明的一种特殊情况,它分配内存空间,并可能提供一个初值)3)函数参数的声明所有作为函数参数的声明在编译时总
阅读全文
摘要:数组和指针经常出现于编程语言中、也许上课的时候老师也说过数组和指针有区别、参考书上也应该讲过,你是不是也不曾透彻的理清过?这篇博文主要从内存和编译的角度指出了数组和指针在访问方式上的区别、至于他们在函数调用的区别、以及它们的联系将在下一篇中详细讨论。为了说的清楚些、会先说一些基础的部分、如果你已经掌握大可跳过What's a Declaration? What's a Definition?声明和定义c语言的对象必须有且只有一个定义,但可以有多个声明(extern)这里说的对象和面向对象中的对象没有关系。A definition is the special kind of d
阅读全文
摘要:这篇博文主要内容是程序运行时的数据结构,包括运行时程序中的不同部分如何分配内存、函数调用的内存实现、还介绍了一个c独有的强大功能,一个被称为“展开堆栈”(unwinding stack)的技术运行时 数据结构,中间的空格是特意留出的,运行时可以认为是程序执行的一个状态,一般有编译时,运行时等,他们都是表示一个处理状态。编程语言的的经典对立之一就是代码和数据的区别。代码和数据的区别也可认为是运行时和编译时的界限,编译器的绝大部分工作和翻译代码有关;必要的数据存储管理的绝大部分都在运行时进行。如果你用过GCC,就会知道用GCC编译程序,都会得到一个默认名为“a.out”的文件。简单说下“a.out
阅读全文
摘要:引言:写一段程序很容易、也能很容易的得到一个能正确运行的执行、学习语言很容易,难的是掌握它不管接触什么语言,最经典的入门例子大概就是“hello world”了。然而,对于“hello world”背后的东西、当时却不曾深究。作为做程序的普通小菜、我仍醉心于基础和底层的东西。诚然、我也认为这些东西很重要。练好“内功”、有扎实的底层基础才能走的更快更远。知其所以然:承上、今天看了一下关于编译过程中链接的部分、觉得很有价值遂分享如下。由于链接器是从编译器中分割出来的单独程序,所以先要对编译有一个基本的认识。编译器的基本概念:简单的说,一个编译器就是一个程序,它可以阅读某一种程序语言编写的程序,并把
阅读全文
摘要:开篇今天,计算机系统结构的真正挑战不在于内存的容量,而是内存的速度。如果你的软件实际上受到磁盘和内存的等待时间(访问时间)的限制,那么就是再好的芯片也无济于事。在内存和cpu之间存在着一道很深的鸿沟,而且是越来越深。在过去,每隔一两年,cpu的处理速度就会提升一倍,在相同的时间内,内存的容量倒是扩大了一倍,但它的访问时间提升却没有那么明显。。所以我的理解是:内存主要受限于容量和速度。容量问题除了集成工艺的发展扩大物理内存容量,还可用用虚拟内存的办法解决。访问速度则可通过Cache技术的发展和程序设计的优化。内存管理的前世今生最初的计算机使用的内存直接对物理内存进行访问。这样的方式很快就被淘汰,
阅读全文