Отпускает ли thread_local std :: list выделенную память при вызове clear? - PullRequest
1 голос
/ 16 апреля 2019

Что происходит, когда мы вызываем clear для переменной типа std::list, которая также помечена thread_local?Отдает ли это выделенную память?

В моем сценарии у меня есть список thread_local, который я заполняю за одну итерацию и очищаю к концу итерации.Неужели thread_local не очень полезен в таком случае, когда мы оставляем память к концу итерации (и должны распределить память снова на следующей итерации)?

1 Ответ

6 голосов
/ 16 апреля 2019

Пометка переменной как thread_local не влияет - AFAIK - на ее поведение при выделении памяти.Таким образом, вы должны получить то же поведение в отношении перераспределения на clear() с неквалифицированным списком, локальным списком потоков, статическим списком и т. Д.

Также обратите внимание, что std::list со стандартным распределителемвыделяет пространство для своих узлов в куче - единой, куче всего процесса (ses также параграф, процитированный из стандарта в этот вопрос об этой точке), и нет ничего локального для потока в этих распределениях.Это просто элементы данных уровня who (например, указатель на первый узел) локально для потока.

PS - я не уверен, что стандарт на самом деле требует освобождения любой памятивызов clear() - но это определенно учитывает это, поскольку временная сложность этого метода может быть линейной.

...