2012九月笔试总结

2012.9.16 瑞晟笔试:
1.宏定义:求一年有多少秒?
#define (365*24*60*60)UL
就是那个UL特别注意,当时忘写了

2.写出volatile的三个例子

精确地说就是,优化器在用到这个变量时必须每次都小心地重新从内存里读取这个变量的值,而不是使用保存在寄存器里的备份。 下面是volatile变量的几个例子:

1) 并行设备的硬件寄存器(如:状态寄存器)
2) 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3) 多线程应用中被几个任务共享的变量

2012.9.17 华为面试:
1.虚指针是放在对象内存的高地址还是底地址?
这个在linux上gcc编译器做的实验,虚指针是放在对象的第一个开始的地方,后面才是数据成员。

2.怎样查看linux系统默认栈(文件句柄数目)的大小?怎样更改?最大是多少?

ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
max nice                        (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 16384
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024  //一个进程最多打开文件句柄数目
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
max rt priority                 (-r) 0
stack size              (kbytes, -s) 10240 //默认栈大小10M
cpu time               (seconds, -t) unlimited
max user processes              (-u) 16384
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

可以通过命令 ulimit -s 查看linux的默认栈空间大小M
1)通过命令 ulimit -s 设置大小值 临时改变栈空间大小:ulimit -s 102400, 即修改为100M(对于文件句柄同样是ulimit -n),但是重启或用户退出后就会恢复成原来的样子。
2)可以在/etc/rc.local 内 加入 ulimit -s 102400 则可以开机就设置栈空间大小
3)在/etc/security/limits.conf 中也可以改变栈空间大小。

ulimit -n 1048576这个是我的linux系统上实验出来的最大的进程打开文件句柄值,也就是1G,1024*1024,并发100w,也就是说我的操作系统作服务器的话,如果用单进程多线程并发的话,那么最大的连接数目就是100w多一点,其实已经很牛了单服务器的话。

3.UML画出魔兽世界模型
这个有点难。。

2012.9.22中兴

1.流媒体使用的协议是: C
A、sdp B、ppp C、rtsp D、ftp

RTSP(Real Time Streaming Protocol),实时流传输协议,是TCP/IP协议体系中的一个应用层协议,由哥伦比亚大学、网景和RealNetworks公司提交的IETF RFC标准。该协议定义了一对多应用程序如何有效地通过IP网络传送多媒体数据。RTSP在体系结构上位于RTP和RTCP之上,它使用TCP或RTP完成数据传输。HTTP与RTSP相比,HTTP传送HTML,而RTSP传送的是多媒体数据。HTTP请求由客户机发出,服务器作出响应;使用RTSP时,客户机和服务器都可以发出请求,即RTSP可以是双向的。

点对点协议(英语:Point-to-Point Protocol,PPP)工作在数据链路层(以OSI参考模型的观点)。它通常用在两节点间创建直接的连接。它主要用于利用串口线来连接两台计算机,现在也有用在宽带计算机连接上。很多因特网服务提供商(ISP)使用PPPoE给用户提供接入服务(例如,接入因特网,很大程度上已经代替了旧的标准像SLIP)。

PPP协议设计于HDLC协议之后,被设计用于代替数据链路层的非标准协议SLIP。它的设计者把很多当时在广域网上数据链路层协议中都没有考虑的额外特性都包含进来了。因此它被设计得非常灵活:它作为数据链路层(layer 2)协议既支持用于同步链路连接,也支持异步链路连接;并且可以支持多种网络层协议(如IP、IPX和AppleTalk)。PPP协议除了基本的成帧功能外,还包含两个部分:链路控制协议和网络控制协议。

2.restrict它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式.即它告诉编译器,所有修改该指针所指向内存中内容的操作都必须通过该指针来修改,而不能通过其它途径(其它变量或指针)来修改;这样做的好处是,能帮助编译器进行更好的优化代码,生成更有效率的汇编代码.如 int *restrict ptr, ptr 指向的内存单元只能被 ptr 访问到,任何同样指向这个内存单元的其他指针都是未定义的,直白点就是无效指针。

3.两个指针不可以相加,可以相减,可以比较。

4.函数的定义不可以嵌套,调用可以嵌套。即使在main函数中也不能嵌套定义,但是可以在main中和其他函数体中,声明一个函数。

5.冲突解决技术可以分为两类:开散列方法( open hashing,也称为拉链法,separate chaining )和闭散列方法( closed hashing,也称为开地址方法,open addressing )。这两种方法的不同之处在于:开散列法把发生冲突的关键码存储在散列表主表之外,而闭散列法把发生冲突的关键码存储在表中另一个槽内。

装载因子 = 表中载入的记录数/哈希表的长度(装填因子越小,冲突越小)

6.在多态的时候,子类的虚函数的返回值也必须和父类的一样,否则会编译错误。

