M. *_*ter 5 c++ stl vector sizeof stdvector
为了了解std::vector<int>我写的内存消耗:
std::cout << sizeof(std::vector<int>) << std::endl;
Run Code Online (Sandbox Code Playgroud)
这产生32. 我试图理解这个价值从何而来。有些人查看了std::vector存储指针的源代码_MyFirst,_MyLast并_MyEnd解释了 24 字节的内存消耗(在我的 64 位系统上)。
最后一个字节怎么样8?据我了解,存储的分配器不使用任何内存。另外,这可能是实现定义的(是吗?),所以这可能有帮助:我正在使用 MSVC 2017.5。我不保证通过查看代码找到所有成员;该代码对我来说看起来非常混乱。
一切似乎都很好地对齐,但答案可能如下?:为什么结构体的 sizeof 不等于每个成员的 sizeof 之和?。但我用一个简单的测试它struct Test { int *a, *b, *c; };满足sizeof(Test) == 24.
一些背景
在我的程序中,我将有很多向量,但似乎其中大部分都是空的。这意味着关键的内存消耗来自空状态,即堆分配的内存不是那么重要。
一个简单的“仅用于此用例”向量很快就实现了,所以我想知道我是否遗漏了任何东西,无论如何我都需要 32 字节的内存,即使使用我自己的实现(注意:我很可能不会实现我自己的,这只是好奇心)。
更新
我用以下结构再次测试了它:
struct Test
{
int *a, *b, *c;
std::allocator<int> alloc;
};
Run Code Online (Sandbox Code Playgroud)
现在给了sizeof(Test) == 32。看起来,即使std::allocator没有消耗内存的成员(我认为),它的存在也会将Test的大小提高到 32 字节。
我认识到sizeof(std::allocator<int>)会产生1,但我认为这就是编译器处理空结构的方式,并且当它用作成员时,它会被优化掉。但这似乎是我的编译器的问题。
编译器无法优化掉空成员。标准明确禁止这样做。
空类类型的完整对象和成员子对象应具有非零大小
另一方面,空基类子对象的大小可能为零。这正是 GCC/libstdc++ 处理问题的方式:它使向量实现继承分配器。
| 归档时间: |
|
| 查看次数: |
1309 次 |
| 最近记录: |