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

C++ 为什么sizeof在不同的IDE上返回不同的值?,c++,sizeof,C++,Sizeof,为什么下面的代码在VisualStudio2010的代码块13.12和20中返回12?我也很困惑,为什么它会返回除0以外的任何其他值,因为向量是动态的,而且我没有推回任何元素 #include <iostream> #include <sstream> #include <iomanip> #include <string> #include <stdio.h> #include <vector> using namespa

为什么下面的代码在VisualStudio2010的代码块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);

}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
c类
{
公众:
向量;
c()
{
v、 清除();
}
};
int main(){
int m;
c ob;

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

在您的情况下,不同的编译器取决于所选的IDE:

    VisualStudio中的VisualC++
  • 代码块中的MinGW(最有可能)
如果您想知道
向量中数据的确切大小(字节),可以使用以下方法:

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;
};
模板
类向量
{
typedef Tp*指针;
指针开始\内存,结束\已使用,结束\已分配;
};
它对应于
sizeof(vector)=3*sizeof(pointer)
。但是,您也可以使用
size\t
类型的成员替换使用的
end\u和分配的
end\u
。此布局和硬件相关的
sizeof(pointer)
sizeof(size\t)
确定
sizeof(vector)
:std::vector使用的内存大小


在32位系统上,通常会有
sizeof(pointer)=sizeof(size_t)=4
,因此
sizeof(vector)=12
,我想添加一些东西,而不管
vector
。即使
int
在所有编译器(或者您称之为IDE)中也没有通用的大小。
int
至少是4个字节。因此,它可能会更大。

想想你将如何实现一个向量,你就会明白为什么它的大小不可能是0。它至少包含一个指针和一个计数器。记住,向量的大小与向量内容的大小不一样。顺便说一句,它是com编译代码的编译器,而不是IDE。这也不是因为向量没有任何不占用空间的元素。我不知道向量的实现,但它可能有自己的内部属性:指向存储数据的指针(即使它只是NULL)、元素数(即使它只是0),…请参阅:它并不像最初的问题所假设的那样是IDE,但它也不是“编译器”。是std库头导致了std::vector大小的变化。调试版本和发布版本之间的大小也可能不同(因为这些头中有条件编译)。如果您使用的编译器(如ICC)没有自己的标头,或者使用的任何编译器的标头与其他编译器一起提供,则大多数此类大小更改都会跟随标头,而不是编译器。