【C++】面试题整理
文章目录
- 一、概述
- 二、C++基础
- 2.1 - 指针在 32 位和 64 位系统中的长度
- 2.2 - 数组和指针
- 2.3 - 结构体对齐补齐
- 2.4 - 头文件包含
- 2.5 - 堆和栈的区别
- 三、智能指针
- 3.1 - 智能指针是线程安全的吗?
- 3.2 - 线程安全的几种方法
- 三、参考
一、概述
最近面试,感觉有些比较基础的好久不用就记不得了,整理一下。
【备注】:题目的答案是个人整理的不能保证是标准答案。
二、C++基础
2.1 - 指针在 32 位和 64 位系统中的长度
4 字节和 8 字节
32/8 = 4
64/8 = 8
2.2 - 数组和指针
以下代码在 32 位和 64 位系统中分别打印什么?
char a[] = "123456789";
const char* b = "123456789";
std::cout << sizeof(a) << std::endl;
std::cout << sizeof(b) << std::endl;
- 32位打印: 10 和 4
- 64位打印: 10 和 8
指针已经在第一题中说过了,就不重复了。char 数组的大小需要加上最后的 \0
。
2.3 - 结构体对齐补齐
在 32 位和 64 位系统中分别是多少
struct M
{int a;double b;
};printf("%d", sizeof(struct M));
答案: 均为16,这里是结构体的对齐补齐,与系统位数无关。
2.4 - 头文件包含
两种包含头文件的区别
#include <stdio.h>
#include "stdio.h"
- 尖括号,编译器会从系统目录中查找;
- 双引号,编译器会首先从当前项目目录查找,找不到再去系统目录中查找。
虽然#include"“的查找范围更广,但是这并不意味着,不论是系统头文件,还是自定义头文件,一律用#include”“包含。因为#include”"的查找顺序存在先后关系,如果项目当前目录或者引用目录下存在和系统目录下重名的头文件,那么编译器在当前目录或者引用目录查找成功后,将不会继续查找,所以存在头文件覆盖的问题。另外,对于系统头文件,用#include<>包含,查找时一步到位,程序编译时的效率也会相对更高。
2.5 - 堆和栈的区别
- 堆(heap): 向上增长内存,存储动态分配的内存,需要程序员自己管理,分配和释放。
- 栈(stack): 向下增长内存,存储静态分配的内存,系统会自动释放。
三、智能指针
3.1 - 智能指针是线程安全的吗?
不是
3.2 - 线程安全的几种方法
- 加锁
- 原子变量
std::atomic
三、参考
- https://blog.csdn.net/rammuschow/article/details/107947302