Где предпочтительней выделять память, в стеке или на куче в плане оптимизации быстродействия\расхода ресурсов? Почему? Или же нет принципиальной разницы?
Принципиальной разницы нет. Но если речь идет о небольших объемах в десятки-сотни байт, то стек м.б. более предпочтительным, т.к. и само "выделение" памяти в нем происходит мгновенно (add esp,X), и cтек используется чаще, поэтому область адресов вблизи текущего esp как правило всегда находится в кэше. А выделение памяти в куче и происходит дольше (сотни тактов) и нет гарантии, что будет выделен блок, который ранее (недавно) использовался, и соотв-но его может не быть в кэше и соотв-но плюс еще пару сотен тактов на его загрузку из ОЗУ в кэш. Но разумеется это только начальные затраты на выделение участка памяти, а при дальнейшем обращении к ней на чтение\запись ес-но пофиг, где она находится в стеке или в куче
Маленькое и временное лучше в стеке, поскольку это быстрее - одна команда sub esp, вместо тяжеловесного вызова API, большое и долгоиграющее лучше в куче, поскольку стек не резиновый, а относительные затраты на обращение к куче в больших массивах микроскопичны. Кстати если выделяешь в стеке больше страницы (4кб) за один заход, то нужно быть осторожным если обратиться за пределы строжевой страницы стека прога упадёт, чтобы этого избежать нужно либо заполнять такой массив "с конца" т.е. от старших адресов к младшим, либо предварительно "пробежаться" по нему от конца к началу с шагом 4кб.
То у каждого потока свой стек и соответсвенно внутри потока правила те-же, а для "общих" данных конечно юзать кучу.
А "общие" данные лучше вообще не юзать или юзать "редко", т.к. иначе на многоядерных компах могут быть доп.тормоза на синхронизацию линеек кэшей первого уровня (а на атлонах и второго).