Что такое alloca я думаю объяснять никому не надо — функция выделения памяти на стеке.
Плюсы:
— быстро
— не нужно освобождать
Грабли:
— много не выделишь
—
приводит к проблемам. Дело в том что большинство компиляторов в этом случа не воспринимают тело цикла как scope и в зависимости от количества итераций стек может кончиться а может и нет
— неуловимый баг
CComBSTR bs = ........;
CString s = ...........;
for(.......)
{
if (bs == s)
{
......
break;
}
}
Казалось бы ничто не предвещает беды, но все-таки этот код МОЖЕТ содержать баг.
bs == s вызывает bool CComBSTR::operator==(LPCSTR pszSrc) const
так вот при некоторых оптимизациях (мне не удалось повторить условия в тестовых условиях но в реальном проекте такое происходит) вызов bool CComBSTR::operator== инлайнится. Это довольно мерзкий баг потому что проявляется он ТОЛЬКО в release на большом количестве итераций цикла и может произвольно появляться и исчезать в зависимости от мелких изменений в коде.
Здравствуйте, Bell, Вы писали:
B>Любым молотком можно ударить себя по пальцам, но это не означает, что нужно немедленно прекратить использовать молоток.
В данном случае ты не управляешь молотком, сначала он тебя ударит по пальцам а потом и по башке может садануть.
Здравствуйте, rm822, Вы писали:
R>приводит к проблемам. Дело в том что большинство компиляторов в этом случа не воспринимают тело цикла как scope и в зависимости от количества итераций стек может кончиться а может и нет
RTFM man alloca:
DESCRIPTION
The alloca() function allocates size bytes of space in the stack frame of
the caller. This temporary space is automatically freed on return.
Память освобождается при выходе их функции, не при выходе из скопа. Так что тут ты просто некорректно используешь.
То, что размер надо проверять, это само сабой — произвольный размер туда передавать нельзя.
R>так вот при некоторых оптимизациях (мне не удалось повторить условия в тестовых условиях но в реальном проекте такое происходит) вызов bool CComBSTR::operator== R>инлайнится. Это довольно мерзкий баг потому что проявляется он ТОЛЬКО в release на большом количестве итераций цикла и может произвольно появляться и исчезать в зависимости от мелких изменений в коде.
Вот это, конечно, неприятно, если это действительно так...
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, rm822, Вы писали:
B>Любым молотком можно ударить себя по пальцам, но это не означает, что нужно немедленно прекратить использовать молоток.
чтобы молоток не ударил, требовать использовать только в неинлановых функциях и чтобы не был в циклах.
а вообще, функция из эпохи, когда не было инлайнов
Здравствуйте, rm822, Вы писали:
R>Здравствуйте, Bell, Вы писали:
B>>Любым молотком можно ударить себя по пальцам, но это не означает, что нужно немедленно прекратить использовать молоток. R>В данном случае ты не управляешь молотком, сначала он тебя ударит по пальцам а потом и по башке может садануть.
Это про оператор сравнения? Тогда при чем тут alloca? Плохо, конечно, что в документации к этому оператору не указана это особенность (или указана?) но это — , ИМХО, дефект реализации/документации оператора, но никак ни средсва реализации.
Здравствуйте, rm822, Вы писали:
R>приводит к проблемам. Дело в том что большинство компиляторов в этом случа не воспринимают тело цикла как scope
R> return wcscmp(m_str, A2W(pszSrc)) == 0; //A2W — cодержит alloca
В MSDN не прописано, но
1 — скопе в данном случае это всегда должно быть тело функции
2 — fun(aloca()) недопустимо, можно ptr=aloca(); fun(ptr)
Совсем непонятно что такое A2W? — где содержится результат? Пожоже у Вас какойто макрос, со слижком вольным обращением со стеком.
Здравствуйте, Programador, Вы писали:
P>Здравствуйте, rm822, Вы писали:
R>>приводит к проблемам. Дело в том что большинство компиляторов в этом случа не воспринимают тело цикла как scope
R>> return wcscmp(m_str, A2W(pszSrc)) == 0; //A2W — cодержит alloca
P>В MSDN не прописано, но P>1 — скопе в данном случае это всегда должно быть тело функции P>2 — fun(aloca()) недопустимо, можно ptr=aloca(); fun(ptr)
P>Совсем непонятно что такое A2W? — где содержится результат? Пожоже у Вас какойто макрос, со слижком вольным обращением со стеком.
A2W и W2A это два макроса, вроде из ATL а может и WTL преобразубт анси в вайдчар и вайдчар в анси соответсвенно
Спасибо.
Здравствуйте, Programador, Вы писали: P>Совсем непонятно что такое A2W? — где содержится результат? Пожоже у Вас какойто макрос, со слижком вольным обращением со стеком.
Я то тут при чем? Не у меня а у MFC\ATL — все претензии к M$.
Здравствуйте, rm822, Вы писали:
R>так вот при некоторых оптимизациях (мне не удалось повторить условия в тестовых условиях но в реальном проекте такое происходит) вызов bool CComBSTR::operator== R>инлайнится.
А где тело ператора — прямо в классе?
Здравствуйте, Programador, Вы писали:
Посмотрел A2W. МС нарушает fun(aloca()). Вообще смысл этого ограничения в том что стек меняется в процессе проталкивания. Правда там алока первым параметрои идет, наверно поэтому прокатывает.
Так где оператор описан?
Здравствуйте, Bell, Вы писали:
B>Это про оператор сравнения? Тогда при чем тут alloca? Плохо, конечно, что в документации к этому оператору не указана это особенность (или указана?) но это — , ИМХО, дефект реализации/документации оператора, но никак ни средсва реализации.
Это дефект компилятора, который инлайнит функцию, содержащую alloca(), и не вставляет туда код по восстановлению стека.
Здравствуйте, remark, Вы писали:
R>Память освобождается при выходе их функции, не при выходе из скопа. Так что тут ты просто некорректно используешь. R>То, что размер надо проверять, это само сабой — произвольный размер туда передавать нельзя.
R>>так вот при некоторых оптимизациях (мне не удалось повторить условия в тестовых условиях но в реальном проекте такое происходит) вызов bool CComBSTR::operator== R>>инлайнится. Это довольно мерзкий баг потому что проявляется он ТОЛЬКО в release на большом количестве итераций цикла и может произвольно появляться и исчезать в зависимости от мелких изменений в коде.
R>Вот это, конечно, неприятно, если это действительно так...
Здесь, формально, выход из функции есть, а реально его нет (оптимизатор выбросил ненужный, по его мнению, код пролога-эпилога).
Здравствуйте, rm822, Вы писали:
R>>Вот это, конечно, неприятно, если это действительно так... R>Reproduced! R>здесь
R>характерно что на VC6 чтобы упасть ему нужен Inline R>а на VS2005 этот инлайн можно смело убрать и он все равно падает.
Да — действительно ::MessageBox(0,"shit","shit",0);