331-面经3

1、C++如何调用C语言函数接口?

因为C和C++生成符号的方式不同,所以C和C++语言之间的API接口是无法直接调用的。怎么办?

C语言的函数声明必须扩在extern “C”{}
在这里插入图片描述

__cpluscplus宏的作用是: C++编译器内置了这个宏,如果是C语言编译器来编译这个代码,没有这个宏,就直接使用C接口就可以了,如果是C++环境,因为有这个宏,extern C就会展开,告诉C++编译器这个函数sum是在C语言下生成的,调用它的话按照C语言的符号规则来去找它。按照C语言的符号规则就是sum,按照C++语言的符号规则就是sum_int_int。

2、C++什么时候会出现访问越界?

从本质上来说,访问越界就是,系统给我们分配了既定大小的内存,我们理应在这个既定大小的内存中访问,但是由于某些原因,我们访问这个内存超过了系统给我们分配的既定内存。

  1. 访问数组元素越界了
  2. vector容器访问 vector< int > vec; vec[2]; 这样也访问越界,vector是空容器,什么元素都没有
  3. string str; str[2] 空字符串,也是访问越界
  4. array(C++11提供的内存不可扩容)访问超过范围的下标也是访问越界
  5. 字符串处理,没有添加’\0’字符,导致访问字符串的时候越界了
  6. 使用类型强转,让一个大类型(派生类)的指针指向一块小内存(基类对象)了,然后指针解引用,访问的内存就越界了!

3、C++中类的初始化列表?

  • 可以指定对象成员变量的初始化方式,尤其是指定成员对象的构造方式;

  • 成员变量的初始化方式,初始化顺序是和定义的先后顺序有关和在初始化列表出现的顺序是没有关系的。

4、C和C++的区别?

C++支持:

  1. 引用(是一种更安全的指针)
  2. 函数重载
  3. new/delete 和C的malloc/free有区别
  4. const, inline,带默认值参数的函数
  5. 模板,泛型编程
  6. 类和对象 OOP =》采用设计模式
  7. STL标准库
  8. 有异常(try-catch-throw) 智能指针 运算符重载(让对象的运算和内置类型一样)

5、C和C++的内存分布有什么区别?

用户区:

  • reserve,保留区(从0开始,不能读也不能写)
  • .text
  • .rodata (只能读不能写)
  • .data
  • .bss
  • heap
  • stack
  • 命令行参数和环境变量

内核区:

  • ZONE_DMA
  • ZONE_NORMAL(.text .rodata .data. bss. heap stack)
  • ZONE_HIGHMEM

所有进程都有自己的用户空间,共享内核空间!

6、int* const p和const int *p区别?

int * const p 这个const修饰的是指针p,这个p不能修改,但是*p可以修改
const int *p 这个const修饰的是 * p,*p不能修改,但是p可以修改。

7、malloc和new区别?

  1. malloc按字节开辟内存 ,new底层也是通过malloc开辟内存,但是new还可以提供初始化。
  2. malloc开辟内存失败返回的是nullptr,而 new开辟失败,抛出bad_alloc类型的异常
  3. malloc 是调用C的库函数 new是operator new,是运算符的重载函数
  4. malloc 不管是开辟单个的内存还是数组的内存,方式都是一样的。
    而new开辟单个的是 new int(10); 开辟内存数组的是new int[20] (); 没有new int[20] (40)这样的功能。

8、map&set容器的实现原理?

  • set称作集合,只存储key;
  • map映射表,存储[key,value]键值对,
  • 它们的底层数据结构都是红黑树,都是通过key进行元素比较

9、shared_ptr引用计数存在哪里?

定义一个shared_ptr< int > ptr(new int)的智能指针对象时,该智能指针对象本身的内存是8个字节,如下图所示:

在这里插入图片描述
把智能指针管理的外部资源以及引用计数资源都画出来的话,就是如下图的展示:
在这里插入图片描述
堆上分配的!

STL、map底层、deque底层、vector里的empty()和size()的区别、函数对象?

STL标准容器 :

  • 顺序容器(vector,deque,list)
  • 容器适配器(stack,queue,priority_queue)
  • 关联容器(有序(set和map)和无序(底层是链式哈希表),map底层是红黑树)
  • 近容器 数组,string,bitset 迭代器 泛型算法

deque底层是动态开辟的二维数组
deque的实现有这2个宏 ,一维默认size是2
在这里插入图片描述

比如说用整型实例化deque,二维大小就是1024
deque底层内存不是连续的, 正在开辟的二维数组
在这里插入图片描述

vector里的empty()和size():
在这里插入图片描述
在这里插入图片描述
用last-first;

  • first指向的是vector底层内存的起始地址;
  • last指向的是最后一个有效元素的后继位置;
  • end指向的是内存的末尾地址;

函数对象:
函数对象(拥有()运算符重载函数)

使用在泛型算法当中:
operator() test(); test.operator()(); sort find_if priority_queue set map

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
《java面经-百度准入职老哥整理.pdf》是一份关于百度准入职面试的Java面经整理。这份面经是由百度准入职的老哥整理而成,其中记录了一些面试时可能会遇到的问题以及解答方法。 这份面经对于准备参加百度准入职面试的人来说非常有价值。首先,它列出了一些常见的面试问题,涵盖了Java语言的各个方面,包括基础知识、数据结构与算法、设计模式、多线程、网络编程等等。通过仔细研究和复习这些问题的答案,可以帮助面试者全面了解Java语言的特性和应用。 其次,这份面经提供了问题的解答思路和方法,帮助面试者理清思路,正确回答问题。这对于很多面试者来说特别有帮助,因为在面试时有时会遇到一些棘手的问题,有了这份面经的指导,面试者可以更好地掌握应对策略。 不过需要注意的是,面经作为一份参考资料,不能完全依赖于它来准备面试。面试官可能会问一些不在面经中列出的问题,因此考生还是需要自己对Java语言有充分的了解,并能够熟练运用。同时,面试官还会关注考生的沟通能力、解决问题的能力以及对新技术的学习和掌握能力。 总体来说,《java面经-百度准入职老哥整理.pdf》是一份非常宝贵的资料,可以帮助面试者对Java面试中可能会遇到的问题有更深入的了解,提供了解答思路和方法。但记住,面试准备还需要多方面的知识积累和实践经验的积累,才能在面试中展现自己的优势。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liufeng2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值