为什么 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(最有可能)
如果您想知道 vector
中 data 的确切大小(以字节为单位),则可以使用以下方法:
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_used
和 end_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 个字节。所以,它可能更大。
为什么下面的代码 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(最有可能)
如果您想知道 vector
中 data 的确切大小(以字节为单位),则可以使用以下方法:
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_used
和 end_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 个字节。所以,它可能更大。