互联网公式笔试中经常遇到的有关问题
C++
1.sizeof,字节对齐问题。
struct mystruct1{
short a1;
short a2;
short a3;
};
struct mystruct2{
bool b1;
bool b2;
char c;
int i;
};
struct mystruct3{
bool b1;
bool b2;
};
struct mystruct4{
bool b1;
int i;
bool b2;
};
分析:在32位系统中测试sizeof(mystruct1)=6,sizeof(mystruct1)=8,sizeof(mystruct3)=2,sizeof(mystruct4)=12,sizeof(bool)=1。在32位系统下,bool占一个字节,结构体占的总字节数是该结构体中最大类型所占字节数的整数倍。mystruct4中由于第一个bool和第二个bool不连续出现,因此各占4个字节。下面是32位系统和64位系统下,各数据类型所占的字节数
32位操作系统:
类型 | 占字节数 |
---|---|
char | 1个字节(固定) |
*(即指针变量) | 4个字节(32位机的寻址空间是4个字节) |
short int | 2个字节(固定) |
int | 4个字节(固定) |
unsigned int | 4个字节(固定) |
float | 4个字节(固定) |
double | 8个字节(固定) |
long | 4个字节(VS下验证是4个字节) |
unsigned long | 4个字节(变化,其实就是寻址空间的地址长度数值;VS下验证是4个字节) |
long long | 8个字节(固定) |
64位操作系统:
类型 | 占字节数 |
---|---|
char | 1个字节(固定) |
*(即指针变量) | 8个字节 |
short int | 2个字节(固定) |
int | 4个字节(固定) |
unsigned int | 4个字节(固定) |
float | 4个字节(固定) |
double | 8个字节(固定) |
long | 8个字节 |
unsigned long | 8个字节(变化,其实就是寻址控件的地址长度数值) |
long long | 8个字节(固定) |
除了*与long随操作系统子长变化而变化外,其他的都固定不变(32位和64相比)。
bool 1个字节 char 1个字节 int 4个字节 float 4个字节 double 8个字节 long long 8个字节。
2.(360)下面哪种c/C++分配内存的方法将分配的空间初始化为0
A.realloc B.malloc C.new D.calloc
答案: D,C语言跟内存申请相关的函数主要有 alloca、calloc、malloc、free、realloc等。alloca是向栈申请内存,因此无需释放;malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间;calloc则将初始化这部分的内存,设置为0;realloc则对malloc申请的内存进行大小的调整。堆由用户管理,即由用户释放内存,堆只能动态分配,堆是不连续的;栈由操作系统管理,可动态也可静态分配,栈是连续的。
- 从静态存储区域分配.
内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量、static变量。 - 在栈上创建
在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 - 从堆上分配,亦称动态内存分配.
程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由用户决定,使用非常灵活,但问题也最多.
3.(奇虎360)下面哪个选项是错误的?
A.堆和栈都可以动态分配
B.堆和栈都可以静态分配
C.堆的大小仅受操作系统影响,栈的大小一般比较小
D.在堆上频繁new/delete容易产生内存碎片,栈没有这个问题
答案: B
- 栈(操作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈,栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
- 堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
- 全局区(静态区):全局变量和静态变量的存储是放在一块的,初始化的 全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另 一块区域。程序结束后由系统释放。
- 文字常量区:常量字符串就是放在这里的。程序结束后由系统释放 。
- 程序代码区:存放函数体的二进制代码。
- 堆(数据结构):堆可以被看成是一棵树,如:堆排序。
- 栈(数据结构):一种后进先出的数据结构。
4.(奇虎360)
struct sttest{
int a;
bool b;
char d;
short c;
union
{
char e[200];
struct
{
long f;
int g[40];
}h;
}i;
int (*j)(int v,char *r);
};
64位系统下sizeof(sttest)是多大?
答案: int占4个字节,bool占1个字节,char占1个字节,short占2个字节,union中char型数据占具的空间最大,因此union占200个字节,函数指针占8个字节。整个结构体占字节数必须是最大类型(8字节)的整数倍,而int,bool,char和short合起来占8个字节,因此sizeof(sttest)=8+200+8=216个字节。
Linux系统
1.(奇虎360)linux系统中,对file.sh执行#chmod 645 file.sh后,该文件的权限是什么?
答案::-rw-r—r-x。每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。以下列文件为例子来说明该命令,假如执行命令ls -al之后得到:
-rw-r–r– 1 root root 296K 11-13 06:03 log2012.log
第一列共有10个位置,第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录。从第二个字符开始到第十个共9个字符,3个字符一组,分别表示了3组用户对文件或者目录的权限。权限字符用横线代表空许可,r代表只读,w代表写,x代表可执行。
数字与字符对应关系如下:
r=4,w=2,x=1
若要rwx属性则4+2+1=7
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。
2.(奇虎360)for(i=0;i<4;i++){
fork();
printf(“-\n”);
}
打印多少个“-”
答案:
编译原理
1.2.(奇虎360)代码生成阶段的主要任务是
答案:把中间代码变换成依赖具体机器的目标代母
机器学习
1.(奇虎360)下列对l1范数正则化描述不正确的是
A.相当于MAP估计下引入高斯先验
B.产出更interpretable的model
C.防止overfitting
D.产出sparsity的model
答案: A,MAP估计中引入高斯先验,相当于加入L2正则化。
数学
1.(奇虎360)5次同余式x^5=9mod41的解有哪些?
2.(奇虎360)确定下面的序列哪些不是图的序列?
A.(7,6,8,3,8,5)
B.(6,3,3,2,2)
C.(4,4,2,2,4)
D.(3,2,0,1,5)
版权声明:本文为博主原创文章,未经博主允许不得转载。