gpt4 book ai didi

c++堆分配默认对齐32字节?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:39 26 4
gpt4 key购买 nike

我决定使用 Visual Studio 2013 Community Edition 测试内存消耗,并注意到在我的计算机上使用指针时内存消耗猛增,例如:

int _tmain(int argc, _TCHAR* argv[])
{
auto n = 1000000;

std::vector<int> numbers;
numbers.reserve(n);

for (auto i = 0; i < n; i++){
numbers.emplace_back(0);
}

return 0;
}

我得到每个 int 4 个字节,总共 3.8MB,我可以通过任务管理器证实这一点。

但如果我决定更改 std::vector<int>对于 std::vector<int*> :

int _tmain(int argc, _TCHAR* argv[])
{
auto n = 1000000;

std::vector<int*> numbers;
numbers.reserve(n);

for (auto i = 0; i < n; i++){
numbers.emplace_back(new int(0));
}

return 0;
}

我突然得到原来的 3.8MB,这表明我计算机中的指针是 4 个字节,加上 30.5MB,这表明每个新的 int() 使用 32 个字节,每个 int 产生 28 个字节的开销。

如果我将原始指针更改为 std::unique_ptr,它使用与预期相同的内存,但更改为 std::shared_ptr(不使用 std::make_shared)它会额外增加 42MB,因为有额外的指针和变量。

所有这一切让我感到惊讶,我知道使用那么多指向基元的指针并不是一个现实的例子,但是由于大型应用程序倾向于使用大量指针,我想知道这是否意味着应该始终预期堆分配将使用最少 32 个字节?还是可以在 visual studio 的某个地方配置,或者它是否依赖于平台?

如果是这样,有没有办法调试并查看我们的程序在堆上有多少未使用的开销?这将有助于决定何时使用自定义分配,我的示例可以很容易地固定为使用 7.6MB 而不是 34.3MB,方法是预先分配内存并使用 placement new 例如。

谢谢。

最佳答案

这在某种程度上是意料之中的。标准分配器通常保证每次分配开始时的某种程度的对齐。这允许对缓存产生机械上的同情,这通常是一件好事,因为对齐访问的执行速度通常比未对齐访问快得多。

此外,在调试版本中使用 MSVC 进行的分配通常包括分配区域前后的保护字节,从而显着增加大小,尤其是对于像您这样的小分配。

关于c++堆分配默认对齐32字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812534/

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