拼多多

AI Infra面经

完整信息

11 条问法 · 8 道题

本篇目录

介绍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)

具体要求:

  1. 初始化时,整个[0, capacity)区间为空闲状态。

  2. allocate按Best-Fit策略选择空闲块:
    找到大小大于等于size的最小空闲块;
    如果多个空闲块大小相同,选择起始地址最小的;
    分配后切出需要的空间,剩余部分保留为空闲块;
    无法满足请求时返回nullptr。

  3. free释放指定块,并立即检查左右相邻空闲块,完成合并。

  4. 保证释放的指针由allocate返回,不会重复释放。

  5. 不需要考虑线程安全。

  6. allocate和free的复杂度尽量低于O(n),n为当前内存块数量。

#如果不工作真的会快乐吗#

本篇目录
  1. 01
  2. 02
  3. 03
  4. 04
  5. 05
  6. 06
  7. 07
    头文件重复包含会出现什么问题? 例如a.h被b.h包含,而一个.cpp又同时包含a.h和b.h,会发生什么?
  8. 08
    如何用条件编译避免头文件重复包含? [#ifndef、#](https://www.nowcoder.com/creation/subject/da693f1210bb4f72b38120b8367bbf6e)define这类头文件保护宏的原理是什么?
  9. 09
    是否遇到过core dump? 常见原因有哪些? 如果出现core dump,会如何定位问题?
  10. 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. 11
    给出一段创建vector的代码,容器包含1000个元素,初始值为1: 这段代码涉及多少次内存分配? 哪些内容在栈上,哪些内容在堆上? 需要区分vector对象本身与它管理的元素存储。

相关公司