C++ 为什么sizeof在不同的IDE上返回不同的值?
为什么下面的代码在VisualStudio2010的代码块13.12和20中返回12?我也很困惑,为什么它会返回除0以外的任何其他值,因为向量是动态的,而且我没有推回任何元素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
#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,它可能有一些隐藏的必要属性
不同的大小可能是由于:不同的编译器应用不同的填充,以及不同开发环境中向量的不同实现。Astd::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)没有自己的标头,或者使用的任何编译器的标头与其他编译器一起提供,则大多数此类大小更改都会跟随标头,而不是编译器。