-
完成 14. 最长公共前缀
#include <string>
#include <vector>class Solution {
public:string longestCommonPrefix(std::vector<std::string>& strs) {if (!strs.size()) {return "";}int length = strs[0].size();int count = strs.size();for (int i = 0; i < length; ++i) {char c = strs[0][i];for (int j = 1; j < count; ++j) {if (i == strs[j].size() || strs[j][i] != c) {// 则返回第一个字符串从开头到当前位置(不包括当前位置)的子串,即为最长公共前缀return strs[0].substr(0, i);}}}// 如果循环结束都没有找到不同的字符,说明第一个字符串就是最长公共前缀,直接返回它return strs[0];}
};
-
八股部分
1.C++函数的返回值在内存中的传递过程
返回基本数据类型(如 int、float 等)
-
当函数返回一个基本数据类型时,通常是通过寄存器来传递返回值。例如,在许多常见的体系结构中,像 32 位的系统,函数返回一个int类型的值可能会使用EAX寄存器(在 x86 架构下)。
-
以一个简单的函数int add(int a, int b)为例,函数在计算a + b后,结果会被存储到一个寄存器中,然后控制流返回到调用函数的地方,调用函数可以从这个寄存器中获取返回值。
返回对象(自定义类型)
-
值返回:如果函数返回一个对象是通过值返回的方式,那么会在函数栈帧中创建一个临时对象。这个临时对象是通过调用对象的拷贝构造函数来初始化的。
-
例如,有一个函数MyClass func(),MyClass是一个自定义的类。当函数返回时,会在栈上创建一个MyClass类型的临时对象,把函数内部的局部对象的内容拷贝到这个临时对象中。然后这个临时对象会被复制(如果是作为赋值语句的一部分)或者直接用于初始化(如果是初始化另一个对象)在调用函数的地方。
-
引用返回:当函数返回一个引用时,实际上返回的是对象的引用(内存地址)。
-
比如MyClass& func(),这个函数返回一个MyClass对象的引用。这要求被引用的对象在函数返回后仍然存在。通常用于返回类的成员变量或者全局变量的引用,因为如果返回一个局部对象的引用,当函数结束,局部对象的生命周期结束,引用就会变成悬空引用,这是错误的用法。
-
返回指针:函数返回一个指针时,返回的是一个内存地址。
-
例如int* func(),返回的指针必须指向一个有效的内存区域。这个内存区域可以是在堆上动态分配的(通过new操作符),在这种情况下,调用函数需要负责释放内存;也可以是指向全局变量或者静态变量的地址。如果返回一个指向局部变量的指针,当函数结束,局部变量的内存被释放,这个指针就会变成野指针。
2.什么是虚拟内存,为什么要使用虚拟内存,虚拟内存可能比物理内存大吗
-
定义:虚拟内存是一种内存管理技术,它为每个进程提供了一个独立的、连续的虚拟地址空间。这个虚拟地址空间是由操作系统和硬件共同实现的。对于一个 32 位的系统,每个进程的虚拟地址空间大小通常是 4GB(字节),对于 64 位系统则要大得多。
-
为什么要使用虚拟内存
隔离进程:每个进程都有自己的虚拟地址空间,使得进程之间相互隔离。这样,一个进程中的错误(如访问非法地址)不会影响到其他进程,增强了系统的稳定性和安全性。
方便内存管理:允许程序使用比物理内存更大的地址空间。程序可以按照自己的需要使用内存,而不必担心物理内存的实际大小。操作系统会在幕后负责将虚拟内存地址映射到物理内存地址。
便于共享内存:多个进程可以共享同一段虚拟内存区域,这些虚拟内存区域可以映射到相同的物理内存区域。例如,在多个进程运行同一个程序的代码段时,代码段的虚拟内存可以映射到相同的物理内存,节省了物理内存的使用。
-
虚拟内存可能比物理内存大吗
是的,虚拟内存可以比物理内存大。虚拟内存的大小是由计算机的地址位数决定的。例如,在 32 位系统中,理论上每个进程可以有 4GB 的虚拟地址空间,而实际的物理内存可能只有 1GB、2GB 等。操作系统通过将部分暂时不使用的虚拟内存数据存储到磁盘(通常是磁盘上的交换空间或页面文件)上,来实现虚拟内存大于物理内存的功能。当进程需要访问这些存储在磁盘上的数据时,操作系统会将其他不太紧急的数据从物理内存交换到磁盘,然后把需要的数据从磁盘交换到物理内存,这个过程被称为页面置换。这种机制使得程序可以在有限的物理内存下运行更大的程序或者同时运行多个程序。