美文网首页
阿里测试题

阿里测试题

作者: 杰伦哎呦哎呦 | 来源:发表于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