【编程之法】A.1 语言基础

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

{
    vector<T>().swap(x);   // clear x reallocating
}

应该很容易理解吧?就是vector()定义了一个匿名变量,将x的内容swap给这个对象,然后这个匿名对象一旦离开花括号的作用域,就会被销毁掉(不过不知道编译器是否真的是这样实现的,还得进一步做实验测试)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值