找回密码
 立即注册

QQ登录

只需一步,快速开始

工控课堂 首页 工控文库 上位机编程 查看内容

C++中sizeof(vector)的问题

2022-4-17 18:02| 发布者: 198366809| 查看: 1131| 评论: 0|来自: 算法集市(头条)

摘要: C语言运算符sizeof的用法我们知道在C/C++中,sizeof() 是一个判断数据类型或者表达式长度的运算符,以字节为单位。当用 sizeof 判断一个vector类型的变量所占的内存大小时,结果会是什么呢?比如下面这段代码:#incl ...

C++中sizeof(vector)的问题

C语言运算符sizeof的用法

我们知道在C/C++中,sizeof() 是一个判断数据类型或者表达式长度的运算符,以字节为单位。

当用 sizeof 判断一个vector类型的变量所占的内存大小时,结果会是什么呢?

比如下面这段代码:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> vec;
    for (int i = 0; i < 10; i++) {
        vec.emplace_back(i);
    }
  
    cout << "sizeof(int) : " << sizeof(int) << endl;
    cout << "sizeof(vec) : " << sizeof(vec) << endl;
    cout << "vec.size    : " << vec.size() << endl;
    cout << "vec.capacity: " << vec.capacity() << endl;
  
    return 0;
}

运行结果如下图所示:

C++中sizeof(vector)的问题

size() 是当前vector容器真实占用的内存大小,也就是容器当前拥有多少个元素;

capacity() 是指在发生realloc前能允许的最大元素数,也即预分配的内存空间。

发现 sizeof(vec) 为24,并不等于 10 * sizeof(int) = 40。这是为什么呢?

这是因为 vector 是C++标准库中的容器类,其可以理解为一个动态数组,其内部实现有三个指针:

  • pointer _M_start;
  • pointer _M_finish;
  • pointer _M_end_of_storage;

分别代表其使用内存的开始、结束,以及分配的内存结尾,其中

  • _M_finish - _M_start 对应 sizeof();
  • _M_end_of_storage - _M_start 对应 capacity() ;

vector 通过配置比其所容纳的元素所需更多的内存,即先预留足够空间,避免二次分配,从而提高 vector 的性能。

因此,sizeof(vec) 的大小等于 3 x 8 = 24。

若是静态分配内存的数组,通过sizeof求其长度结果如下:

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int arr[10];
    for (int i = 0; i < 10; i++) {
        arr[i] = i;
    }
    cout << "sizeof(arr): " << sizeof(arr) << endl;
  
    return 0;
}

运行结果如下图所示:

C++中sizeof(vector)的问题
关注公众号,加入500人微信群,下载100G免费资料!

最新评论

热门文章
关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-23 02:52 , Processed in 0.083344 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

返回顶部