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

 

 

 

一. 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、付费专栏及课程。

余额充值