欢迎访问北单实体店微信:200833335

足球赛事

您现在的位置是: 主页 > 北单体育资讯 > 北单头条资讯

北单头条资讯

字节跳动C++后端校招面经:vector尾部添加元素与连续内存空间的关系解析

发布时间:2025-03-19 18:01 北单头条资讯 作者:
本文面经来自字节跳动 C++后端 今日头条 校招 vector尾部添加元素,需要连续的内存空间吗? 需要,vector底层实现原理为一维数组(元素在空间中连续存放) 1...

本文来自

C ++后端诊所招募

在尾部增加元素是否需要连续的记忆空间?

需要,基本实现原理是一个一维数组(元素连续存储在空间中)

1。新元素:

通过连续数组存储元素。如果集合已满,则在添加新数据时,您必须分配更大的内存,复制原始数据,发布原始内存并插入新元素。您可以通过迭代器插入任何位置的迭代器,并通过迭代器插入它,以了解第一个元素与迭代器的当前位置之间的距离。该位置后的所有元素都向后移动一个位置,然后将新添加的元素存储在空位置

2。删除元素:

删除类似于添加新的。删除最后一个元素,并删除通过迭代器删除的任何元素。使用擦除后,每个后续元素的迭代器将无效。随后的元素将一一移动,擦除将返回下一个有效的迭代器。

从C ++程序到可执行文件的过程

动态链接和静态链接有什么区别?动态链接以及何时使用静态链接的一般情况是什么?

C ++和C语言相似。 C ++程序具有从源代码到执行文件的四个进程:预编译,编译,汇编和链接。

预编译:

删除所有#并扩展所有宏定义处理条件预编译指令和#指令,将随附的文件插入预编译的指令过滤。所有注释都添加到行号和文件名标识中。

汇编:

词汇分析:将源代码的字符序列分为一系列令牌,语法分析:对令牌进行语法分析,生成语法树语义分析:判断表达式表达式有意义的代码优化目标代码生成:生成汇编代码目标代码优化

汇编:

将装配代码转换为机器可以执行的指令

链接不同源文件生成的目标文件以实现可执行程序

链接可以分为动态链接和静态链接:

静态链接:

链接时,要调用的函数或过程已链接到生成的可执行文件。即使删除静态库,也不会影响可执行文件的执行。生成的静态链路库与.lib和.a作为Linux下的后缀。

动态链接:

链接时,未链接调用函数。相反,在执行过程中,您会发现链接的功能。生成的可执行文件没有功能代码,仅包含该函数的重定位信息。因此,当您删除动态库时,可执行文件将无法运行。生成的动态链路库带有.dll和.so作为Linux下的后缀。

静态链接占据了很多内存,但运行速度更快并且具有高效率

动态链接占用较少的内存,但以无静态链路块的速度运行。

C ++程序的内存布局是什么?堆和堆栈有什么区别?堆和堆栈的优点和缺点是什么?堆栈空间尺寸?

内存模型(内存布局),如下图所示:

内存布局

从低地址到高地址,一个程序包括代码段,数据段,BSS末端,堆,共享区域,堆栈等。

代码段:程序执行代码的内存区域。只读,代码段的标题还将包含一些仅读取的常数变量数据段:一个存储初始化的全局变量和静态变量的内存区域。 BSS细分:一个存储非初始化或初始化为0的内存区域可执行程序将在执行时还有两个其他区域:堆区和堆栈区域

堆区域:动态申请内存,堆从低地址增长到高地址

堆栈区域:存储本地变量,功能参数值以及从高地址到低地址的增长。这是一个连续的空间

5。最后,有一个共享区域,位于堆和堆栈之间

在Linux下,默认堆栈空间大小为8MB

可以将4GB数组分配给具有2GB内存的操作系统吗?

如果2GB的内存是指物理内存,则有必要区分它是32位系统还是64位操作系统。

32位操作系统最多可申请3G虚拟内存,因此不可能

64位操作系统需要最多128T虚拟内存。

如果2G内存是指虚拟内存,则不可能

您了解TCP协议吗?如何确保可靠性?如何按顺序实现它?

为了确保可靠性,TCP采用了三种握手和四个握手等机制。此外,还有滑动窗口和拥塞控制算法。最重要的是,还保留了超时重新启动机制。还对每条消息进行了验证,以确保每个消息的可靠性。

使用序列号来确保有序到达:建立连接时会初始化一个随机数,并通过SYN数据包传输到接收器主机。每次发送数据时,都会累积数据字节的大小。用于解决端外网络数据包的问题。

在TCP通信期间,服务器程序挂断了。客户会发生什么?

有关于客户挂断的解释,这与问题原则相同:

客户端拔下网络电缆后,服务器发送给客户端的数据包将不会收到任何响应。在等待一段时间后,服务器将触发超时重新启动机制以重新发送无反应的数据包。

如果客户端仅在服务器重新启动过程中插入网络电缆,则由于拔下网络电缆不会更改客户端的TCP连接状态并且仍处于状态,因此客户端通常可以接收服务器发送的数据包,然后客户端将返回到ACK响应消息。

目前,客户端和服务器之间的TCP连接仍然存在,感觉好像什么都没发生。

但是,如果客户端在服务器重新启动过程中未插入网络电缆,并且服务器已安排并重新传输消息到达一定的阈值,则内核将确定TCP存在问题,然后通过接口告诉应用程序,然后通过接口告诉应用程序TCP连接是有问题的,因此服务器的TCP连接将被切断。

客户端插入网络电缆后,如果客户端将数据发送到服务器,则服务器与与客户端相同的四元素祖先没有TCP连接,服务器内核将回复第一个消息,并且客户端将在接收到它后释放TCP连接。

目前,客户端和服务器之间的TCP连接已断开连接。

对于在拔下网络电缆后没有数据传输的情况下,这也取决于是否启用了TCP机制(TCP保留机制)。

如果未启用TCP机制,则在客户端拔下网络电缆,并且两方都执行数据传输之后,客户端和服务器之间的TCP连接将保留。

如果启用了TCP机制,则在客户端拔下网络电缆后,即使双方都不会传输数据,TCP也会在一段时间后发送检测消息:

操作系统中的一个过程想删除正在编写的文件。可以成功删除吗?

在Linux系统中可以取得成功。

Linux中文件的真实表示是Inode索引节点,文件名仅指向Inode(自然,我们可以想到多个指向同一inode的文件名,这是文件系统中的难连接)。实际上,使用像RM -F这样的命令删除文件,实际上是通过删除文件名和Inode之间的连接关系来删除文件。那么,什么时候直接表示文件的内容的inode?答案是文件系统确定如果删除了文件名的所有关系,则将删除Inode。

如果没有为文件建立硬链接,即应立即删除inode,并且inode已消失,并且应将删除报告作为错误。实际上,当文件系统回收Inode(除了判断到Inode的链接的数量外,还需要判断对Inode的引用的数量为0。当一个过程打开文件时,对Inode的参考数量将添加到1。那么何时删除inode?答案是,当参考号在过程结束时为0时。这也是为什么有时我们删除文件的原因,但是使用du命令查看空间未发布,并重新启动程序空间。

#大子#

广告位