侧边栏壁纸
博主头像
LittleAO的学习小站 博主等级

在知识的沙漠寻找绿洲

  • 累计撰写 125 篇文章
  • 累计创建 27 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

C++知识点之 内存分类

LittleAO
2024-07-30 / 0 评论 / 0 点赞 / 14 阅读 / 0 字
温馨提示:
本文最后更新于2024-07-30,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

在C++中,内存分为以下5类:

栈内存

存储局部变量和函数调用信息,自动分配和释放。其生命周期随着函数调用和返回而自动分配和释放。

void function() {
    int localVar = 5; // 在栈内存
}

这部分内容在下面的文章中详细讲过:

https://bg.littleao.top/archives/cpp_smart_ptr

此外这里有很不错的学习视频:

https://www.bilibili.com/video/BV1GD421g7pA

堆内存

用于动态分配内存,程序员需要手动管理(分配和释放)。在程序运行时分配,直到显式释放(使用delete或free)。访问速度相对较慢,因需要管理内存碎片。

int* ptr = new int(10); // 在堆内存

详细讲解:

https://bg.littleao.top/archives/cpp_smart_ptr

学习视频:

https://www.bilibili.com/video/BV1Vi421U7ew

全局内存

用于存储全局变量和静态变量。程序运行期间存在,直到程序结束。例如static 保存的变量。

int globalVar = 20; // 在全局内存
static int staticVar = 40; // 在全局内存
int main()
{
  return 0;
}

常量内存

存储常量值,如字符串字面量和常量变量。在程序运行期间存在,通常在编译时分配。

const int constVar = 30; // 在常量内存

代码段

存储程序的可执行代码。在程序运行期间存在,直到程序结束。

特殊情况

指向堆内存的局部指针

void function() {
    int* ptr = new int(10); // 在堆内存
    // ...
    delete ptr; // 必须手动释放
}

ptr在栈内存,指向的整数在堆内存。

全局常量与局部常量

const int globalConst = 100; // 全局常量
void function() {
    const int localConst = 200; // 局部常量
}

全局常量在常量内存,局部常量在栈内存。全局常量的生命周期是整个程序运行期间,而局部常量的生命周期仅在其作用域内。

静态局部变量

void function() {
    static int staticLocalVar = 0; // 在全局内存
    staticLocalVar++;
}

静态局部变量在全局内存。静态局部变量在函数调用之间保持其值,即使函数结束后也不会被销毁。

内存对齐

struct AlignedStruct {
    char a;
    int b; // 可能会因为对齐要求而在内存中有填充
};

结构体在堆或栈中分配,可能会有额外的填充字节。

容器

void function() {
    std::string str = "Hello"; // 在栈内存
}

std::string内部可能会使用堆内存来存储字符串内容,但str本身在栈上。

虚函数表和虚函数指针

虚函数表通常存储在程序的全局内存区域。每个包含虚函数的类都有一个对应的虚函数表,表中存储着指向该类虚函数实现的指针。

每个对象实例(即类的实例)会有一个指向其对应虚函数表的指针,通常称为虚指针(vptr)。这个指针存储在对象的内存中,通常位于对象的起始部分。

0

评论区