最长公共前缀&C++函数的返回值在内存中的传递过程&什么是虚拟内存,为什么要使用虚拟内存,虚拟内存可能比物理内存大吗

每日一题

14. 最长公共前缀

class Solution {
public:
    string longestCommonPrefix(vector& strs) {
// 因为要找最长公共前缀 所以一定是序列一定是连续的 不会存在跳跃 
// 所以我的思路是 从头到尾比较数组中相邻的两个字符串的最长公共前缀长度
// 同时寻找最短的相邻公共前缀长度 此为全部的字符串的最长公共前缀长度
// 由于此时的ans为全部字符串的最长公共前缀长度
// 所以可以直接返回任意字符串的sub(0,ans)
        int ans=INT_MAX;
        for(int i=0;i

C++函数的返回值在内存中的传递过程

1.值传递

        当返回一个基本数据类型时,函数执行完毕后,会将返回值复制到一个临时的存储位置,通常是调用函数的栈帧中预留的空间。

        比如int add(int a,int b) 返回a和b的和时,计算结果会被存储在一个寄存器上(如果寄存器空间足够)或者栈上,然后这个值会被复制到调用函数的地方,作为初始化变量的参数或者是表达式上的一部分参与运算

        如果返回的是一个结构体,在某些优化的编译器环境下可能会把结构体中的成员分别存储在不同的寄存器中

2.引用传递

        当返回一个引用时,实际上返回的是一个对象的别名,只要保证这个原对象在函数调用前后都是有效的,不会随着函数执行结束被释放,比如返回的引用可以是全局变量的引用、类成员的引用或是函数参数的引用(函数参数为引用传递、或函数参数是常量(某些编译器可以,某些不行))

3.指针传递

        函数返回一个指针时,返回值是一个内存地址。这个地址指向的数据类型需要在函数声明和调用时明确。

为什么要明确数据类型呢?

#include 

// 函数声明,返回指向int的指针
int* createArray() {
    int* arr = new int[5];
    for (int i = 0; i < 5; ++i) {
        arr[i] = i * 2;
    }
    return arr;
}

int main() {
    // 错误地尝试将指向int的指针赋值给指向float的指针变量
    float* wrongResultArray = createArray();

    // 以下代码会导致编译错误,因为类型不匹配
    // 编译器会检测到不能将int*赋值给float*
    for (int i = 0; i < 5; ++i) {
        std::cout << wrongResultArray[i] << " ";
    }

    // 这里原本应该释放动态分配的内存,但前面已经出现编译错误
    // delete[] wrongResultArray;

    // 假设这里有个错误的类型转换,将指向int的指针视为指向char的指针
    char* wrongTypeArray = (char*)createArray();

    // 按照char类型来访问内存,会导致只读取每个整数的第一个字节
    for (int i = 0; i < 5; ++i) {
        std::cout << (int)wrongTypeArray[i] << " ";
    }

    // 释放动态分配的内存,但这里的释放方式也可能因为类型转换而出现问题
    // delete[] wrongTypeArray;
    return 0;
}

什么是虚拟内存,为什么要使用虚拟内存,虚拟内存可能比物理内存大吗

        什么是虚拟内存?

        虚拟内存是一种计算机系统内存管理技术。它为每个进程提供了一个独立的、连续的虚拟地址空间。这个虚拟地址空间是一个假象,对于进程来说,它好像拥有一大块连续的内存可以使用,但实际上,这些虚拟地址需要通过内存管理单元(MMU映射到物理内存或者磁盘上的交换空间。

        为什么要使用虚拟内存?

        进程隔离:
        不同进程有自己独立的虚拟地址空间,这使得多个进程可以在同一时间运行在系统上而不会互相干扰。每个进程都认为自己独占系统的内存,一个进程的错误操作(如访问非法内存地址)不会影响到其他进程。例如,进程 A 和进程 B 在各自的虚拟地址空间中运行,即使进程 A 出现内存访问错误,也不会直接影响到进程 B 的内存使用。
        内存扩展:
        虚拟内存允许进程使用比实际物理内存更多的内存。当物理内存不足时,操作系统可以将暂时不使用的内存页面(page)交换到磁盘上的交换空间,腾出物理内存给当前需要的进程使用。这样可以运行比物理内存容量更大的程序,提高了系统的多任务处理能力。比如,一个需要 8GB 内存才能完整运行的程序,在只有 4GB 物理内存的系统上,通过虚拟内存机制将部分数据交换到磁盘,依然可以运行。
        内存保护:
        操作系统可以通过虚拟内存机制设置不同内存区域的访问权限,如可读、可写、可执行等。这可以防止进程对内存的非法访问,提高系统的安全性。例如,操作系统可以将内核代码所在的虚拟内存区域设置为只读和可执行,防止进程意外修改内核代码。

        虚拟内存可能比物理内存大吗?

        虚拟内存可以比物理内存大。虚拟内存的大小主要由操作系统的寻址能力决定。例如,在 32 位系统中,理论上虚拟地址空间可以达到 4GB,而系统实际安装的物理内存可能远小于这个值。操作系统通过将部分暂时不使用的内存页面交换到磁盘上的交换空间来支持虚拟内存空间大于物理内存的情况。但如果程序频繁地访问交换空间中的数据,会导致性能下降,因为磁盘 I/O 速度远远慢于内存访问速度。

你可能感兴趣的:(算法)