C++中sizeof运算符的操作

The operation of the sizeof operator in C++

在我的 MS VS 2015 编译器上,sizeof int 是 4(字节)。但是sizeofvector<int>是16。据我所知,vector在没有初始化的时候就像一个空盒子,为什么是16呢?为什么是 16 而不是另一个数字?

此外,如果我们有vector<int> v(25);,然后用int数字初始化它,那么v的大小仍然是16,尽管它有25个int数字!每个 int 的大小是 4 所以 sizeof v 看起来应该是 25*4 字节,但实际上它仍然是 16!为什么?

sizeof 是在编译时计算的,所以它只计算在 class 中声明的变量的大小,其中可能包括几个计数器和一个指针。这是指针指向的内容随大小而变化,但编译器不知道。

std::vector 通常是一个包含两个元素的结构:其元素的指针(数组)和数组的大小(元素数)。

由于sizesizeof(void *),指针也是sizeof(void *),结构体的大小是2*sizeof(void *),即16.

元素的数量与大小无关,因为元素是在堆上分配的。

编辑:如M.M所述,实现可能不同,如指针startendallocatedSize。所以在 32 位环境中应该是 3*sizeof(size_t)+sizeof(void *),这里可能就是这种情况。即使是原始版本也可以使用硬编码为 0 的 start 和通过掩码 end 计算的 allocatedSize,因此实际上取决于实现。但重点还是一样。

可以使用指针来解释大小,指针可以是:1) 向量的开头 2) 向量的结尾和 3) 向量的容量。所以它更像是依赖于实现,它会随着不同的实现而改变。

The size of each int is 4 so the sizeof v should then be 25*4 bytes seemingly but in effect, it is still 16! Why?

你混淆了 sizeof(std::vector)std::vector::size(),前者将 return 向量本身的大小,不包括它包含的元素的大小。后者将 return 元素的数量,你可以通过 std::vector::size() * sizeof(int).

得到它们的所有大小

so why is it 16? And why 16 and not another number?

什么是 sizeof(std::vector) 取决于实现,主要是 。对于某些情况(例如调试模式),为了方便起见,大小可能会增加。

您似乎将 "array" 与 "vector" 混为一谈。如果你有一个本地数组, sizeof 确实会提供数组的大小。但是,向量不是数组。它是一个 class,来自 STL 的容器,保证内存内容位于单个内存块中(如果向量增长,可能会重新定位)。

现在,如果您查看 std::vector 实现,您会注意到它包含以下字段(至少在 MSVC 14.0 中):

 size_type _Count = 0;
 typename _Alloc_types::_Alty _Alval;   // allocator object (from base)
 _Mylast
 _Myfirst

根据您的实施,这可能总计达 16 个字节(注意:经验可能会有所不同)。