趋势科技笔试查缺补漏17.09.17

来源:互联网 发布:unity3d lua 热更新 编辑:程序博客网 时间:2024/05/27 08:13

1、sizeof(i++):

并不会执行i++,因为sizeof不是一个函数。

sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。
它并不是函数。
根据C99规范, sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义, j = sizeof(i++); 在编译的时候被翻译成 j=sizeof((i++的数据类型)) 也就是 j = sizeof(int); 也就是 j= 4; (32bit系统,如果是16位系统,则j=2) 然后才会继续编译成最终的程序,当然在最终程序执行的时候,自然不会执行任何++i了。
2、规则链:

    表由链组成,链是一些按顺序排列的规则的列表。

    iptables一共有INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING五个规则链。对应的规则链可表述为:

    INPUT:网络数据包流向服务器

    OUTPUT:网络数据包从服务器流出

    FORWARD:网络数据包经服务器路由

    PREROUTING, (prerouting, pre-route,预路由, 到达前)网络数据包到达服务器时可以被修改

    POSTROUTING, (postrouting, post-route,流出前) 网络数据包在即将从服务器发出时可以被修改

3、shared_ptr是一种智能指针(smart pointer),作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象。这便是所谓的引用计数(reference counting)。

auto_ptr由于它的破坏性复制语义,无法满足标准容器对元素的要求,因而不能放在标准容器中;如果我们希望当容器析构时能自动把它容纳的指针元素所指的对象删除时,通常采用一些间接的方式来实现,显得比较繁琐。boost库中提供了一种新型的智能指针shared_ptr,它解决了在多个指针间共享对象所有权的问题,同时也满足容器对元素的要求,因而可以安全地放入容器中。


4、

1)一个类中若有虚函数,(不论是自己的虚函数,还是继承而来的),那么类中就有一个成员变量:虚函数指针,这个指针指向一个虚函数表,虚函数表的第一项是类的typeinfo信息,之后的项为此类的所有虚函数的地址。

2)假设经过成员对齐后的类的大小为size个字节。那么类的sizeof大小可以这么计算:size + 4*(虚函数指针的个数n)。代码中,DerivedFromTwo继承自2个分支,所以有2个虚函数指针,所以sizeof大小为0 + 4* 2 = 8。

3)带有虚函数的类的sizeof大小,实际上和虚函数的个数不相关,相关的是虚函数指针。

no_virtual没有虚函数,sizeof(no_virtual)=4,类no_virtual的长度就是其成员变量整型a的长度;
one_virtual有一个虚函数,sizeof(one_virtual)=8;
two_virtual有两个虚函数,sizeof(two_virtual)=8; 有一个虚函数和两个虚函数的类的长度没有区别,其实它们的长度就是no_virtual的长度加一个void指针的长度,它反映出,如果有一个或多个虚函数,编译器在这个结构中插入一个指针( V P T R)。在one_virtual 和two_virtual之间没有区别。这是因为V P T R指向一个存放地址的表,只需要一个指针,因为所有虚函数地址都包含在这个表中。

没有虚函数:sizeof(数据成员)的和 。
有虚函数:sizeof(数据成员)的和+(sizeof(V表指针)=4)


C++中类的成员函数,静态成员是不占类的大小的。

如果有虚函数,类的大小+4个字节。(用来存放vptr)

如果是虚继承,虚基类的大小不算了,但是要算4个字节(用来存放指向虚基对象的指针)


原创粉丝点击