一. New 和 Malloc 的区别
1,malloc
与
free
是
C++/C
语言的标准库函数,
new/delete
是
C++
的运算符。它们都可用于申请动态内存和释放内存。
2,
对于非内部数据类型的对象而言,光用
maloc/free
无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于
malloc/free
是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于
malloc/free
。
3,
因此
C++
语言需要一个能完成动态内存分配和初始化工作的运算符
new
,以一个能完成清理与释放内存工作的运算符
delete
。注意
new/delete
不是库函数。
4,C++
程序经常要调用
C
函数,而
C
程序只能用
malloc/free
管理动态内存
new
是个操作符
,
和什么
"+","-","="...
有一样的地位
.
malloc
是个分配内存的函数
,
供你调用的
.
new
是保留字
,
不需要头文件支持
.
malloc
需要头文件库函数支持
.
new
建立的是一个对象
,
malloc
分配的是一块内存
.
new
建立的对象你可以把它当成一个普通的对象
,
用成员函数访问
,
不要直接访问它的地址空间
malloc
分配的是一块内存区域
,
就用指针访问好了
,
而且还可以在里面移动指针
.
简而言之:
new
是一个操作符,可以重载
;
malloc
是一个函数,可以覆盖
;
new
初始化对象,调用对象的构造函数,对应的
delete
调用相应的析构函数
malloc
仅仅分配内存,
free
仅仅回收内存
二. Class( 类 ) 与 Struct (结构体)的区别
从语法上,在
C++
中(只讨论
C++
中)。
class
和
struct
做类型定义时只有两点区别:
(一)默认继承权限。如果不明确指定,来自
class
的继承按照
private
继承处理,来自
struct
的继承按照
public
继承处理;
(二)成员的默认访问权限。
class
的成员默认是
private
权限,
struct
默认是
public
权限。
除了这两点,
class
和
struct
基本就是一个东西。语法上没有任何其它区别。
不能因为学过
C
就总觉得连
C++
中
struct
和
class
都区别很大,下面列举的说明可能比较无聊,因为
struct
和
class
本来就是基本一样的东西,无需多说。但这些说明可能有助于澄清一些常见的关于
struct
和
class
的错误认识:
(
1
)都可以有成员函数;包括各类构造函数,析构函数,重载的运算符,友元类,友元结构,友元函数,虚函数,纯虚函数,静态函数;
(
2
)都可以有一大堆
public/private/protected
修饰符在里边;
(
3
)虽然这种风格不再被提倡,但语法上二者都可以使用大括号的方式初始化:
A a = {1, 2, 3};
不管
A
是个
struct
还是个
class
,前提是这个类
/
结构足够简单,比如所有的成员都是
public
的,所有的成员都是简单类型,没有显式声明的构造函数。
(
4
)都可以进行复杂的继承甚至多重继承,一个
struct
可以继承自一个
class
,反之亦可;一个
struct
可以同时继承
5
个
class
和
5
个
struct
,虽然这样做不太好。
(
5
)如果说
class
的设计需要注意
OO
的原则和风格,那么没任何理由说设计
struct
就不需要注意。
(
6
)再次说明,以上所有说法都是指在
C++
语言中,至于在
C
里的情况,
C
里是根本没有
“class”
,而
C
的
struct
从根本上也只是个包装数据的语法机制。
最后,作为语言的两个关键字,除去定义类型时有上述区别之外,另外还有一点点: “class” 这个关键字还用于定义模板参数,就像 “typename” 。但关键字 “struct” 不用于定义模板参数。
三. Class 中 static 加与不加的区别
静态数据成员
在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。
使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。
静态数据成员的使用方法和注意事项如下:
1
、静态数据成员在定义或说明时前面加关键字
static
。
2
、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:
<
数据类型
><
类名
>::<
静态数据成员名
>=<
值
>
这表明:
(1)
初始化在类体外进行,而前面不加
static
,以免与一般静态变量或对象相混淆。
(2)
初始化时不加该成员的访问权限控制符
private
,
public
等。
(3)
初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
3
、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。
4
、引用静态数据成员时,采用如下格式:
<
类名
>::<
静态成员名
>
如果静态数据成员的访问权限允许的话
(
即
public
的成员
)
,可在程序中,按上述格式来引用静态数据成员。
静态成员函数
静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。
在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对象来引用。
四. Vi 的自动排版与 缩进
自动排版: 命令行模式 (command mode) 下 , 键盘输入 gg=G( 或者 1G =G)
当然也可以输入 ggvG=
gg
将光标移到文件第一行第一列
v
切换模式为可视模式
G
表示将光标移到文件末尾
上面相当于将文件内容全选,
=实现自动排版
当然也可以修改配置文件进行设置。
使用自动缩进可能需要设置,下面介绍调整缩进的方法:
Ctrl-T 右缩 ; Ctrl-D 左缩 ; ^Ctrl-D 删除行首空格
>> |
右缩进 |
<< |
左缩进 |
n<< 或 n>> |
缩进多行,如 4>> |
使用 < 或 > 进行缩进,也可使用 n< 或 n> 多节缩进
可以用 = 对选中的部分进行自动缩进。
在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓平台,实际上包含两个概念:体系结构( Architecture )、操作系统( Operating System )。同一个体系结构可以运行不同的操作系统;同样,同一个操作系统也可以在不同的体系结构上运行。举例来说,我们常说的 x86 Linux 平台实际上是 Intel x86 体系结构和 Linux for x86 操作系统的统称;而 x86 WinNT 平台实际上是 Intel x86 体系结构和 Windows NT for x86 操作系统的简称。
有时是因为目的平台上不允许或不能够安装我们所需要的编译器,而我们又需要这个编译器的某些特征;有时是因为目的平台上的资源贫乏,无法运行我们所需要编译器;有时又是因为目的平台还没有建立,连操作系统都没有,根本谈不上运行什么编译器。
交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如 C 代码)编译( compile )成计算机可以识别和执行的二进制代码。比如,我们在 Windows 平台上,可使用 Visual C++ 开发环境,编写程序并编译成可执行程序。这种方式下,我们使用 PC 平台上的 Windows 工具开发针对 Windows 本身的可执行程序,这种编译过程称为 native compilation ,中文可理解为本机编译 。然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的 ARM 平台,其一般的静态存储空间大概是 16 到 32MB ,而 CPU 的主频大概在 100MHz 到 500MHz 之间。这种情况下,在 ARM 平台上进行本机编译就不太可能了,这是因为一般的编译工具链( compilation tool chain )需要很大的存储空间,并需要很强的 CPU 运算能力。为了解决这个问题,交叉编译工具 就应运而生了。通过交叉编译工具,我们就可以在 CPU 能力很强、存储控件足够的主机平台上(比如 PC 上)编译出针对其他平台的可执行程序。
要进行交叉编译,我们需要在主机平台上安装对应的交叉编译工具链( cross compilation tool chain ),然后用这个交叉编译工具链编译我们的源代码,最终生成可在目标平台上运行的代码。常见的交叉编译例子如下:
1 、在 Windows PC 上,利用 ADS ( ARM 开发环境),使用 armcc 编译器,则可编译出针对 ARM CPU 的可执行代码。
2 、在 Linux PC 上,利用 arm-linux-gcc 编译器,可编译出针对 Linux ARM 平台的可执行代码。
3 、在 Windows PC 上,利用 cygwin 环境,运行 arm-elf-gcc 编译器,可编译出针对 ARM CPU 的可执行代码。