文章目录

  • 1.C语言的 malloc 和 C++ 中的 new 有什么区别
  • 2. 写一个 “标准”宏MIN
  • 3. 介绍 volatile 及其作用
  • 4. 一个参数可以既是const又是volatile吗
  • 5. a 和&a 有什么区别

1.C语言的 malloc 和 C++ 中的 new 有什么区别

new 、delete 是操作符,可以重载,只能在C++ 中使用;

malloc、free 是函数,可以覆盖,C、C++ 中都可以使用;

new 可以调用对象的构造函数,对应的delete 调用相应的析构函数;

malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数;

new 、delete 返回的是某种数据类型指针,malloc、free 返回的是void 指针;

注 意 : m a l l o c 申 请 的 内 存 空 间 要 用 f r e e 释 放 , 而 n e w 申 请 的 内 存 空 间 要 用 d e l e t e 释 放 , 不 要 混 用 ;

2. 写一个 “标准”宏MIN

#define min(a,b) ((a)<=(b)?(a):(b))

3. 介绍 volatile 及其作用

volatile 影响编译器编译的结果,volatile指出 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会 进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化)

比如:

volatile int i=10;
int j = i;
...
int k = i;

volatile告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。 而优化做法是,由于编译器 发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容 易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错;

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:

  1. 并行设备的硬件寄存器(如:状态寄存器)

  2. 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)

  3. 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。

