C ++中sizeof运算符的操作

时间:2016-03-15 06:53:27

标签: c++ vector sizeof

在我的 MS VS 2015 编译器上,get 'company/:company_id' => 'company#company', as: :company sizeof为4(字节)。但是int sizeof是16.据我所知, vector 就像一个空框,当它尚未初始化时,为什么它是16?为什么16而不是另一个数字?

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

5 个答案:

答案 0 :(得分:3)

  

每个int的大小是4,所以v的大小应该是25 * 4字节,但实际上它仍然是16!为什么呢?

你混淆sizeof(std::vector)std::vector::size(),前者会返回矢量本身的大小,不包括它所拥有的元素的大小。后者将返回元素的数量,您可以按std::vector::size() * sizeof(int)获取所有尺寸。

  

为什么16岁?为什么16而不是另一个数字?

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

答案 1 :(得分:2)

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

由于sizesizeof(void *)且指针也为sizeof(void *),因此结构的大小为2*sizeof(void *),即16

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

编辑:正如M.M所提到的,实现可能会有所不同,例如指针startendallocatedSize。所以在32位环境中应该是3*sizeof(size_t)+sizeof(void *),这可能是这里的情况。即使原始版本也可以使用start硬编码为0而allocatedSize通过屏蔽end来计算,因此实际上依赖于实现。但问题仍然存在。

答案 2 :(得分:0)

sizeof在编译时进行计算,因此它只计算类中声明的变量的大小,这可能包括几个计数器和一个指针。它指向的指针随大小而变化,但编译器不知道这一点。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

你似乎在混合&#34;阵列&#34;用&#34; vector&#34;。如果你有一个本地数组,sizeof确实会提供数组的大小。但是,vector不是数组。它是一个类,来自STL的容器,保证内存内容位于单个内存块中(如果向量增长,可能会重新定位)。

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

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

在您的实现中总共可以达到16个字节(注意:经验可能会有所不同)。