几个嵌入式面试题—自己的经历

一. 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 的可执行代码。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值