AI Infra面经
完整信息
本篇目录
介绍GPU的多层存储结构。
在一个.cpp文件里写下#include "xxx.h"之后,编译工具链会做什么?
头文件重复包含会出现什么问题?
例如a.h被b.h包含,而一个.cpp又同时包含a.h和b.h,会发生什么?
如何用条件编译避免头文件重复包含?
#ifndef、#define这类头文件保护宏的原理是什么?
给出一段创建vector的代码,容器包含1000个元素,初始值为1:
这段代码涉及多少次内存分配?
哪些内容在栈上,哪些内容在堆上?
需要区分vector对象本身与它管理的元素存储。
什么样的对象在栈上,什么样的内存在堆上?
对于下面这类代码:
void* addr = malloc(4000);
指针变量addr和申请到的4000字节分别在哪里?
返回的地址是虚拟地址还是物理地址?
是否遇到过core dump?
常见原因有哪些?
如果出现core dump,会如何定位问题?
是否遇到过内存泄漏?
五、手撕:实现单线程内存分配器
频繁调用系统malloc/free会有开销,也可能产生碎片。要求初始化时预分配一块连续内存,后续自己管理分配、切分和回收。
接口:
MyAllocator(int capacity)
void* allocate(int size)
void free(void* ptr)
具体要求:
初始化时,整个[0, capacity)区间为空闲状态。
allocate按Best-Fit策略选择空闲块:
找到大小大于等于size的最小空闲块;
如果多个空闲块大小相同,选择起始地址最小的;
分配后切出需要的空间,剩余部分保留为空闲块;
无法满足请求时返回nullptr。free释放指定块,并立即检查左右相邻空闲块,完成合并。
保证释放的指针由allocate返回,不会重复释放。
不需要考虑线程安全。
allocate和free的复杂度尽量低于O(n),n为当前内存块数量。
本篇目录
当前问题0111
- 01
介绍GPU的多层存储结构。
- 02
在一个.cpp文件里写下#include "xxx.h"之后,编译工具链会做什么?
- 03
什么样的对象在栈上,什么样的内存在堆上?
- 04
指针变量addr和申请到的4000字节分别在哪里?
- 05
返回的地址是虚拟地址还是物理地址?
- 06
是否遇到过内存泄漏?
- 07
头文件重复包含会出现什么问题? 例如a.h被b.h包含,而一个.cpp又同时包含a.h和b.h,会发生什么?
- 08
如何用条件编译避免头文件重复包含? [#ifndef、#](https://www.nowcoder.com/creation/subject/da693f1210bb4f72b38120b8367bbf6e)define这类头文件保护宏的原理是什么?
- 09
是否遇到过core dump? 常见原因有哪些? 如果出现core dump,会如何定位问题?
- 10
频繁调用系统malloc/free会有开销,也可能产生碎片。要求初始化时预分配一块连续内存,后续自己管理分配、切分和回收。 接口: MyAllocator(int capacity) void* allocate(int size) void free(void* ptr) 具体要求: 1. 初始化时,整个[0, capacity)区间为空闲状态。 2. allocate按Best-Fit策略选择空闲块: 找到大小大于等于size的最小空闲块; 如果多个空闲块大小相同,选择起始地址最小的; 分配后切出需要的空间,剩余部分保留为空闲块; 无法满足请求时返回nullptr。 3. free释放指定块,并立即检查左右相邻空闲块,完成合并。 4. 保证释放的指针由allocate返回,不会重复释放。 5. 不需要考虑线程安全。 6. allocate和free的复杂度尽量低于O(n),n为当前内存块数量。
- 11
给出一段创建vector的代码,容器包含1000个元素,初始值为1: 这段代码涉及多少次内存分配? 哪些内容在栈上,哪些内容在堆上? 需要区分vector对象本身与它管理的元素存储。
