C++中sizeof运算符的操作
The operation of the sizeof operator in C++
在我的 MS VS 2015 编译器上,sizeof
int
是 4(字节)。但是sizeof
vector<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
通常是一个包含两个元素的结构:其元素的指针(数组)和数组的大小(元素数)。
由于size
是sizeof(void *)
,指针也是sizeof(void *)
,结构体的大小是2*sizeof(void *)
,即16
.
元素的数量与大小无关,因为元素是在堆上分配的。
编辑:如M.M所述,实现可能不同,如指针start
、end
、allocatedSize
。所以在 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 个字节(注意:经验可能会有所不同)。
在我的 MS VS 2015 编译器上,sizeof
int
是 4(字节)。但是sizeof
vector<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
通常是一个包含两个元素的结构:其元素的指针(数组)和数组的大小(元素数)。
由于size
是sizeof(void *)
,指针也是sizeof(void *)
,结构体的大小是2*sizeof(void *)
,即16
.
元素的数量与大小无关,因为元素是在堆上分配的。
编辑:如M.M所述,实现可能不同,如指针start
、end
、allocatedSize
。所以在 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 个字节(注意:经验可能会有所不同)。