为什么 sizeof returns 在不同的 IDE 上有不同的值?

Why sizeof returns different value on different IDE?

为什么下面的代码 returns 12 在 codeblocks 13.12 和 20 在 visual studio 2010?我也很困惑为什么它 returns 除了 0 之外的任何其他值,因为向量是动态的,我没有推回任何元素。

#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <stdio.h>
#include <vector>
using namespace std;

class c
{
public:
    vector<int>v;
    c()
    {
        v.clear();
    }
};
int main() {
    int m;
    c ob;
    cout<< sizeof(ob);

}

因为 sizeof 运算符向您显示给定类型的对象表示的 内存大小(以字节为单位)。考虑到 vector 容器不仅包含数据(可能有计数器、指针等),因此内存中的确切大小取决于您使用的编译器的实现。

在你的情况下,有不同的编译器取决于选择 IDE:

  • Visual Studio
  • 中的 Visual C++
  • 代码块中的 MinGW(最有可能)

如果您想知道 vectordata 的确切大小(以字节为单位),则可以使用以下方法:

int vector_size = sizeof(int) * v.capacity();

这不是 IDE 的问题,而是评论所说的编译器的问题。

无论如何,obj肯定不是大小为0的,因为它至少包含一个向量。一个空的vector根本不包含任何元素,但这并不意味着它使用的内存为0,它可能有一些隐藏的必要属性。

不同的大小可能是由于:不同的编译器应用不同的填充,以及不同的开发环境中向量的不同实现。

A std::vector 可以用不同的方式实现,但它们都需要三个数据成员。一种可能性相当于

template<typename Tp>
class vector
{
  typedef Tp*pointer;
  pointer begin_memory, end_used, end_allocated;
};

对应sizeof(vector)=3*sizeof(pointer)。但是,您也可以将 end_usedend_allocated 中的一个或两个替换为 size_t 类型的成员。此布局和依赖于硬件的 sizeof(pointer)sizeof(size_t) 决定了 sizeof(vector)std::vector<>.

使用的内存大小

在 32 位系统上,通常有 sizeof(pointer)=sizeof(size_t)=4,因此 sizeof(vector)=12

不管vector我想补充点什么。甚至 int 也不是所有编译器中的通用大小(或者你所谓的 IDE)。 int 至少 4 个字节。所以,它可能更大。