Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 大家好,当一个类有一个向量时';s数据成员,为什么它的大小总是24?_C++_Class_Vector - Fatal编程技术网

C++ 大家好,当一个类有一个向量时';s数据成员,为什么它的大小总是24?

C++ 大家好,当一个类有一个向量时';s数据成员,为什么它的大小总是24?,c++,class,vector,C++,Class,Vector,这是上课时间 class A{ public: vector<int> vvv1{1}; }; class B{ public: vector<int> vvv2{1,2,3,4,5}; }; 为什么a和b的大小都是24?向量内容的大小不会改变类的大小。向量对象在您当前使用的std lib实现中总是占用24个字节。作为一个动态数组,向量动态分配内存来保存其内容。vector类中实际包含的是向量的容量、当前大小和指向数据的指针。类大小始终是静态的size

这是上课时间

class A{
public:
    vector<int> vvv1{1};
};

class B{
public:
    vector<int> vvv2{1,2,3,4,5};
};

为什么a和b的大小都是24?

向量内容的大小不会改变类的大小。向量对象在您当前使用的std lib实现中总是占用24个字节。作为一个动态数组,向量动态分配内存来保存其内容。vector类中实际包含的是向量的容量、当前大小和指向数据的指针。类大小始终是静态的

sizeof()
提供对象占用的内存字节数。类
std::vector
是一个容器,它有自己的成员变量来管理它所表示的内部数组,并且它们被计算为大小的一部分。在您的例子中,
a
b
的元素数量都太少,无法使它重新分配其内部数组以容纳比最初用于容纳单个元素更多的元素

为了进行说明,我的编译器在这两种情况下都返回32:

#include <vector>

int main()
{
    std::vector<int> a{ 1 };
    std::vector<int> b{ 1,2,3,4,5 };

    int sizeA = sizeof(a); // Returns 32
    int sizeB = sizeof(b); // Returns 32

    return 0;
}
#包括
int main()
{
std::向量a{1};
std::向量b{1,2,3,4,5};
int sizeA=sizeof(a);//返回32
int sizeB=sizeof(b);//返回32
返回0;
}

sizeof(std::vector)
std::vector::size()
/
std::size(std::vector)
不同。第一个为您提供类型占用的字节数。另外两个为您提供包含的对象/元素的数量。另外,
std::vector::capacity()
可以告诉您在需要重新分配/增长之前它当前可以存储多少元素。请记住
sizeof()
是一个编译时常量。它只测量对象的大小,而不是对象动态分配的任何内存的大小。非常感谢。我在想vector vec和new vector之间的区别是什么,因为vector是动态分配的。
new vector
创建了一个动态分配的vector。不同之处在于对象本身是动态分配的,因此在您的情况下,所有24个字节也都在空闲存储区中。注意:在大多数情况下使用这个没有多大意义。你很乐意回答我的问题。因此,当我使用新向量时,我只从堆中分配24字节,向量的内容总是动态分配的。更重要的是,当我使用vector*v=newvector时,v=0x71dcf0。当我使用vector vec,&vec[0]=0x7fd2e10a4010时,两个地址之间的区别是什么。我的计算机是64位的。非常感谢。我在想vector vec和new vector的区别是什么,因为vector是动态分配的,vector类本身不是动态分配的。向量使用动态分配来存储其数据。使用
newvector
将全部从堆中定位,并要求您稍后
删除它。否则,它们的功能将完全相同,因为它们是同一个类。您只是以不同的方式分配了用于类的内存。因此,当我使用新向量时,我只是从堆中分配24字节,向量的内容总是动态分配的。当我使用vector*v=newvector时,v=0x71dcf0。当我使用vector vec,&vec[0]=0x7fd2e10a4010时,两个地址之间的区别是什么。我的计算机是64位的。我想你对我所说的内容感到困惑。我不是指成员变量。我的意思是动态分配数组以允许动态数组
vector
在需要存储
int
s时调用
new int[whateverSizeItNeeds]
。向量本身(即容量、大小和指向数组的指针)不是动态分配的,除非您使用
new
显式分配。谢谢,我想我现在明白您的意思了。
#include <vector>

int main()
{
    std::vector<int> a{ 1 };
    std::vector<int> b{ 1,2,3,4,5 };

    int sizeA = sizeof(a); // Returns 32
    int sizeB = sizeof(b); // Returns 32

    return 0;
}