1、C++空类是多大?为什么会这样?
空类是1个字节,一个类中虚函数、成员函数(包括静态和非静态)和静态数据成员都不占用类对象的存储空间。有虚函数时,会有一个指向虚表的指针,大小为4个字节,类不为空时,为空的那1个字节是不计算的。
空类之所以是1个字节,是因为求类大小就是求它实例化以后的大小,空类也是可以被实例化的,每个实例在内存中都会有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加1个字节。
类的大小与构造函数、析构函数以及其他成员函数都无关。
2、两个vector
排序、交集和并集。
使用STL算法:
sort函数可用于排序;
并集使用set_union,例如:
1. `vector<int> A, B, C;`
2. `A.resize(5), B.resize(5);`
交集使用set_intersection,用法与并集一样;
3、下面代码一共有多少个进程?
1. `int main()`
2. `{`
3. `fork();`
4. `fork()&⋔()||fork();`
5. `fork();`
6. `return 0;`
7. `}`
包含main进程在内,一共有20个进程。
4、互斥锁加条件变量使用的一个例子
1. `pthread1()`
2. `{`
3. `pthread_mutex_lock(lock_s);`
4. `sum++;`
5. `pthread_mutex_unlock(lock_s);`
6. `if (sum >= 100)`
7. `{`
8. `pthread_cond_signal(&cond_sum_ready);//先发送一次`
9. `}`
10. `}`
11. `pthread2()`
12. `{`
13. `pthread_mutex_lock(lock_s);`
14. `while(sum < 100)`
15. `{`
16. `pthread_cond_wait(&cond_sum_ready, &lock_s);//会先执行pthread_MUTEX_UNLOCK进行解锁,然后休眠`
17. `}`
18. `sum = 0;`
19. `pthread_mutex_unlock(lock_s);`
20. `}`
注意:最终哪个线程接收到信号,根据优先级来
5、实现string类的构造、析构和赋值函数
声明:
1. `class String`
2. `{`
3. `public:`
4. `String(const char* str = NULL);`
5. `String(const String & other);`
6. `~String();`
7. `String & operator=(const String &other);`
8. `private:`
9. `char * m_data;`
10. `};`
定义:
1. `String::String(const char* str)`
2. `{`
3. `if (str == NULL)`
4. `{`
5. `m_data = new char[1];//str为空时,new一个字节`
6. `m_data[0] = ‘\0’;`
7. `}`
8. `else`
9. `{`
10. `int len = strlen(str);`
11. `m_data = new char[len+1];`
12. `strcpy(m_data, str);`
13. `}`
14. `}`
15. `String::String(const String& other)`
16. `{`
17. `int len = strlen(other.m_data);`
18. `m_data = new char[len+1];`
19. `strcpy(m_data, other.m_data);`
20. `}`
21. `String::~String()`
22. `{`
23. `if (m_data != NULL)`
24. `{`
25. `delete[] m_data;`
26. `m_data = NULL;`
27. `}`
28. `}`
29. `String & operator=(const String &other)`
30. `{`
31. `if (this == &other) //检查自赋值`
32. `return *this;`
33. `delete[] m_data; //将之前的析构`
34. `int len = strlen(other.m_data);`
35. `m_data = new char[len+1];`
36. `strcpy(m_data, other.m_data); //深拷贝`
37. `return *this;`
38. `}`
6、linux下怎样查找最新更新的文件
ls –ltr 按时间反序排序当前文件夹中文件
find ./ type f –mtime -1 查找最近一天内更改的文件
7、linux怎样查找包含指定内容的文件
grep –nr “指定内容” *.ini //指定文件类型时,n是行号,r递归搜索子目录
8、简单介绍下shell脚本
shell就是一个命令行解释器,是一个用c语言编写的程序
而shell脚本则是一串命令的集合,是将shell的语法、命令,通过管道、循环、条件判断等按照一定的逻辑组合在文本文件中,便形成了一个脚本,这个脚本是用shell来解释的。
9、快速排序、选择排序、插入排序、冒泡排序、归并排序
快速排序:选定一个中间值,然后循环,将比该值小的放入它的左边,比它大的放入它的右边,接着对左右两边进行同样的操作,那么最后他们就是排好序的,并且是按照从小到大的顺序排的。代码如下:
1. `void quick_sort(int s[], int l, int r)`
2. `{`
3. `if (l < r)`
4. `{`
5. `int I = l,j=r, x = s[l];`
6. `while(I < j)`
7. `{`
8. `while(I < j && s[j] >= x)`
9. `{`
10. `j--;`
11. `}`
12. `if ( i< j)`
13. `s[i++] = s[j];`
14. `while( I < j && s[i] < x )`
15. `{`
16. `i++;`
17. `}`
18. `if ( I < j)`
19. `{`
20. `s[j--] = s[i];`
21. `}`
22. `s[i] = x;`
23. `quick_sort(s, l, i-1);`
24. `quick_sort(s, i+1, r);`
25. `}`
26. `}`
27. `}`
排序时间复杂度:
- 堆排序、归并排序 O(nlogn)
- 选择、插入、冒泡 O(n2)
- 快速排序理想情况下 O(nlogn),最差的时候 O(n2)
10、linux什么情况下可能产生死锁?
-
一个进程或者线程因请求资源A阻塞时,对资源B不释放,另一个进程则请求资源B,但对A不释放;
-
在加锁时轮询某数据,循环条件设置不当;