Что такое alloca я думаю объяснять никому не надо — функция выделения памяти на стеке.
Плюсы:
— быстро
— не нужно освобождать
Грабли:
— много не выделишь
—
for(.......)
{
char* = (char*)alloca(bytesCount);
}
приводит к проблемам. Дело в том что большинство компиляторов в этом случа не воспринимают тело цикла как scope и в зависимости от количества итераций стек может кончиться а может и нет
— неуловимый баг
CComBSTR bs = ........;
CString s = ...........;
for(.......)
{
if (bs == s)
{
......
break;
}
}
Казалось бы ничто не предвещает беды, но все-таки этот код МОЖЕТ содержать баг.
bs == s вызывает bool CComBSTR::operator==(LPCSTR pszSrc) const
bool CComBSTR::operator==(LPCSTR pszSrc) const
{
if (pszSrc == NULL && m_str == NULL)
return true;
USES_CONVERSION;
if (pszSrc != NULL && m_str != NULL)
return wcscmp(m_str, A2W(pszSrc)) == 0; //A2W - cодержит alloca
return false;
}
так вот при некоторых оптимизациях (мне не удалось повторить условия в тестовых условиях но в реальном проекте такое происходит) вызов bool CComBSTR::operator==
инлайнится. Это довольно мерзкий баг потому что проявляется он ТОЛЬКО в release на большом количестве итераций цикла и может произвольно появляться и исчезать в зависимости от мелких изменений в коде.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>