Re: И делайте совсем по другому!
От: Erop Россия  
Дата: 26.03.07 15:03
Оценка:
Здравствуйте, rm822, Вы писали:
R>Плюсы:
R>- быстро
R>- не нужно освобождать
R>Грабли:
R>- много не выделишь

Тем более что есть более последовательный С++ подход, примерно такой же по производительности, но совершенно безопасный.
Автор: Erop
Дата: 27.02.07
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: И делайте совсем по другому!
От: Programador  
Дата: 26.03.07 16:01
Оценка: :)
Здравствуйте, Erop, Вы писали:

E>Здравствуйте, rm822, Вы писали:

R>>Плюсы:
R>>- быстро
R>>- не нужно освобождать
R>>Грабли:
R>>- много не выделишь

E>Тем более что есть более последовательный С++ подход, примерно такой же по производительности, но совершенно безопасный.
Автор: Erop
Дата: 27.02.07


Да это так — грабельки. Тут такие грабли на восьмерке с инлайном
Re[3]: Бойтесь alloca
От: remark Россия http://www.1024cores.net/
Дата: 26.03.07 16:06
Оценка:
Здравствуйте, Кодт, Вы писали:


R>>>так вот при некоторых оптимизациях (мне не удалось повторить условия в тестовых условиях но в реальном проекте такое происходит) вызов bool CComBSTR::operator==

R>>>инлайнится. Это довольно мерзкий баг потому что проявляется он ТОЛЬКО в release на большом количестве итераций цикла и может произвольно появляться и исчезать в зависимости от мелких изменений в коде.

R>>Вот это, конечно, неприятно, если это действительно так...


К>Здесь, формально, выход из функции есть, а реально его нет (оптимизатор выбросил ненужный, по его мнению, код пролога-эпилога).


Он действительно так делает или это гипотеза?
И vc6 и vc8 генерируют в такой ситуации некорректный код? а vc71?


1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[4]: Бойтесь alloca
От: Programador  
Дата: 26.03.07 16:09
Оценка:
Здравствуйте, remark, Вы писали:


R>Он действительно так делает или это гипотеза?


Вот код от rm822



//inline  
char * foo(int i)
{
    char* c=(char*)alloca(i+1);
    *c =0;
    return c;
    //printf(c);
}

void CStackoverflowDlg::OnOK() 
{
    try{
        CComBSTR bs = L"sdgfdsfg";
        CString s = "sdfsdf";

        for(int i=0; i< 100000; ++i)
        {
            char* c = foo(i);
            if (bs == c)
                break;
        }
        CDialog::OnOK();
    } catch(...)
    {
        ::MessageBox(0,"shit","shit",0);
    }
}
Re[5]: Бойтесь alloca
От: Programador  
Дата: 26.03.07 19:39
Оценка:
Да так самое интересное я и не разяснил. Фунуция не инлайн. Вроде 1 мег стек по умолчанию? Просто такое подозрение, что они как-то попытались хитро лечить фичу с инлайном и в результате получили баг
Re[2]: Бойтесь alloca
От: Sni4ok  
Дата: 26.03.07 20:45
Оценка:
_>что-бы небыло багов, пользуемся new, delete

интересно посмотреть на эксепшин сэйф код с активным использованием delete'а
Re[3]: Бойтесь alloca
От: Roman Odaisky Украина  
Дата: 26.03.07 20:53
Оценка:
Здравствуйте, Sni4ok, Вы писали:

_>>чтобы небыло багов, пользуемся new, delete


S>интересно посмотреть на эксепшин сэйф код с активным использованием delete'а


Я полагаю, подразумвается использование delete в деструкторах смартпоинтеров?

И вообще, насколько я понял, new и delete были упомянуты в смысле альтернативы alloca, а не как панацея от всех бед.

P. S. Иногда alloca рулит.
До последнего не верил в пирамиду Лебедева.
Re: Бойтесь alloca
От: Аноним  
Дата: 27.03.07 09:31
Оценка:
R>Что такое alloca я думаю объяснять никому не надо — функция выделения памяти на стеке.

Проблема не в функции а в использующем ее.
Re[6]: Бойтесь alloca
От: remark Россия http://www.1024cores.net/
Дата: 27.03.07 09:51
Оценка:
Здравствуйте, Programador, Вы писали:

P>Да так самое интересное я и не разяснил. Фунуция не инлайн. Вроде 1 мег стек по умолчанию? Просто такое подозрение, что они как-то попытались хитро лечить фичу с инлайном и в результате получили баг


Ну а чего ты удивляешься, если ты используешь строку в памяти, которая уже освобождена?


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[7]: Бойтесь alloca
От: Programador  
Дата: 27.03.07 11:03
Оценка:
Здравствуйте, remark, Вы писали:

R>Ну а чего ты удивляешься, если ты используешь строку в памяти, которая уже освобождена?


Где ??? Код от rm822 http://konsuello.mine.nu/stackoverflow/stackoverflow.zip совершенно легальный
Re[8]: Бойтесь alloca
От: red_dragon Украина  
Дата: 27.03.07 11:19
Оценка:
Здравствуйте, Programador, Вы писали:

