Бойтесь alloca
От: rm822 Россия  
Дата: 26.03.07 10:39
Оценка: 79 (11)
Что такое 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.