为什么sizeof在不同的IDE上返回不同的值?

时间:2015-10-21 09:53:29

标签: c++ sizeof

为什么以下代码在visual studio 2010中的代码块13.12和20中返回12?我也很困惑为什么它返回任何其他值而不是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);

}

4 个答案:

答案 0 :(得分:2)

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

在您的情况下,有不同的编译器依赖于所选择的IDE:

  • Visual Studio中的Visual C ++
  • MinGW(最有可能)在CodeBlocks中

如果您想知道vector数据的确切大小(以字节为单位),那么您可以使用以下方法:

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

答案 1 :(得分:1)

这不是IDE的问题,而是编译器的问题。

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

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

答案 2 :(得分:0)

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

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

对应sizeof(vector)=3*sizeof(pointer)。但是,您也可以使用end_used类型的成员替换end_allocatedsize_t中的一个或两个。此布局和依赖于硬件的sizeof(pointer)sizeof(size_t)确定sizeof(vector)std::vector<>使用的内存大小。

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

答案 3 :(得分:0)

无论vector如何,我想添加一些内容。甚至int在所有编译器(或称为IDE)中都没有通用的大小。 int 至少 4个字节。所以,它可能更大。