Выделение объекта CDC
в куче для экономии памяти стека - это смешно! (прости меня за грубый язык).
Это небольшой объект, всего 16 байтов (в архитектуре Win32). Это просто 4 "целочисленных" переменных.
На самом деле можно работать с необработанным HDC
(который является только одним «целым числом»), однако для оболочки MFC по некоторым причинам определены еще 3 переменные.
Выделение памяти в куче, кроме ненужного кода, приводит к серьезному снижению производительности. Также он имеет значительные накладные расходы памяти, плюс вам нужна еще одна переменная (указатель на выделенную память). Так что общая потеря памяти - это гораздо больше. Кроме того, при работе с указателем на динамически распределяемые данные у вас фактически возникает дополнительная косвенность.
Нужно беспокоиться о потреблении слишком большого количества стековой памяти, если выделенные объекты имеют размер, сопоставимый с общим размером доступного стека. Скажем, на Win32 с размером стека потока по умолчанию 1 МБ я бы беспокоился о выделении объектов, начиная с десятков КБ. Или, в качестве альтернативы, вам следует беспокоиться, если вы широко используете глубокую рекурсию (тогда все выделенные локальные переменные умножаются на глубину рекурсии).
Но выделение 16 байтов «для экономии памяти стека» - это звучит безумно по сравнению с ужасным снижением производительности, сложностью кода, фрагментацией памяти и т. Д.