P>Здравствуйте, remark, Вы писали:


R>>Ну а чего ты удивляешься, если ты используешь строку в памяти, которая уже освобождена?


P>Где ??? Код от rm822 http://konsuello.mine.nu/stackoverflow/stackoverflow.zip совершенно легальный


//inline
char * foo(int i)
{
char* c=(char*)alloca(i+1);
*c =0;
return c; // вот здесь память освобождается
//printf(c);
}
Re[9]: Бойтесь alloca
От: Programador  
Дата: 27.03.07 11:25
Оценка:
Здравствуйте, red_dragon, Вы писали:

_>Здравствуйте, Programador, Вы писали:


P>>Здравствуйте, remark, Вы писали:


R>>>Ну а чего ты удивляешься, если ты используешь строку в памяти, которая уже освобождена?


P>>Где ??? Код от rm822 http://konsuello.mine.nu/stackoverflow/stackoverflow.zip совершенно легальный


_>//inline

_>char * foo(int i)
_>{
_> char* c=(char*)alloca(i+1);
_> *c =0;
_> return c; // вот здесь память освобождается
_> //printf(c);
_>}

А используется то где??? Чем этод код нелегальный?
Re[10]: Бойтесь alloca
От: remark Россия http://www.1024cores.net/
Дата: 27.03.07 11:31
Оценка:
Здравствуйте, Programador, Вы писали:

P>>>Где ??? Код от rm822 http://konsuello.mine.nu/stackoverflow/stackoverflow.zip совершенно легальный


P>А используется то где??? Чем этод код нелегальный?


             if (bs == c)


Здесь выполняется bool CComBSTR::operator == (LPCSTR pszSrc) const, который читает переданную память как strz


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[10]: Бойтесь alloca
От: red_dragon Украина  
Дата: 27.03.07 11:40
Оценка:
Здравствуйте, Programador, Вы писали:

P>А используется то где??? Чем этод код нелегальный?

     char* c = foo(i);
     if (bs == c)    // 1-ое c-указывает на область памяти, которой возможно уже не существует,
         break;      // и возможно находится в другом сегменте


2-ое:
при резервировании большого кол-ва памяти при помощи alloca возможно:
— stack overflow
— segmentation failure
Re[11]: Бойтесь alloca
От: Programador  
Дата: 27.03.07 11:42
Оценка:
Здравствуйте, remark, Вы писали:

R>Здесь выполняется bool CComBSTR::operator == (LPCSTR pszSrc) const, который читает переданную память как strz


Да тип не посмотрел, с char* работает
Re[12]: Бойтесь alloca
От: remark Россия http://www.1024cores.net/
Дата: 27.03.07 12:29
Оценка:
Здравствуйте, Programador, Вы писали:

P>Здравствуйте, remark, Вы писали:


R>>Здесь выполняется bool CComBSTR::operator == (LPCSTR pszSrc) const, который читает переданную память как strz


P>Да тип не посмотрел, с char* работает


Короче мне так ничо и не понятно — есть ошибка в компиляторе или нет
Если у кого чо падает — привидите плз ассемблерный код — где в функции sp не возвращается в зад


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[13]: Бойтесь alloca
От: Programador  
Дата: 27.03.07 12:39
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Programador, Вы писали:


P>>Здравствуйте, remark, Вы писали:


R>>>Здесь выполняется bool CComBSTR::operator == (LPCSTR pszSrc) const, который читает переданную память как strz


P>>Да тип не посмотрел, с char* работает


R>Короче мне так ничо и не понятно — есть ошибка в компиляторе или нет

R>Если у кого чо падает — привидите плз ассемблерный код — где в функции sp не возвращается в зад

R>


Все работает — просто мне показалось , что bs == c сравнение указателей. Код ассемблерный кстати весьма кудрявый в восьмерке
Re[11]: Бойтесь alloca
От: gear nuke  
Дата: 27.03.07 12:48
Оценка:
Здравствуйте, red_dragon, Вы писали:

_> при резервировании большого кол-ва памяти при помощи alloca возможно:

_> — stack overflow

А при new возможен std::bad_alloc

_> — segmentation failure


Не в Виндовсе, там плоская модель памяти.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[12]: Бойтесь alloca
От: ДимДимыч Украина http://klug.org.ua
Дата: 27.03.07 14:38
Оценка:
Здравствуйте, gear nuke, Вы писали:

_>> — segmentation failure


GN>Не в Виндовсе, там плоская модель памяти.


В линуксе тоже плоская модель памяти, а segmentation fault есть В винде он просто "access violation" чаще называется.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[13]: Бойтесь alloca
От: remark Россия http://www.1024cores.net/
Дата: 27.03.07 15:08
Оценка:
Здравствуйте, ДимДимыч, Вы писали:

ДД>Здравствуйте, gear nuke, Вы писали:


_>>> — segmentation failure


GN>>Не в Виндовсе, там плоская модель памяти.


ДД>В линуксе тоже плоская модель памяти, а segmentation fault есть В винде он просто "access violation" чаще называется.


Правильнее сказать — в линуксе тоже есть access violation, просто он чаще называется segmentation fault
Ну что взять с неграмотных людей


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.