thread_local std::list 是否会在调用 clear 时放弃分配的内存?
Does a thread_local std::list give up the allocated memory on calling clear?
当我们对类型为 std::list
且标记为 thread_local
的变量调用 clear 时会发生什么?它会放弃分配的内存吗?
在我的场景中,我有一个 thread_local
列表,我在一次迭代中填充它,并在迭代结束时清除它。 thread_local
在迭代结束时放弃内存(并且必须在下一次迭代中再次分配内存)的情况下不是很有用吗?
将变量标记为 thread_local
对其在分配内存时的行为没有影响 - AFAIK。所以你应该得到相同的行为w.r.t。使用非限定列表、线程本地列表、静态列表等在 clear()
上取消分配
此外,请注意 std::list
使用标准分配器为其堆上的节点分配 space - 单个进程范围的堆(也引用了 this question 关于这一点),并且这些分配本身没有任何线程局部性。只有 who-list-level 数据成员(例如指向第一个节点的指针)是线程本地的。
PS - 我不确定标准是否真的要求在调用 clear()
时释放任何内存 - 但它绝对允许这样做,因为时间复杂度这种方法的可以是线性的。
当我们对类型为 std::list
且标记为 thread_local
的变量调用 clear 时会发生什么?它会放弃分配的内存吗?
在我的场景中,我有一个 thread_local
列表,我在一次迭代中填充它,并在迭代结束时清除它。 thread_local
在迭代结束时放弃内存(并且必须在下一次迭代中再次分配内存)的情况下不是很有用吗?
将变量标记为 thread_local
对其在分配内存时的行为没有影响 - AFAIK。所以你应该得到相同的行为w.r.t。使用非限定列表、线程本地列表、静态列表等在 clear()
上取消分配
此外,请注意 std::list
使用标准分配器为其堆上的节点分配 space - 单个进程范围的堆(也引用了 this question 关于这一点),并且这些分配本身没有任何线程局部性。只有 who-list-level 数据成员(例如指向第一个节点的指针)是线程本地的。
PS - 我不确定标准是否真的要求在调用 clear()
时释放任何内存 - 但它绝对允许这样做,因为时间复杂度这种方法的可以是线性的。