Вопрос не требует пояснений (надеюсь).

Я стараюсь по возможности избегать new / delete (malloc / free), когда время жизни объекта попадает в срок жизни фрейма стека. Мне кажется, попадания в кеш, пейджинг и т. Д. Будут одинаковыми (стек против кучи), нет?

Конечно, применяется обычный мелкий шрифт: избегать рекурсии, устанавливать ограничение стека в ОС и т. Д.

1
Benito Ciaro 24 Апр 2014 в 17:21

2 ответа

Лучший ответ

Это действительно зависит от ОС, конфигурации, а также от того, используете ли вы потоки и как они создаются. Например, главный поток в Linux имеет неограниченный стек (ограниченный только конфигурацией в ulimit), на другом конце поток, порожденный с pthread_create в AIX, по умолчанию имеет размер стека 96 КБ.

Вам нужно изучить вашу целевую архитектуру и API-интерфейсы для создания потоков (если вы выполняете многопоточность), чтобы иметь возможность ответить на этот вопрос.

2
David Rodríguez - dribeas 24 Апр 2014 в 13:28

64-битное адресное пространство не имеет значения. Важно то, сколько места зарезервировано для стека. Если ваш объект помещается в зарезервированный размер стека, тогда разместите его в стеке.

С другой стороны, если у вас есть объект размером 32 КБ, то, вероятно, вы собираетесь работать с ним. И для объекта такого размера стоимость операций наверняка полностью превысит стоимость одного выделения кучи. Поэтому я не уверен, что выгода от распределения стека будет измеримой. Поэтому, если у вас есть какие-либо сомнения относительно размещения объекта в стеке, вам нечего терять, поместив его в кучу.

2
David Heffernan 24 Апр 2014 в 13:49