- C++虚拟函数
请描述C++中虚拟函数的实现机制。
参考我的博文:http://blog.csdn.net/jacketinsysu/article/details/51043768 - 指针
请描述指针数组和数组指针的区别。
指针数组是一个数组,数组的元素是某种类型的指针;数组指针是一个指针,它所指向的内存,分布了一个数组。 - malloc-free
请描述malloc-free和new-delete的区别。
参考:http://blog.csdn.net/hackbuteer1/article/details/6789164
总结起来就是,new-delete是C++支持的操作符,使用new的时候自动会做计算所需要的内存的大小并进行申请,自动调用构造函数进行初始化;使用delete的时候会自动释放内存,在此之前,如果内存部分是对象的话,还会自动调用析构函数;而malloc-free是函数来的,malloc只负责申请指定大小的空间(即需要自己计算需要多少空间),malloc和free都不会关心所面向的内存是否是关于对象的。 - sizeof和strlen的区别
strlen只是一个库函数,只能用来计算C风格的字符串的大小;而sizeof则是一个操作符,在编译时就可以进行处理的,可以计算任何占有内存的变量、结构体、对象的大小。同时,当sizeof计算C风格的字符串时,它的结果比strlen多了1,因为sizeof计算的是该字符串实际占用的内存大小(包含了终结符’\0’),而strlen只计算字符串的长度。 - 函数调用
请描述函数调用的整个过程。
其实细致点问,应该是——在函数A中调用函数B的过程是怎样的。不同的编译器的实现不同,不过共同点大致是:
- B的参数入栈,一般是从最后一个参数开始入栈(这个特性支持可变参数,从B函数中如何通过栈指针访问各个参数的角度想想为什么)
- 返回地址入栈(待会B执行完,根据这个地址返回A中执行调用B下一条语句)
- 此时还需要“保留现场”,即对B中要用到的寄存器的值进行保存
- B的函数体的执行。。。
- B函数执行结束,根据3中“保留现场”的信息,恢复被影响到的寄存器的值,根据保存的“返回地址”,返回到A中继续执行。
C++ STL中的vector
C++ STL中的vector的push_back成员函数的实现。
push_back其实是有个“capacity指数增长“的策略的策略的,只需要一幅图就足以说明一切了:
哦哦,还有试验代码:#include <stdio.h> #include <vector> using namespace std; int main() { vector<int> v; printf("First, v.size()=%d, v.capacity()=%d\n", int(v.size()), int(v.capacity())); for (int i = 0; i < 129; ++i) { v.push_back(i); printf("v.size()=%d, v.capacity()=%d\n", int(v.size()), int(v.capacity())); } return 0; }
C++ STL中的clear
在C++ STL中,调用clear时,实际上是做了什么?如果要真正释放内存,应该怎么做?
clear只是将容器的size清除为0而已,capacity不变,即容器对象仍然占用那部分内存。
想要彻底释放那块内存,cplusplus.com上面建议这样子写:
{
vector<T>().swap(x); // clear x reallocating
}
应该很容易理解吧?就是vector()定义了一个匿名变量,将x的内容swap给这个对象,然后这个匿名对象一旦离开花括号的作用域,就会被销毁掉(不过不知道编译器是否真的是这样实现的,还得进一步做实验测试)。