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;
网友评论