Repository navigation
Expand file tree
/
Copy pathC and C++.txt
More file actions
258 lines (174 loc) · 12.1 KB
/
Copy pathC and C++.txt
File metadata and controls
258 lines (174 loc) · 12.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
// list some C & C++ interviw questions
// TL;DR for C++ questions
// C and glibc basics
1、printf 函数的返回值是什么,表示什么?
2、scanf 函数的返回值是什么,表示什么?
3、snprintf 函数第二个参数表示什么意思? 返回值表示什么意思?
tips:函数原型为 int snprintf(char *str, size_t size, const char *format, ...);
4、简单描述下 atof 的实现?
5、double a = 0.1;printf("%.5f\n",a); printf 中 .5 什么意思?
6、LD_LIBRARY_PATH 这个环境变量有什么作用?能解决什么问题?
7、怎样查看一个可执行文件都链接了哪些动态库?
8、静态库 和 动态库 有哪些区别?
9、#define SQR(x) ((x)*(x)) 这个宏定义用来计算x的平方,会有哪些问题,解决方法是什么?
10、 内核中宏定义 #define func(x) do{ do_something }while(0) 表示什么意思,为什么这样写?
11、isspace isalpha 等函数的参数是什么?如果直接将一个char类型赋值给这个函数可能会导致什么问题?怎么改正?
(tips:考虑char类型的符号位扩展,尤其是通过字符指针传入参数时)
12、getchar 函数的返回值是什么?为什么这么设计?
13、在struct中使用位域时,如果类型为int但是只有1bit,会有什么问题?
(tips:考虑符号位,最好使用unsigned int)
14、64位机器上 sizeof(long double) 输出多少?
15、strcpy 和 strncpy 有什么区别?
(tips:考虑'\0'填充)
16、fflush函数的作用是什么?输入流可以使用吗?
17、struct中的padding受哪些因素影响?
18、32位机器上,读一个32位整数是原子的吗?写一个32位整数是原子的吗? 64位数据的读写呢?
(tips:这里最权威的是intel手册)
19、程序中的errno表示什么?在2.6以及更高版本的内核中,这个变量是线程安全的吗?
20、main函数的参数存放在哪里?
21、可以修改程序的初始入口函数吗?(调整为从其他函数开始执行,而不是main函数)
22、函数可变参数的实现原理是什么?
23、当一个声明为返回C/C++内建类型的函数,并没有明确返回时,调用这个函数会产生什么结果?
(tips:首先,会产生告警;其次,对于内建类型的返回,是通过EAX寄存器完成的,所以返回的也就是当时EAX寄存器的数值)
24、extern "C" 和 namespace 一起使用有哪些需要注意的地方?
(tips:C语言中不允许重载,所以说,在C++中不允许出现两个同名函数同时使用extern "C"(虽然在不同的命名空间中))
25、scanf 函数 遇到 EOF 输入会返回什么?
26、怎样使用C语言实现进度条功能?
27、C语言的宏是怎么回事?有哪些问题?怎么解决?
(tips:
(1)C语言的宏通过编译期的预编译环节将对应的表达式进行替换,然后进入接下来的词法分析,语法分析等。
主要存在的问题是替换时,由于是直接的字符替换,可能会带来副作用,例如 #define mul(a,b) a*b) mul(a+b, c)
目前解决的办法是在宏定义中引入括号表达式,合理的区分表达式。
(2)宏定义是无类型的,可能会引入bug
(3)宏定义调试困难)
28、C++用哪些技术来解决C语言宏的问题?
(tips:这个问题接着前一个问题,C++ 使用如下技术来解决C语言宏的问题
(1)const 表达式
(2)函数inline机制
(3)template实现)
29、realloc 函数在使用中有什么需要注意的?
(tips:realloc的返回值应该使用新的变量,因为如果分配失败,
原有的ptr不会释放,这有可能导致内存泄漏,还有realloc拷贝内存的方式为浅拷贝)
30、无符号数最大值加1,结果是什么?
(tips:无符号数最大值加1会回绕,即为0,有符号正数最大值加1,会成为负数)
31、typedef 定义的新类型和 const 搭配使用有什么问题?
(tips:有时搭配使用会产生不是预期的结果
typedef char * PCHAR
const PCHAR p,感觉 p 的类型是 const char *,
其实是 char * const p)
32、size_t 类型在不同平台上长度
(tips:表示当前平台能够寻址到的最大长度,即32位平台为 unsigned int
64位平台为 unsigned long)
33、在使用stringstream 将整数转为字符串时,需要注意本地环境中的locale属性,
有时会将整数转成逗号 分隔 的数字表示形式
34、为什么不能用memcmp直接进行struct结构的比较?
(tips:因为考虑到struct中结构对齐,对齐的数据是随机的,
如果直接比较,会导致非预期的行为)
35、tcmalloc 使用中有哪些问题?
(tips:1、一个指针free两次,不会报错,后续的多次申请将返回相同的指针地址,
这是因为tcmalloc使用单链表来管理free的空间,如果释放两次,相当于单链表成环了;
2、如果一个地址,被不同的线程free了,会有什么结果,tcmalloc使用 thread local的链表
来管理free的空间,如果相同地址,被不同的线程释放,那么不同线程的free list会出现交叉,
导致后续调用出错
3、free 一个 不是 malloc返回的地址,也不会报错,这样有可能导致程序core,也有可能将这个地址
在下次malloc时返回,导致程序出现一些预期外的行为,例如,性能下降)
36、tcmalloc的大块内存申请还是走的 mmap
37、静态库链接时,为什么需要关注顺序的问题?
(tips:这和linker的扫描算法有关,如果使用一个个单独的.o文件的话,
符号表是全局的,即后扫描出的undefined symbol会在前面已扫描出的table中查询,
即,全局的意思;但是如果使用.a文件,那么扫描只针对.a文件本身,同一个.a库只会被扫描一次,
这样就造成,如果被依赖的库后扫描,那么编译时就会报undefined reference错误;
注:linker的链接顺序是从左到右的)
38、怎么确认某个静态库export了某个函数实现?
(tips:利用ar 解压.a文件,然后各个.o文件中查找,
如果是 C++编译出来的库,最好使用 nm -C 来去掉函数改名)
39、main函数的argv参数是char**类型,不是 const char **类型,所以说argv里面的
内容可以修改,如果修改了argv[0],那就相当于修改了可执行文件的名字,
即 ps 命令显示也就改了,黑科技
argv 里面各个指针指向的貌似是同一段连续空间的不同位置,所以说可以从
argv[0]一直覆盖到 argv[argc]
40、Intel采用小端规则存储多字节的整形数据,即数字的高位存储在高字节,
好处是方便进行数据长度的增大和减小转换,
这在C语言中很常见,例如,(int64_t)inta 或 (int)int64b,
网络报文中则使用大端存储。
41、Intel64 有16个通用寄存器,分别是 r0 ~ r15,
同时 r0 ~ r7 分别对应于之前的RAX,RBX等等,具体的对应关系需要查看Intel的手册。
40、kernel中的max宏的设计有哪些考虑?
(tips:如果按照直观的考虑 max 宏的定义如下:
#define max(a,b) return (a)>(b)?(a):(b)
但这样的定义在面对,max(a++, b++)这种调用会引入
二义性,所以内核对max有改进
#define max(a, b)\
(typeof a) _a = a;\
(typeof b) _b = b;
(void) &a == &b;
return _a > _b ? _a : _b)
41、system函数是等到cmd执行完后返回吗?
(tips:是的,这里联想Unix环境高级编程中的示例,先fork,
然后子进程exec,主进程wait)
42、在使用localtime, inet_ntoa 等等函数需要小心,建议使用对应的多线程版本
例如:localtime_r, inet_ntop 等
43、字节序通常在单字节的数据上不用关心,但是在struct使用位域,则引入了位序,
在不同硬件平台下,需要关注字节内部的字段定义。
具体可参考内核中 tcphdr 和 iphdr 的定义。
// C++ (boring)
1、C++的三大特征是什么?
2、简单介绍下C++ bind?
3、string的erase和clear有什么区别?
4、怎样清空string申请的空间?(可以调用上面两个函数吗?)
5、怎样清空一个vector(包括释放空间)?
tips:swap
6、vector 容器调用 resize(0) 作用是什么?
7、vector 容器的 erase 函数返回值是什么?
8、vector 容器的 empty 函数的实现是?
9、vector 容器的 end 函数的实现是什么?
10、vector 容器的 size 函数的实现是什么?
11、vector 容器的 capacity 函数的实现是什么?
12、典型的 vector 容器的类对象 sizeof 值是? 有哪些成员变量?
13、vector 容器的 at() 和 operator [] 的区别是什么?
14、新创建的空容器,调用reserve(5),真正申请的空间是多大?
15、cout怎么设置浮点数的打印精度?
(tips:std::fixed,std::setprecision())
16、cin怎么判断 EOF?有哪些需要注意的点?
(tips:使用 cin.eof()来判断,使用时,需要先调用cin来尝试输入数据,再调用判断)
17、C++ 的cin cout怎样以十六进制展示?
(tips:使用 std::hex)
18、C++ map["not_exist"] 会怎样?
19、C++ 用const修饰的变量的值可以改吗?
(tips:通过取地址,用指针操作可以修改)
20、C++ 中 map 和 set 比较函数的优化
(tips:优化为,先比较长度,再比较具体的数据)
21、C++为什么需要拷贝构造函数?
(tips:因为默认的拷贝构造函数是浅拷贝,可能带来内存的double free 和 内容混乱)
22、C++为什么要有初始化列表?
(tips:因为如果没有初始化列表,像引用和const类型变量在构造函数内部初始化,就相当于赋值操作,这不符合标准的要求,
另外,如果是其他class类型,进入构造函数体会多一次函数调用)
23、什么是可重入函数?什么是线程安全函数?
(tips:可重入一定是线程安全的,但线程安全的不一定是可重入的,例如,
函数中有使用mutex,如果一个线程两次调用会死锁)
24、C++中引入的几种 memory order 原理?
25、private继承有什么作用?
(tips:private继承用在不是 is-a关系的两个类中,
继承类和父类没有逻辑关系,但是想使用父类的一些功能,
父类中的所有成员变量和函数都成为private,只能在父类内部使用,
但是虚函数的覆盖等还是可以继续使用)
26、Uncopyable 怎么实现?
(tips:一种简单的实现是 在类中定义private 拷贝构造函数,但是这种方式不够清晰
更好的做法是 定义个 模板类,定义 pravate的拷贝构造函数,然后 子类 private 继承
Uncopyable 类)
27、C++里面的匿名namespace中的成员,相当于添加了static属性,因为编译器实际上会为每一个匿名的namespace
生成一个名称,且添加using声明,但是这个名称在其他模块是不可见的,这也就添加了internal属性。
28、unique_ptr不能进行拷贝操作,也就是不能直接进行传参和从函数中返回,取而代之的是调用move函数
29、shared_ptr的引用计数更新是线程安全的,但是指针的更新不是,需要注意,对于*直接使用指针的形式
也不是线程安全的。
30、delete NULL是安全的,delete的实现中直接调用了 free(p),而析构函数的调用是编译器插入的;
如果delete void*,编译器会给出warning;各个malloc的实现中,free(NULL) 都是直接返回,没有啥直接效果。
31、虚函数为啥不能inline?
其实,如果是由object来调用虚函数,那么函数可以inline;
但是如果通过指针或者引用来访问,那么就走运行时多态特性了,即拿到类对象指针,访问虚函数表,
解引用对应function pointer,整个过程中必须有call指令调用
// debug
1、gdb --args 可以传入待调试程序的多个命令行参数,一般放在最后
2、gdb return 指令,可以在调试程序时,显示的从某个函数返回某个期望的值,具体需要查看手册
3、gdb 中可以手动去close一个文件
(tips:call close(your_fd))