【问题标题】:Does a thread_local std::list give up the allocated memory on calling clear?thread_local std::list 是否在调用 clear 时放弃分配的内存?
【发布时间】:2019-09-06 21:41:03
【问题描述】:

当我们对同样标记为thread_localstd::list 类型的变量调用clear 时会发生什么?是否放弃分配的内存?

在我的场景中,我有一个 thread_local 列表,我在一次迭代中填充并在迭代结束时清除。 thread_local 在我们在迭代结束时放弃内存(并且必须在下一次迭代中再次分配内存)的情况下不是很有用吗?

【问题讨论】:

  • "在我的场景中,我有一个 thread_local 列表,我在一次迭代中填充并在迭代结束时清除。" 为什么它需要是线程本地的?想必那是一个栈变量,那为什么是线程局部的呢?
  • 你确定需要thread_local列表吗?
  • 好点。我可能不需要它作为 thread_local

标签: c++ c++11 memory-management std stdlist


【解决方案1】:

将变量标记为thread_local 对其在分配内存时的行为没有影响 - AFAIK。所以你应该得到相同的行为 w.r.t.使用非限定列表、线程本地列表、静态列表等取消分配 clear()

另外,请注意std::list 使用标准分配器为其在堆上的节点分配空间 - 单个进程范围的堆(这也是this question 中关于这一点的标准引用的段落),并且有这些分配本身没有线程本地的。只有 who-list 级别的数据成员(例如指向第一个节点的指针)才是线程本地的。

PS - 我不确定标准是否真的要求在调用 clear() 时释放任何内存 - 但它绝对允许这样做,因为此方法的时间复杂度可以是线性的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多