首页 > 其他分享 >堆栈与堆:临时变量std::vector<int> i; 在堆还是栈上?

堆栈与堆:临时变量std::vector<int> i; 在堆还是栈上?

时间:2024-11-26 22:57:40浏览次数:3  
标签:std index capacity const 栈上 vector new data size

在学习C++ STL的过程中,会遇到很多动态分配内存的情况,以std::vector的实现(简化版)为例:

template <typename T>
class SimpleVector {
private:
    T* data; // 指向数据的指针
    size_t size_; // 元素数量
    size_t capacity_; // 容量

public:
    SimpleVector() : data(nullptr), size_(0), capacity_(0) {}

    ~SimpleVector() { delete[] data; }

    void push_back(const T& value) {
        if (size_ == capacity_) {
            size_t new_capacity = (capacity_ == 0) ? 1 : capacity_ * 2;
            T* new_data = new T[new_capacity];
            for (size_t i = 0; i < size_; ++i) {
                new_data[i] = std::move(data[i]);
            }
            delete[] data;
            data = new_data;
            capacity_ = new_capacity;
        }
        data[size_] = value;
        ++size_;
    }

    T& operator[](size_t index) {
        return data[index];
    }

    const T& operator[](size_t index) const {
        return data[index];
    }

    size_t size() const { return size_; }
    size_t capacity() const { return capacity_; }
};

当容量不够时便会重新分配内存空间,因此vector实际储存的变量是在堆上的。

如果我们在函数中声明的临时变量,临时变量的实例是在堆栈上,T* data;本身储存在堆栈上,而data指针指向的地址在堆上。

标签:std,index,capacity,const,栈上,vector,new,data,size
From: https://www.cnblogs.com/zcry/p/18571128

相关文章

  • 对”在嵌入式Rust中使用std“的看法
    在文章(在嵌入式Rust中使用std)中实现如何解决在嵌入式Rust中中标准std的解决方案。对于现有嵌入式设备有足够的RAM(1MB或更多),是能完成基本操作的。列如:文章中提到的Windows3.0的最低要求。Windows3.0安装的要求如下:硬件要求 1. 处理器: 至少......
  • C++ vector的超级详细实用用法
    基本概念vector是C++标准模板库(STL)中的一个容器,定义在<vector>头文件中。它可以被看作是一个动态大小的数组,能够在运行时高效地添加或删除元素。这与普通数组不同,普通数组在创建时大小是固定的,而vector的大小可以根据需要自动增长或缩小。主要特点动态大小例如,你可以创建......
  • 猫头虎分享:RustDesk、向日葵、ToDesk、TeamViewer 和 AnyDesk 对比测评!
    ......
  • ListDLLs 是一个工具程序,通常用于列出 Windows 操作系统中当前加载的动态链接库(DLL)。
    ListDLLs是一个工具程序,通常用于列出Windows操作系统中当前加载的动态链接库(DLL)。它能够显示系统中所有的DLL文件,以及这些文件在不同进程中的加载情况。这个工具对于开发者、系统管理员和安全分析人员来说,具有一定的实用价值,特别是在诊断软件问题、分析进程和检测恶意软件时......
  • PostgreSQL 数据库向量化的核心:pgvector
    pgvector介绍pgvector是一款开源的向量搜索引擎,除了具备所有Postgres数据库的特性外,最主要的特点是能在Postgres数据库存储和检索向量数据,支持向量的精确检索和模糊检索。向量格式除了传统embedding模型的单精度浮点数外,还支持半精度浮点数,二元向量或者稀疏向量。安装Dockerdo......
  • RustDesk 搭建
    RustDesk服务端下载:https://github.com/rustdesk/rustdesk-server/releasesRustDesk客户端下载:https://github.com/rustdesk/rustdesk/releasesRustDesk官方部署教程:https://rustdesk.com/docs/zh-cn/1:RustDesk概览#1.1:项目简介#RustDesk它是一个远程控制开源项目,该项......
  • 【C++修行之道】vector
     一、vector的介绍1.1vector的介绍vector的文档介绍1.vector是表示可变大小数组的序列容器。2.就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的......
  • 天幕容器vector的底层实现,让这个容器的建造在你面前一览无余
    文章目录一、什么是vector?二、bit::vector的设计思路三、bit::vector的类定义四、构造函数与析构函数1.默认构造函数2.区间构造函数3.填充构造函数4.初始化列表构造函数5.拷贝构造函数6.析构函数五、push_back和内存管理六、插入操作(insert)七、删除操作(e......
  • vector(3)
    vector(3)vector迭代器失效问题。(重点)迭代器的主要作用就是让算法能够不用关心底层数据结构,其底层实际就是一个指针,或者是对指针进行了封装,比如:vector的迭代器就是原生态指针T。因此迭代器失效,实际就是迭代器底层对应指针所指向的空间被销毁了,而使用一块已经被释放的......
  • RAII - std智能指针
    std智能指针智能指针的选择标准在类中使用智能指针作为成员变量。需要根据实际情况(主要是看所有权)原始指针:所有权:该资源对象不属于我,使用前提:资源对象被释放前,我理应必然已经被释放。否则会存在风险。unique_ptr:所有权:该对象仅仅属于我。被管理的资源对象的生......