在学习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::vector<int> i; 在堆还是栈上?的更多相关文章

  1. (原创)动态内存管理练习 C++ std::vector<int> 模拟实现

    今天看了primer C++的 “动态内存管理类”章节,里面的例子是模拟实现std::vector<std::string>的功能. 照抄之后发现编译不通过,有个库函数调用错误,就参考着自 ...

  2. C++:在堆上创建对象,还是在栈上?

    这篇文章来自于一次讨论:http://www.devbean.net/2013/01/qt-study-road-2-model-view/#comment-17532.关于究竟是在堆上还是在栈上创建 ...

  3. block存储区域——怎样验证block在栈上,还是堆上

    Block存储区域 首先,须要引入三个名词: ● _NSConcretStackBlock ● _NSConcretGlobalBlock ● _NSConcretMallocBlock 正如它们名字 ...

  4. c++转载系列 std::vector模板库用法介绍

    来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...

  5. C++ folly库解读(二) small_vector —— 小数据集下的std::vector替代方案

    介绍 使用场景 为什么不是std::array 其他用法 其他类似库 Benchmark 代码关注点 主要类 small_vector small_vector_base 数据结构 InlineSto ...

  6. 对多维向量vector<vector<int> > vec进行操作

    直接写作vector<vector<int> > vec在VC++6.0下编译不过改做:    typedef std::vector<int> ROW;    s ...

  7. C++ 中的std::vector介绍(转)

    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...

  8. std::vector介绍

    vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库.vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vec ...

  9. vector 利用swap 函数进行内存的释放 vector<int>().swap

    首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有 ...

  10. C++基于范围的for循环性能测试(针对std::vector)

    1.代码如下: void output1(int x){ if (x == 10000000) { std::cout << x << std::endl; } }const ...

随机推荐

  1. 视觉SLAM第四讲李群与李代数习题

    视觉SLAM第四讲李群与李代数习题 一.验证\(SO(3).SE(3).SIM(3)\)关于乘法成群 首先引入一下群的定义. 群 (Group) 是一种集合加上一种运算的代数结构.我们把集合记作 \( ...

  2. Ubuntu下RabbitVCS的安装和简单使用

    最近需要在Ubuntu下玩一段时间,但是没找类似TortoiseSVN的熟悉点的Subversion工具,无意间发现了RabbitVCS,操作上非常nice,留爪. 下载 RabbitVCS Rabb ...

  3. useDeferredValue的作用

    前言 useDeferredValue是react18新增的一个用于优化性能的一个hook,它的作用是延迟获取一个值,实际开发中的常规用法与我们之前所用的防抖和节流很相似,但是也有一定的区别.本篇文章 ...

  4. nbhh的泛型:TDictionary

    type TCity = class Country: String; Latitude: Double; Longitude: Double; end; const EPSILON = 0.0000 ...

  5. Linux基本开发环境配置git,c++,nodejs,nginx

    Linux基本开发环境配置 前一篇文章配置了基本的SSH,本文来讲讲关于基本的开发环境的配置,包括git,c,c++,nodejs,nginx. 安装git和配置无密码登录github yum ins ...

  6. Ubuntu v22配置用户临界值

    方法 1:使用 pam_faillock(推荐,Ubuntu 22.04 默认方式) pam_faillock 是较新的 PAM 模块,用于记录失败登录尝试并在达到限制后锁定账户. 修改 /etc/p ...

  7. grequests,并发执行接口请求的方法(简易版)

    有时候需要处理很多请求,显然,一个一个去处理是要花费很多时间的 我们就需要用到并发的方式,python并发请求的方法很多,从简单到复杂. 本案例,介绍一个超级简单,使用grequests库,实现并发请 ...

  8. krpano.js导出为模块方便vue等框架使用的问题

    作为一个全栈(干),前端commonjs amd 那些东西没有研究过,一直用es6内置的export和import(不香吗?).最近写一个全景项目,有一个krpano.js文件官网案例是标签引入,可我 ...

  9. SpringMVC返回值

    字符串 /** * 测试返回字符串 * @param model model * @return 返回的字符串,通过视图解析器调整到jsp页面 */ @RequestMapping("/te ...

  10. CentOS安装SFTP

    1.创建专用用户组 sudo groupadd sftpgroup # 创建组用于统一管理SFTP用户[1,6](@ref) 2.​添加用户并限制Shell sudo useradd -m -d /d ...