gpt4 book ai didi

c++ - 如何解释 sizeof(std::vector) 的值?

转载 作者:太空狗 更新时间:2023-10-29 20:52:01 27 4
gpt4 key购买 nike

为了了解std::vector<int>的内存消耗我写道:

std::cout << sizeof(std::vector<int>) << std::endl;

这会产生 32 .我试图了解这个值(value)从何而来。一些查看源代码的评论认为std::vector存储指针 _MyFirst , _MyLast_MyEnd这解释了 24 字节的内存消耗(在我的 64 位系统上)。

最后一个呢8字节?据我了解,存储的分配器不使用任何内存。这也可能是实现定义的(是吗?),所以这可能有帮助:我正在使用 MSVC 2017.5。我不保证通过查看代码找到所有成员;代码对我来说看起来很困惑。

一切似乎都很好地对齐,但答案可能如下所示吗?:Why isn't sizeof for a struct equal to the sum of sizeof of each member? .但我用一个简单的 struct Test { int *a, *b, *c; }; 测试了它满足sizeof(Test) == 24 .


一些背景

在我的程序中,我将有很多 vector ,但似乎其中大部分都是空的。这意味着临界内存消耗来自空状态,即堆分配的内存不是那么重要。

一个简单的“仅用于此用例”-vector 实现得非常快,所以我想知道我是否遗漏了任何东西,我无论如何都需要 32 字节的内存,即使是我自己的实现(注意 :我很可能不会实现我自己的,这只是好奇)。


更新

我用下面的结构再次测试了它:

struct Test
{
int *a, *b, *c;
std::allocator<int> alloc;
};

现在给出 sizeof(Test) == 32 .似乎即使std::allocator没有内存消耗成员(我认为),它的存在会引发 Test的大小为 32 字节。

我认出了 sizeof(std::allocator<int>)产量 1 ,但我认为这就是编译器处理空结构的方式,并且在将其用作成员时将其优化掉。但这似乎是我的编译器的问题。

最佳答案

编译器无法优化空成员。标准明确禁止。

Complete objects and member subobjects of an empty class type shall have nonzero size

另一方面,空的基类 子对象的大小可能为零。这正是 GCC/libstdc++ 处理问题的方式:它使 vector 实现继承分配器。

关于c++ - 如何解释 sizeof(std::vector<int>) 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47507641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com