您的位置:首页 > 编程语言 > C语言/C++

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

2016-06-23 00:04 225 查看
说来惭愧,时间紧急,没有准备,唉,自作孽……

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是否需要扩充。

总结

题目不难,平时多积累!努力成就梦想,加油!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息