7.静态变量能在头文件中声明并初始化,可以被包含在多个cpp文件中,多个cpp文件中的为同一个变量,改变一个值,其他的值也会发生改变。这个时候,其实static已经失去了它的作用。

8.假设有联合体a和b,那么可以a=b这样整体的赋值,但是不能直接cout<<a<<endl;这样整体的输出来。

9.
const int a = 1;
int *b = (int *)&a;
*b = 2;
cout<<a<<endl;
cout<<b<<endl;
先输出1,在输出2.网上找来的解析:
const int a=1;如果我们没有对a进行取地址或者其它与a地址相关的操作,a这个常变量在内存中其实是不存在的,也就是内存不为a分配地址的。程序运行时,代码中的所有的a都直接被替换成1,这样的话,既节省了内存又方便了操作。 但是如果对a的地址进行操作,例如:int *b = (int *)&a;那么a就会在内存中创建变量a,这样我们就可以对a的内存地址及其内容进行操作了。但按照上面的说法,指针b = &a,为什么指针b所指的内容和a中的内容不一样呢?为什么同样的地址,输出的值却不一样呢?这应该就是C++的const机制。 虽然对a进行有关地址的操作后,a会在内存中创建了a变量。但是const仍然会告诉a说:“虽然你在内存中创建了a变量,但是只有当有人想进行和你地址有关的操作时你才可以用这个内存中的a变量,代码中其余的所有a你依然还是给我全部替换成1。” 也就是说,凡是代码中与a地址无关的操作,那么代码中的a还是直接替换成1;凡是代码中与a地址有关的操作,那么使用的a其实是内存中的变量a! (注:内存地址中存的是int a=1,而不是const int a=1,const只是一种机制,并不是一种数据类型!)

10.关于I/O寄存器和普通RAM的一些内容:
1)I/O操作与内存操作的唯一区别在于,I\O操作有边际效应(貌似就是副作用)。
2)内存写操作的唯一结果就是在指定位置存储一个数值。
3)对内存进行优化的时候,过程是透明的,且效果良好,但对于I/O来说可能造成致命错误。

这个是个多选题,在网上查了下是一本英文书的译文的内容,这题目出的太不靠谱了也,网上找来的别人的一段译文:

   尽管硬件寄存器和内存之间有很强的相似性,  程序员在存取 I/O 寄存器的时候还是要格外小心,避免被CPU(或者编译器)优化所迷惑,  因为它可能修改你期待的 I/O 行为.
   I/O 寄存器和 RAM 一个主要的不同是:I/O 操作会带来副作用, 而内存操作没有。一个内存写操作的唯一效果是存储一个值到某个地址,  并且一个内存读操作返回上次写到该地址的值. 由于内存存取速度对CPU 性能是至关重要的, 这种无副作用的操作已被多种方式优化: 值被缓存,  并且读/写指令被重新编排.
    编译器能够缓存数据值到CPU 寄存器而不写到内存, 并且即使数据值已经存储到内存, 读和写操作都能够在缓冲内存中进行而不是直接接触物理RAM. 此外,指令重编排可能在编译器级别或在硬件级别发生: 很多情况下,如果一个指令以不同于在程序文本中出现的顺序来执行(例如, 为避免在 RISC 流水线中的互锁),它能够执行得更快, 
   对于传统内存(至少在单处理器系统)来说,这些优化是透明和有益的。驱动直接存取I/O寄存器的主要目的是能提高CPU性能。然而,这些优化对正确的 I/O 操作可能是致命的. 处理器无法预见这种情形, 一些其他的操作(在一个独立处理器上运行, 或者发生在一个 I/O 控制器的事情)依赖内存存取的顺序. 编译器或者 CPU 可能只尽力胜过你并且重编排你请求的操作; 结果可能是奇怪的错误而非常难于调试. 因此, 一个驱动必须确保没有进行缓冲并且在存取寄存器时没有发生读或写的重编排.

2012.9.23新大陆记
1.linux命令
od - dump files in octal and other formats
vim -这个就是vim,也就是vi
2.友元
友元函数,友元类,等关系都是私有关系,不能通过,继承,传递等关系产生新的友元关系,换句话说,这个关系是无论采用什么方法都不可以继承和传递的。

2012 9.24凯易迅

1.输出结果
#include <iostream>
#include <list>
#include <set>
using namespace std;

int main()
{
        char s[100] = "us";
        char name[100] = "Angle";
        sprintf(s, "%s join %s", name, s);
        cout<<s<<endl;
        return 0;
}
为: Angel join Angel join

2.声明一个函数,这个函数返回一个float数组指针,假设这个数组指针指向有10个元素的float数组
应该为:float (*f())[10]
float (*p)[10];
p = f(); //OK

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值