认识C和内存管理

C程序内存空间分为下面5类:

stack栈: 存放着局部变量和函数参数等数据,向下生长 (可读可写可执行)

heap堆:  给动态分配内存使用,向上生长 (可读可写可执行)

bss segment:BSS段   用来存放未初始化的全局变量、未初始化的静态变量 和 这两种变量初始化值为0的情况

data segment:数据段  保存已初始化的全局变量和初始化的静态变量(初始化值都不为0)   (可读可写不可执行)

code segment/text segment:代码段  用来保存函数和程序代码(可读可执行不可写)

 

1. C语言家族  
1) C: Dennis Ritchie于1972年在贝尔实验室开发出来;是一种命令式语言(imperative system language)]
2) C++: Bjarne Stroustrup于1979年在贝尔实验室开发出来;是一种支持泛型(generics)的命令式,面向对象的语言
3)C#: 2001年,由微软开发。是一种多范型(multi-paradigm)编程语言,支持命令式、函数、泛型、面向对象和内存管理。
注: 命令式语言又称强制式语言,通过指明一系列可执行的运算及运算的次序来描述计算过程的语言。平时我们用的大多数语言(比 如,C,C+,Java,C#,Python等)都是命令式语言。与它相对的是函数式语言(functional language),如Haskell,Lisp。函数式语言更像数学,命令式语言更接近人的思维。
 

2. C的典型特征:

1)编译型语言(compiled language)(相对于解释型语言来说)

编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接运行编译的结果就行了。因此效率高

解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次。因此效率比较低

2)命令式的

3) 人工管理内存

4)当需要涉及以下问题时使用C:

     -速度

     -内存

     -低层次特性(low-level features),如:移动stack pointer等

3. 内存抽象的层次(从内存的角度思考C...) 

抽象层次                        编程语言

--------------------------------------

直接操作内存                     汇编语言

访问内存                           C,C++

内存自动管理                     Java,C#,Scheme/LISP,ML

4. C访问的内存: 堆(heap)

堆是一块儿用于动态内存分配的内存区域

1)把它想像称为一个巨大的数组

2)通过指针(pointer)来访问

3)整个程序都能访问堆(如果操作系统允许的话)

5. 人工内存管理: 堆(heap)

目的:

1) 允许程序能够分配内存用于当前的使用

2)当程序执行完后,能够释放内存,用于重新分配

C语言的标准类库(standard library)中有malloc和free两个函数支持内存管理

6. C访问的其它内存:棧(stack)

C语言中棧是编译器自动分配和回收,用于存放函数及其参数,局部变量等的内存区域

C函数将会分配到棧中:

1)函数在被调用时进棧(pushed on to stack)

2) 函数在返回时出棧(popefd off the stack)

3) 函数能访问当前棧顶部以下的所有内存(这里所谓的“顶部以下”如下图所示)

7. C语言编译器:推荐使用GCC,一般是在linux下用gcc+vim写C程序。 

认识C和内存管理的更多相关文章

  1. .NET基础拾遗(1)类型语法基础和内存管理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  2. PHP扩展-生命周期和内存管理

    1. PHP源码结构 PHP的内核子系统有两个,ZE(Zend Engine)和PHP Core.ZE负责将PHP脚本解析成机器码(也成为token符)后,在进程空间执行这些机器码:ZE还负责内存管理 ...

  3. linux2.6 内存管理——逻辑地址转换为线性地址(逻辑地址、线性地址、物理地址、虚拟地址)

    Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Linux运行在虚拟存储空间,并负责把系 ...

  4. linux2.6 内存管理——概述

    在紧接着相当长的篇幅中,都是围绕着Linux如何管理内存进行阐述,在内核中分配内存并不是一件非常容易的事情,因为在此过程中必须遵从内核特定的状态约束.linux内存管理建立在基本的分页机制基础上,在l ...

  5. Objective-C内存管理之引用计数

    初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...

  6. Quartz2D内存管理

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "PingFang SC"; color: #239619 } p.p2 ...

  7. 浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...

  8. linux内存管理

    一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...

  9. cocos2d-x内存管理

    Cocos2d-x内存管理 老师让我给班上同学讲讲cocos2d-x的内存管理,时间也不多,于是看了看源码,写了个提纲和大概思想 一.   为什么需要内存管理 1. new和delete 2. 堆上申 ...

  10. Swift中的可选链与内存管理(干货系列)

    干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...

随机推荐

  1. Apache Spark源码走读之8 -- Spark on Yarn

    欢迎转载,转载请注明出处,徽沪一郎. 概要 Hadoop2中的Yarn是一个分布式计算资源的管理平台,由于其有极好的模型抽象,非常有可能成为分布式计算资源管理的事实标准.其主要职责将是分布式计算集群的 ...

  2. PHP 开启短标签

    <?=STATIC_URL?> 让上面的语句可以正常运行,等同于下面的语句 <?php echo STATIC_URL;?> 可以在 php.ini 中找到 short_ope ...

  3. sql语句什么时候用双引号或者单引号

    INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN ); 如果数据是字符型,必须 ...

  4. QQ群笔记

     uuid就好比你的名字,类似到了班级里,你的名字会被学号替代.同样的连接之后,uuid会被handle句柄替代.   问下CC2541串口用DMA接收的时候,调试程序时候发现,串口发一帧数据,进入两 ...

  5. 初学Java语法(笔记)

    2015-12-30

  6. java 操作数据库

    package foo;import java.sql.*; public class JdbcDemo { private static Connection conn; private stati ...

  7. 【转】简单的虚拟摇杆控制移动(NGUI)

    http://www.cnblogs.com/zhangbaochong/p/4928688.html 一.用NGUI创建虚拟摇杆贴图 先创建一个sprite作为背景叫做JoyStick 并添加一个B ...

  8. random and password 在Linux下生成crypt加密密码的方法,shell 生成指定范围随机数与随机字符串

    openssl rand -hex n (n is number of characters) LANG=c < /dev/urandom tr -dc _A-Z-a-z-0-9 | head ...

  9. 解读ClassLoader

    ClassLoader一个经常出现又让很多人望而却步的词,本文将试图以最浅显易懂的方式来讲解 ClassLoader,希望能对不了解该机制的朋友起到一点点作用.    要深入了解ClassLoader ...

  10. 一次性搞清楚equals和hashCode

    前言 在程序设计中,有很多的“公约”,遵守约定去实现你的代码,会让你避开很多坑,这些公约是前人总结出来的设计规范. Object类是Java中的万类之祖,其中,equals和hashCode是2个非常 ...