美文网首页
阿里测试题

阿里测试题

作者: 杰伦哎呦哎呦 | 来源:发表于2018-08-11 14:41 被阅读0次

1 熟悉哪种C/C++编译器?请列出该编译器的常用编译选项并附说明

1 VS2017

windows下VS2017,对工程配置比较了解,都是GUI设置的。最常见就是dll库和include路径的设置,否则找不到函数体链接报错。还有平台工具集版本,windows SDK版本设置这些比较重要,自己实习时候把项目组工程从VC2005搬到了VS2017上,所以有一些了解。

2 gcc编译器

2.1 Esc3个选项可以控制编译器完成到哪一步的工作

-E 完成预处理:

宏替换

头文件展开

注释去掉

xxx.c -> xxx.i

但是xxx.i还是c文件

-S 完成编译: 花费时间最多

xxx.i -> xxx.s

汇编文件

-c 完成汇编:

xxx.s -> xxx.o

二进制文件(库,二进制的源码,保密)

4默认是完成链接

xxx.o -> xxx(可执行)

gcc调用cpp进行预处理

gcc自己完成编译

gcc调用as完成汇编

gcc调用ld进行链接

只有编译是gcc自己实现的

2.2 其他gcc常用参数

gcc hello.c –o hello 不加名字,默认生成a.out

-v/--version:查看版本

-I:编译的时候指定头文件的路径(大写)

gcc sum.c –I ./include/ -o sum  在当前目录下的include文件夹内查找

-c:将汇编文件生成二进制.o文件,还是源代码(制作库)

-o:指定文件的名称

-g:gdb调试的时候需要加

-D:在编译的时候指定一个宏

使用场景:测试程序时,-D DEBUG这个宏会在预处理时加入

-Wall:显示警告信息

-On:优化代码,n是优化级别:1,2,3。其实我也不是很懂这个的具体作用。

2 程序有哪个段

是进程有哪些段吗?进程是运行的程序,如果是问进程在内存(虚拟地址空间)中的分布的话:

进程大体分为内核区和用户区,用户区有代码区、全局数据区、堆区、栈区、动态库加载区,还有命令行参数和环境变量。

内核区主要是内存管理、进程管理、文件系统这些,用户是无法读写内核区的,但是可以通过信号,mutex,sem信号量等内核对象来使用内核的一些功能。

3 C/C++中的static关键字的作用?

1用在类:

修饰类成员变量:所有类对象共享一个成员变量。

修饰成员函数:去除成员函数的this指针,在该函数中不能使用非static的成员变量(没了this指针找不到)。

2不用在类:

修饰局部变量:该变量为静态变量,只初始化一次,程序运行过程中一直存在。

修饰全局变量或函数:限制作用域,只在本文件内可见。

4C/C++中的const关键字的作用?

1 修饰成员函数:函数内部不能修改成员变量的值,可以发生函数重载。一般来说不修改成员变量的函数都应该添加const关键字,否则const对象就不能使用这个成员函数。

2 修饰类对象:只能调用const成员函数。意思是这个类中的成员变量不会被修改。

3 修饰类中成员变量:关键点:只能用初始化成员列表进行初始化。

4 修饰内置类型变量:变量只读。

5 c与cpp不同:c中const是给变量只读属性,其实还可以定义指针直接修改内存。cpp中变量存储在kv表中,只有在需要用到地址的时候才会分配内存,不能通过定义指针修改。

5完成宏定义ARRAY_LEN(ar),计算数组ar的元素个数

#define ARRAY_LEN(ar) ((sizeof(ar))/(sizeof(*ar)))

其中ar必须是数组的首地址(数组名),指针不行。

6 数组char a[] = {1, 2, 3, 4, 5, 6, 7, 8}; int *p = (int *)a + 1; 请问*p的值是多少?

(int *)a在此处的作用是将a的步长转化为4字节。所以(int *a)+1就指向了&a[4];

X86处理器是小端字节序,低地址放低字节,数字’5’在低地址,所以就对应低字节,1个字节相当于“256进制”。所以计算公式为:

5+6×256+7×256×256+8×256×256×256 = 134678021;

7 某结构体定义如下:struct S {char a, int b; short c;}; 请问S的大小是多少?附上你的解释。

内存对齐:

char对齐int,两个总共8byte,short在32位2byte的话,8是2的倍数,不用再内部对齐,总共10byte。但是整体要和int再对齐,应该是12byte。

对齐主要是为了保证能1次读取出数据。

8struct S中有一成员x,如何计算x在S中的偏移?

取地址,做减法

c++中:

S tmp;

std::cout << (int)&tmp.x-  (int)&tmp  << std::endl;

相关文章

网友评论

      本文标题:阿里测试题

      本文链接:https://www.haomeiwen.com/subject/tuddbftx.html