我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。搞嵌入式的家伙们经常同硬件、中断、RTOS等等打交道,所有这些都要求用到volatile变量。不懂得volatile的内容将会带来灾难。假设被面试者正确地回答了这是问题(嗯,怀疑是否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。

  1. 一个参数既可以是const还可以是volatile吗?解释为什么。

  2. 一个指针可以是volatile 吗?解释为什么。

  3. 下面的函数有什么错误:

int square(volatile int *ptr){ return *ptr * *ptr;
}

下面是答案:

  1. 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。

  2. 是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向buffer的指针时。

  3. 这段代码有点变态,这段代码的目的是用来返指针ptr指向值的平方,但是,由于ptr指向一个volatile型参数,编译器将产生类似下面的代码:

int square(volatile int *ptr)
{ int a,b;a = *ptr;b = *ptr; return a * b;
}

由于*ptr的值可能被意想不到地该变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!
正确的代码如下:

long square(volatile int *ptr)
{int a;a = *ptr;return a * a;}

总结volatile的作用有如下两点:

  1. 告诉compiler不能做任何优化;
  2. 表示用volatile定义的变量会在程序外被改变,每次都必须从内存中读取,而不能把他放在cache或寄存器中重复使用;

一般在下列场所使用volatile

  • 状态寄存器一类的并行设备硬件寄存器。
  • 一个中断服务子程序会访问到的非自动变量。
  • 多线程间被几个任务共享的变量。

注 意 : 虽 然volatile在 嵌 入 式 方 面 应 用 比 较 多 , 但 是 在 P C 软 件 的 多 线 程 中 , volatile修 饰 的 临 界 变 量 也 是 非 常 实 用 的 ;

参考文章:
C语言中volatile的用法及意义

4. 一个参数可以既是const又是volatile吗

这个其实在第三个题已经说了,肯定是可以的,二者目的不同;

可 以 , 用 c o n s tv o l a t i l e同 时 修 饰 变 量 , 表 示 这 个 变 量 在 程 序 内 部 是 只 读 的 , 不 能 改 变 的 , 只 在 程 序 外 部 条 件 变 化 下 改 变 , 并 且 编 译 器 不 会 优 化 这 个 变 量 。 每 次 使 用 这 个 变 量 时 , 都 要 小 心 地 去 内 存 读 取 这 个 变 量 的 值 , 而 不 是 去 寄 存 器 读 取 它 的 备 份 。注 意 : 在 此 一 定 要 注 意 c o n s t 的 意 思 , const 只 是 不 允 许 程 序 中 的 代 码 改 变 某 一 变 量 , 其 在 编 译 期 发 挥 作 用 , 它 并 没 有 实 际 地 禁 止 某 段 内 存 的 读 写 特 性 。

5. a 和&a 有什么区别

& a : 其 含 义 就 是 “ 变 量 a 的 地 址 ” ,在C++中亦有引用的意思,通过内存地址来操作对象本身,属于引用传递;

*a: 用 在 不 同 的 地 方 , 含 义 也 不 一 样 。

  • 在声明语句中,*a只说明a是一个指针变量,如int *a
  • 在其他语句中,*a前面没有操作数且a是一个指针时,*a代表指针a指向的地址内存放的数据,如b=*a
  • *a前面有操作数且a是一个普通变量时,a 代 表 乘 以 a , 如 c = b*a

面试准备每日五题:C++(二)——mallocnew、宏、volatile、constvolatile、(a)和(a)相关推荐

  1. 面试准备每日五题:C++(七)——左值右值、面向对象、四种cast转换、拷贝构造函数赋值、虚函数多态

    文章目录 一. 什么是右值引用,跟左值又有什么区别? 二. 面向对象的三大特征 三. c++中四种cast转换 四.拷贝构造函数和赋值运算符的认识 五. 对虚函数和多态的理解 一. 什么是右值引用,跟 ...

  2. 面试准备每日五题:C++(六)——CC++、staticconstextern、sizeof strlen、指针引用、数组指针指针数组函数指针

    文章目录 一.C和C++的区别是什么? 二.关键字static.const.extern作用 三.sizeof和strlen的区别 四.指针和引用的区别 五 .指针数组.数组指针.函数指针 一.C和C ...

  3. 面试准备每日五题:C++(十)——mapset、set查找、迭代器实现、set低层原理

    文章目录 1. 为何map和set的插入删除效率比其他序列容器高,为何map和set每次Insert之后,以前保存的iterator不会失效? 2. 当数据元素增多时(从10000到20000),ma ...

  4. 面试准备每日五题:C++(四)——typedefdefine、指针常量、队列栈、地址赋值、C和C++结构体

    文章目录 1. typedef 和define 有什么区别 2. 指针常量与常量指针区别 3. 简述队列和栈的异同 4. 设置地址为0x67a9 的整型变量的值为0xaa66 5.C语言的结构体和C+ ...

  5. 面试准备每日五题:C++(九)——vector、list、deque、priority_queue、mapset

    文章目录 1. 正确释放vector的内存(clear(), swap(), shrink_to_fit()) 2. list的底层原理 3. 什么情况下用vector,什么情况下用list,什么情况 ...

  6. 面试准备每日五题:C++(八)——重写重载隐藏、vector相关

    文章目录 1. 重写.重载和隐藏 2. 链表和数组有什么区别 3. vector的底层原理 4. vector的reserve和resize 5.vector迭代器失效的情况 1. 重写.重载和隐藏 ...

  7. 面试准备每日五题:C++(五)——野指针、句柄指针、newdeletemallocfree、extern、类成员权限

    文章目录 1. 如何避免"野指针" 2. 句柄和指针的区别和联系是什么? 3. new/delete与malloc/free的区别是什么 4. 说一说extern"C&q ...

  8. 面试准备每日五题:C++(三)——全局局部变量、内存分配、strcpysprintfmemcpy、函数指针、引用

    文章目录 1. 全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的? 2. 简述C.C++程序编译的内存分配情况 3. 简述strcpy.sprintf 与memcpy 的区别 ...

  9. 面试准备每日五题:C++(一)——变量定义声明、#ifdef #else、结构体赋值、sizeof strlen、C和C++的static

    文章目录 1 变量的声明和定义有什么区别? 2 简述#ifdef.#else.#endif和#ifndef的作用 3 结构体可以直接赋值吗? 4 sizeof 和strlen 的区别 5 C 语言的关 ...

最新文章

  1. 阿里发布AliGenie2.0系统,“百箱大战”用上视觉武器
  2. 李开复口中的“联邦学习” 到底是什么?| 技术头条
  3. javascript 判断变量是否为null
  4. jQuery 实现 select模糊查询 反射机制
  5. Java单例模式双重检查锁定中volatile关键字的作用
  6. SoftPool算法详解
  7. MongoDB 自动删除集合中过期的数据——TTL索引
  8. 在C++中用虚函数的作用是什么? 为什么要用到虚函数?
  9. 二叉树的建立与遍历完整代码_腾讯面试官这样问我二叉树,我刚好都会
  10. netflix 开源_手工3D打印机,Netflix上的开源等
  11. MVC Json方法里的一个坑
  12. 计算机网络—路由器(Cisco Packet Tracer)常用的命令总结
  13. PIC单片机开发环境搭建
  14. 谷歌被曝出滥用苹果后门收集用户数据
  15. dsp 28377 +RX-8025T 实现RTC功能
  16. Cadence PSpice 仿真4:共射极运放静态工作点仿真图文教程
  17. Spring Boot 2.x 基础案例:整合Dubbo 2.7.3+Nacos1.1.3(配置中心)
  18. discard是什么意思啊(discard是什么意思翻译)
  19. 在单片机C语言中const是什么意思
  20. microsoft authenticator 华为等手机无谷歌框架使用方法

热门文章

  1. 上市公司与不上市公司的区别
  2. Stackoverflow 最受关注的 10 个 Java 问题
  3. android形状drawable
  4. Google Protocol Buffer
  5. CentOS6.4下Mysql数据库的安装与配置
  6. 使用信号实现异步通知机制的例子
  7. MVVM教程[资源+分析]
  8. Spring3 报org.aopalliance.intercept.MethodInterceptor问题解决方法
  9. 【转】【51CTO 网+】怎样做一款让用户来电的产品
  10. UVA 11237 - Halloween treats(鸽笼原理)