在我的 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!为什么呢?
答案 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
通常是一个包含两个元素的结构:元素的指针(数组)和数组的大小(元素的数量)。
由于size
为sizeof(void *)
且指针也为sizeof(void *)
,因此结构的大小为2*sizeof(void *)
,即16
。
元素的数量与大小无关,因为元素在堆上分配。
编辑:正如M.M所提到的,实现可能会有所不同,例如指针start
,end
,allocatedSize
。所以在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个字节(注意:经验可能会有所不同)。