某厂几道C/C++面试题

说来惭愧,时间紧急,没有准备,唉,自作孽……


1. 如何快速判断一个unsigned int是不是2的n次方

最快解法思路: return a&(a-1)


2. 给定结构体中一个成员的地址,求结构体的首地址

这是Linux内核代码中用的一个函数或者说方法,之前从未接触过,所有有点懵逼…..

具体定义如下:
#define list_entry(ptr, type, member) ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))

一点点来看:

  • (type *)0:就是将地址0开始的地方转化为一个type类型的指针

  • &((type *)0)->member:取member成员的地址

    • 这个因为从0地址开始,所以这个地址就是member成员的偏移量
  • (unsigned long):强制转换

  • (type *)((char *)(ptr):这个ptr就是结构体成员的地址,用这个地址减去member的偏移量,就是结构体的首地址了


3. vector中erase的实现(不用写重载,随便实现一个)


  • 对于vector容器,因为是类似数组连续内存的存放方式,所以删除一个元素只能一个个往前挪

为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。

iterator erase(iterator _p) {
    copy(_p + 1, end(), _p);
    _Desotry(_Last - 1, _Last);
    --_Last;
    return(_p);
  • vector的内存管理遵循只增不减的原则,所以资源不会被释放,只是end指针向前移动了,利用iterator不能访问原vector中最后一位了,但是[]可以强制访问。

    • 由于vector的内存占用空间只增不减,比如你首先分配了10,000个字节,然后erase掉后面9,999个,留下一个有效元素,但是内存占用仍为10,000个。

    • 所有内存空间是在vector析构时候才能被系统回收。

    • size()成员指当前拥有的元素个数;

    • capacity()成员指当前(容器必须分配新存储空间之前)可以存储的元素个数。

    • reserve()成员可以用来控制容器的预留空间。

  • vector另外一个特性在于它的内存空间会自增长,每当vector容器不得不分配新的存储空间时,会以加倍当前容量的分配策略实现重新分配。例如,当前capacity为50,当添加第51个元素时,预留空间不够用了,vector容器会重新分配大小为100的内存空间,作为新连续存储的位置。

    • 如果实现push_back, 则必须考虑当前容器的capacity是否需要扩充。




总结

题目不难,平时多积累!努力成就梦想,加油!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值