gpt4 book ai didi

memory - Golang追加内存分配VS。 STL push_back 内存分配

转载 作者:IT王子 更新时间:2023-10-29 01:46:18 27 4
gpt4 key购买 nike

我比较了 Go append 函数和 STL vector.push_back,发现不同的内存分配策略让我感到困惑。代码如下:

// CPP STL code
void getAlloc() {
vector<double> arr;
int s = 9999999;
int precap = arr.capacity();
for (int i=0; i<s; i++) {
if (precap < i) {
arr.push_back(rand() % 12580 * 1.0);
precap = arr.capacity();
printf("%d %p\n", precap, &arr[0]);
} else {
arr.push_back(rand() % 12580 * 1.0);
}
}
printf("\n");
return;
}


// Golang code
func getAlloc() {
arr := []float64{}
size := 9999999
pre := cap(arr)
for i:=0; i<size; i++ {
if pre < i {
arr = append(arr, rand.NormFloat64())
pre = cap(arr)
log.Printf("%d %p\n", pre, &arr)
} else {
arr = append(arr, rand.NormFloat64())
}
}
return;
}

但是内存地址对于大小的增量是不变的,这让我很困惑。顺便说一下,这两个实现(STL VS. Go)的内存分配策略是不同的,我的意思是扩展大小。有什么好处或坏处吗?这是上面代码的简化输出[大小和第一个元素地址]:

Golang                            CPP STL
2 0xc0800386c0 2 004B19C0
4 0xc0800386c0 4 004AE9B8
8 0xc0800386c0 6 004B29E0
16 0xc0800386c0 9 004B2A18
32 0xc0800386c0 13 004B2A68
64 0xc0800386c0 19 004B2AD8
128 0xc0800386c0 28 004B29E0
256 0xc0800386c0 42 004B2AC8
512 0xc0800386c0 63 004B2C20
1024 0xc0800386c0 94 004B2E20
1280 0xc0800386c0 141 004B3118
1600 0xc0800386c0 211 004B29E0
2000 0xc0800386c0 316 004B3080
2500 0xc0800386c0 474 004B3A68
3125 0xc0800386c0 711 004B5FD0
3906 0xc0800386c0 1066 004B7610
4882 0xc0800386c0 1599 004B9768
6102 0xc0800386c0 2398 004BC968
7627 0xc0800386c0 3597 004C1460
9533 0xc0800386c0 5395 004B5FD0
11916 0xc0800386c0 8092 004C0870
14895 0xc0800386c0 12138 004D0558
18618 0xc0800386c0 18207 004E80B0
23272 0xc0800386c0 27310 0050B9B0
29090 0xc0800386c0 40965 004B5FD0
36362 0xc0800386c0 61447 00590048
45452 0xc0800386c0 92170 003B0020
56815 0xc0800386c0 138255 00690020
71018 0xc0800386c0 207382 007A0020
....

更新:

查看 Golang 内存分配策略的评论。

对于STL,策略取决于实现。参见 this post了解更多信息。

最佳答案

您的 Go 和 C++ 代码片段并不等同。在 C++ 函数中,您正在打印向量中第一个元素的地址,而在 Go 示例中,您正在打印 slice 本身的地址。

与 C++ std::vector 一样,Go slice 是一种小型数据类型,它包含指向保存数据的底层数组的指针。该数据结构在整个函数中具有相同的地址。如果您想要 slice 中第一个元素的地址,您可以使用与 C++ 中相同的语法:&arr[0]

关于memory - Golang追加内存分配VS。 STL push_back 内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22316057/

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