Re: Конструктор и цикл
От: Аноним  
Дата: 03.10.07 15:51
Оценка:
создать вне цикла буфер размером в объект
в цикле вызывать placement new на этот буфер.
Re[7]: Ну можешь ты пример какой-нибудь привести?
От: Erop Россия  
Дата: 03.10.07 16:13
Оценка:
Здравствуйте, pasenger, Вы писали:

P>Нечитаемость в данном случае означает использование малораспространенной лексики. Я вобщем не возражаю. Мне и хотелось найти какой-нибудь стандартный аналог.

Нет. Это ещё не обязано работать, кроме того игнорируется факт наличия деструкторов у объектов

P>И пока не видно стандартных способов определить переменную, не объявляя ее.

А что ты понимаешь, под "объявить не определяя"? ЧТо можно делать с переменной, которую уже "объявили", но ещё не определили?

P>>>Да, это работает. Но вроде зовутся лишние деструкторы.

Да что за деструкторы-то такие "лишние"?

E>>А почему бы их не сделать тривиальными, если они лишние?

P>Честно говоря, в данном случае я не возражаю. Видимо наиболее подходящий способ. Я как раз его и опубликовал в начале топика. Вопрос начинался на тему производительности.

Так тривиальные деструкторы ничего не делают

E>>Зачем менять объекты, которые нельзя менять по их семантике?

E>>Приведи пример такого объекта, что ли...
P>В данный вопрос не хочется углубляться, потому что получиться отдельный, хотя, возможно, и интересный разговор.

P>Могу попробовать описать, как такая ситуация может возникнуть в реальности. Есть сторонняя библиотека без сорцов, какая-нибудь тяжелая нетривиальная математика, написанная людьми шарящими в математике и не шарящими в плюсах. И авторы библиотеки просто не заморачивались такими вещами, как копирование, "=". И со всем этим надо как-то жить.


Ну можешь пример класса оттуда привести? Хотя бы схематически? И зачем нужна его "отложенная инициализация" тоже...


P>Меня интересует стандартная конструкция, позволяющая делать то же, что делает этот "невалидный вызов конструктора" без внесения дополнительных ограничений и без потерь производительности.

P>Ну либо понять, что мне хочется невозможного. Кажется, дело к тому и идет.

Ты можешь понятно объяснить чего тебе надо сделать-то?

Например, с точностью до выравнивания (выравнивание можно рассмотреть отдельно) можно наваять что-то такое:
template<typename T> class ObjHolder {
public:
    ObjHolder() : p ( 0 ) {}
    ~ObjHolder() { if( p != 0 ) p->~T(); p = 0; }

    bool IsCreated() const { return p != 0; }
    T& Get() { assert( p != 0 ); return *p; }
    const T& Get() const { assert( p != 0 ); return *p; }

    template<typename TArg1>
    Init( TArg1 a1 ) { assert( p != 0 ); p = new( buffer )T( a1 ); }
    template<typename TArg1, typename TArg2>
    Init( TArg1 a1, TArg2 a2 ) { assert( p != 0 ); p = new( buffer )T( a1, a2 ); }
    template<typename TArg1, typename TArg2, typename TArg3>
    Init( TArg1 a1, TArg2 a2, TArg3 a3 ) { assert( p != 0 ); p = new( buffer )T( a1, a2, a3 ); }

private:
    char buffer[sizeof( T )];
    T* p;
};


Соответсвенно заводишь себе холдер, потом в нём создаёшь объект, когда надо.
Только я всё равно никак не пойму на кой это всё надо.

P>Вам-то кажется, что все это невообразимо коряво, а мне кажется, что это очень удобно. Но это вкусовщина, которая совершенно не важна.

Мне-то кажется, что это довольно опасно, а не коряво
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: Конструктор и цикл
От: Smal Россия  
Дата: 03.10.07 16:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>создать вне цикла буфер размером в объект

А>в цикле вызывать placement new на этот буфер.
Может не работать из-за проблем с выравниванием.
+ к этому не вызываются деструкторы.
С уважением, Александр
Re[8]: "А теперь со всей этой фигней мы попытаемся взлететь"
От: Erop Россия  
Дата: 03.10.07 21:13
Оценка:
Здравствуйте, pasenger, Вы писали:

P>Самое удивительное, что после всего, эта штука умудряется как-то работать.

Да ещё и довольно эффективно к тому же.

Короче не стоит с немытыми руками и в потроха. Особенно не до конца понимая, где можно получить по пальцам
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: А что ты хочешь получить?
От: Yagg Россия  
Дата: 04.10.07 09:16
Оценка:
Здравствуйте, pasenger, Вы писали:

P>Ага, спасибо. Вот
Автор: Erop
Дата: 02.10.07
говорят, что неопределенное поведение. Хотя тесты и на стеке и в динамической памяти вроде нормально себя ведут. Наверное, возникают проблемы, когда используемый класс каких-нибудь ресурсов наоткрывает, а мы потом затираем все концы новым конструктором.

Угу, проблемы будут, я же с этим не спорю. Это просто легальный и переносимый способ сделать то, то ты просил. Ты же хотел вызвать конструктор? Ну и получай... А траблы созданные тобой всё равно компилятор не решит и разруливать прийдётся самостоятельно.
Re[2]: Конструктор и цикл
От: Sni4ok  
Дата: 04.10.07 09:45
Оценка:
Здравствуйте, ilnar, Вы писали:

I>извращенство какое!

I>сделайте просто функцию, выполняющий то что выполняет конструктор.

даже такой код вы считаете извращением?
    for(; it!= it_e; ++it){
        boost::thread thrd(boost::bind(&WorkThread, boost::cref(*it)));
    }
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.