- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
struct Obect: public AbsractPrimitiv
{
float X,Y;
Obect(float x, float y)
{
X=x;
Y=x;
};
Obect(void)
{
new(this) Obect(0,0);
};
//...
//...
//...
private://Требование конвенции. Блок private обязан быть в каждом классе.
};
This is obvious 28.05.2010 16:58 # +1
guest 28.05.2010 17:05 # 0
This is obvious 28.05.2010 17:16 # +7
guest 28.05.2010 17:06 # +2
Обосранная приметивная обезьяна.
guest 28.05.2010 17:08 # −1
TarasB 28.05.2010 17:02 # −3
А это что означает? Что конструктор принимает один пустой безымянный параметр?
guest 28.05.2010 17:07 # +2
TarasB 28.05.2010 17:38 # −4
guest 28.05.2010 20:00 # −3
Малявка?
Мистер Хэнки 28.05.2010 17:09 # +1
TarasB 28.05.2010 17:38 # 0
guest 28.05.2010 19:44 # +1
Ты уверен, что это минус?
Мистер Хэнки 28.05.2010 19:55 # 0
guest 28.05.2010 20:01 # −3
Это обфускация от школоты, типа тебя.
TarasB 28.05.2010 21:02 # 0
guest 28.05.2010 21:24 # 0
This is obvious 28.05.2010 22:49 # +9
guest 29.05.2010 00:59 # 0
guest 29.05.2010 10:13 # 0
guest 31.05.2010 20:09 # 0
почему рудимент? если можно возвращать void, почему бы его нельзя и принимать?
absolut 31.05.2010 22:06 # 0
Всё таки void - это не тип, а отсутствие оного.
guest 28.05.2010 17:10 # 0
guest 28.05.2010 17:15 # 0
guest 28.05.2010 19:25 # 0
guest 28.05.2010 19:42 # −3
Нормальные люди знают что boo() это синоним boo(void);
Но это нормальные, которые знают Cи. А которые прямо из детсада пошли на php-дельфи писать -- те в курсе конечно.
"пустой безымянный".. марштышка бля
TarasB 28.05.2010 21:04 # 0
guest 28.05.2010 21:12 # +1
А программист от макаки тем и отличается, что знает си (хотя писать может хоть на джаве хоть на питоне)
TarasB 28.05.2010 21:17 # −1
guest 28.05.2010 21:21 # +1
TarasB 28.05.2010 21:29 # −1
guest 29.05.2010 03:21 # +1
Но это не страшно: что бы сдать зачот по информатике за 8й класс -- и дельфи прокатит.
А после школы пойдешь в макдональдс.
Ты уже хеллоу ворлд написал?
TarasB 29.05.2010 11:17 # −1
xaionaro 30.05.2010 12:11 # +5
Между прочим в нормальном обществе люди не стесняясь друг друга спрашивают о чём хотят и получают на это нормальные ответы... а вам главное утвердить своё Эго. А в итоге, из-за этого инфантильного поведение, мнение о вас только падает.
Повторю свою мысль. Если вы видите адекатный вопрос, то лучше всего просто дать на него адекватный ответ, а не начинать "понтами раскидываться". Просто будте взрослее.
А больше всего меня бесит, когда люди скрываясь за "anonymous"-ом начинают обсирать других.
guest 28.05.2010 21:25 # 0
TarasB 28.05.2010 21:27 # 0
guest 29.05.2010 04:22 # −2
TarasB 29.05.2010 11:17 # 0
guest 29.05.2010 11:34 # 0
TarasB 29.05.2010 11:47 # +3
guest 29.05.2010 11:48 # 0
This is obvious 28.05.2010 23:09 # 0
guest 28.05.2010 22:12 # −1
Но это нормальные, которые знают Cи
не путай мерзкий с++ с православным святотроицким си, сука. в си b() это "b с любым количеством аргументов", что не есть b(void). а вот в с++ это одно и то же, однако в с++ писать b(void) вместо b() считается моветоном, видно что автор хуила, школота и копипаст, нихуя не знает синтаксис.
guest 28.05.2010 17:08 # 0
guest 28.05.2010 17:20 # −2
struct Obect: public AbsractPrimitiv наследование структур?
Obect(float x, float y) функции в структурах?
new(this) Obect(0,0); а это что за высер?
UncleAli 28.05.2010 17:25 # +2
UncleAli 28.05.2010 17:31 # 0
> new(this) Obect(0,0); а это что за высер?
Изучаем матчасть: http://www.cplusplus.com/reference/std/new/operator%20new/
guest 28.05.2010 17:34 # 0
guest 28.05.2010 17:38 # 0
А где lvalue ?
Мистер Хэнки 28.05.2010 19:58 # 0
new(this) Obect(0,0);
==
this = new Obect(0,0);
guest 28.05.2010 20:07 # 0
unfunk 29.05.2010 00:36 # 0
new(this) Obect(0,0); создаст объект на месте this без выделения памяти,
а this = new Obect(0,0); создаст в памяти новый объект и вызовет оператор присваивания
guest 29.05.2010 00:38 # 0
guest 29.05.2010 00:40 # 0
guest 29.05.2010 03:23 # −1
unfunk 29.05.2010 00:47 # +1
guest 29.05.2010 00:53 # 0
а если новый объект не влазит в память? или можно только текущего типа?
интересный сахар, только его употребление, имхо, пригодно разве что в говнокод-сценариях.
unfunk 29.05.2010 00:56 # 0
можно и другого типа, главное чтобы размер был одинаковый
guest 29.05.2010 00:56 # +1
> а если новый объект не влазит в память? или можно только текущего типа?
можно disregard, I suck cocks.
НАХРЕН "создавать" this в пределах самого класса, если можно ТУПО изменить поля?
Т.е. нахрен писать new(this) Object(0, 0) если можно тупо часть конструктора выделить в initFields, и вместо этого говна тупо писать initFields(0, 0)?
Пиздец страуструп ебалай какой-то.
unfunk 29.05.2010 01:01 # +1
guest 29.05.2010 01:07 # −2
guest 29.05.2010 01:51 # −2
guest 29.05.2010 12:15 # −2
guest 29.05.2010 12:47 # +1
absolut 29.05.2010 10:58 # 0
Вообще-то this модифицировать нельзя.
guest 29.05.2010 12:16 # −1
absolut 29.05.2010 17:44 # 0
guest 29.05.2010 21:17 # 0
absolut 29.05.2010 22:09 # 0
// Нечто с const_cast<> и this
cout << this << endl;
Покажите мне код, где будут выводиться разные значения ?
guest 31.05.2010 19:44 # −1
absolut 31.05.2010 22:07 # 0
guest 28.05.2010 20:02 # −2
guest 28.05.2010 17:33 # +1
guest 28.05.2010 18:23 # +2
guest 28.05.2010 22:14 # 0
guest 28.05.2010 17:33 # +4
Действительно высер и так делать нельзя, хотя компилируется. Так делают любители скрытых проблем на свою задницу.
guest 28.05.2010 22:09 # 0
guest 28.05.2010 23:52 # +1
pushkoff 31.05.2010 15:53 # 0
guest 31.05.2010 19:43 # 0
pushkoff 31.05.2010 20:21 # 0
код 100% рабочий, я гарантирую это...
вот [url="http://www.prooflink.ru"]пруф[url]
P.S. В новом стандатре разрешили вызывать конструкторы из конструкторов...
guest 31.05.2010 21:08 # 0
Я знаю.
>код 100% рабочий
Код 100% глючный. Сейчас объясню.
guest 31.05.2010 21:25 # +1
Не инженерный подход...
guest 31.05.2010 21:26 # 0
См комменты несколько ниже с объяснениями.
guest 28.05.2010 22:14 # 0
guest 28.05.2010 17:36 # 0
guest 28.05.2010 18:30 # 0
guest 28.05.2010 20:03 # +1
Dreyk 28.05.2010 17:45 # +1
guest 28.05.2010 18:24 # 0
Dreyk 28.05.2010 18:25 # 0
Или я не прав, и оно тут чето другое означает?
guest 28.05.2010 22:16 # +1
UncleAli 28.05.2010 17:50 # +2
guest 28.05.2010 18:07 # 0
Dreyk 28.05.2010 18:26 # 0
guest 28.05.2010 22:11 # 0
guest 29.05.2010 00:02 # 0
guest 29.05.2010 00:41 # 0
guest 29.05.2010 00:59 # +1
guest 28.05.2010 22:17 # +1
> тоже
> тоже
> тоже
палишься
guest 28.05.2010 20:05 # 0
Как это работает и что делает? И вообще работает ли правильно?
guest 28.05.2010 22:11 # 0
guest 28.05.2010 23:53 # 0
guest 29.05.2010 00:58 # 0
Это не будет работать так, как задумано. Грязный нерабочий хак.
pushkoff 31.05.2010 15:56 # 0
guest 31.05.2010 19:42 # 0
new(this) Obect(0,0);
Что произойдёт?
Хуйню получим. Работать правильно не будет.
pushkoff 31.05.2010 20:30 # 0
оператор new(void* ptr) не выделяет память, он на участке ptr, создает объект... но если от этого объекта наследоваться, то получим хуйню, так как этот конструктор затрет vptr если она есть и нужна...
в мат библиотеках (где не бывает vptr) такой хак используют для создания куч разнообразных конструкторов...
guest 31.05.2010 21:21 # +1
Поподробнее объясните этот момент? Что произойдёт?
Если этот объект имеет предка, то получим хуйню. В данном случае он имеет предка:
>struct Obect: public AbsractPrimitiv
1)Конструктор AbsractPrimitiv вызовиться 2 раза подряд. Если там выделялись/резервировались ресурсы, то они остануться заблокированными на всегда, например семафор или выделенная паямть.
2)Произойдёт лишняя работа, например 2 раза инициализируется таблица виртуальных методов.
3)В стандарте не сказано, что при создании объекта компилятор не может проводить всякие внутренние работы, например регистрироваться в списках RTTI. Что при повторной регистрации может привести к неопределённому поведению. В стандарте не сказано, как именно нужно реализовывать RTTI, так что это можно сделать по разному. Кроме RTTI компилятор может проводить прочую скрытую от программера работу.
4)Если в некой функции объявить объект так:
То получаем ещё одну говняшку. Во время скрытой работы объект зарегистрирует свой деструктор на вызов во время завершения приложения 2 раза.
Вообщем не код, а одно сплошное несчастье. И это я не перечислил всех бед, вызванных таким говнокодом.
Программист должен видеть сокрытое и не делать таких ляпов.
guest 31.05.2010 21:23 # 0
[code=cpp]
void f()
{
static Obect obj(/*...*/);
};
[code]
pushkoff 31.05.2010 21:44 # 0
кроме статической переменной, ее адрес регистрирует не конструктор, поэтому с удалением все будет ок
и RTTI никаких действий не производит с объектами в конструкторе... таблицы RTTI создаются статически, в объектах хранится указатель на описание класса, он в конструкторе перезапишется на тоже самое значение, vtbl тоже создается в статике, в объект записывается указатель на нее (RTTI и vtbl выдны в таблице экспорта obj файлов)...
то есть верным остается только первый пункт, и я об этом говорил... поэтому я дописал, что такой хак популярен в некоторых быблиотеках работающих с PODтипами, типа матбиблиотек...
я еще раз повторю, код - отменное говно, но есть условия в которых он рабочий...
guest 31.05.2010 22:07 # 0
>vtbl тоже создается в статике, в объект записывается указатель на нее
Повторяю. Это в вашей реализации компилятора. В стандарте это не указано и всё может происходить именно так, а может и не так.
>vtbl тоже создается в статике, в объект записывается указатель на нее
Это далеко не так очевидно при множественном наследовании.
>статической переменной, ее адрес регистрирует не конструктор
Опять же есть компиляторы с ошибкой, в моём случае - оптимизатора, в котором это именно не так. Мой регистрирует себя при static во время вызова конструктора самого первого предка. Оптимизатор так делает, если его включить.
>но есть условия в которых он рабочий...
А есть условия, когда код не рабочий и одни условия превращаються в другие очень легко по случайности или недосмотру, так что этим хаком лучше не пользоваться. Достаточно добавить предка и наступает ужас. Поменять "хороший" компилятор на "плохой" и получаем тоже самое.
>вы правы на 100%...
Судя по тому, что вы сейчас сказали - лишь на 25% :D
pushkoff 01.06.2010 00:00 # 0
guest 01.06.2010 07:51 # 0
guest 03.06.2010 00:13 # +1
http://lj.rossia.org/users/kouzdra/664091.html?nc=66
Как только начинаешь использовать кучу - наступает jopa жопа (не java).
В момент использования кучи в С++ - его рвут все языки, даже java и OCaml.
guest 03.06.2010 00:39 # 0
pushkoff 03.06.2010 03:40 # 0
guest 03.06.2010 11:39 # 0
pushkoff 03.06.2010 12:12 # 0
можешь посмотреть исходники языков в которых это есть...
guest 03.06.2010 13:58 # 0
людская молва не врёт, ты олень.
подразумевается компактирующий сборщик, который бы работал для с++, т.е. я делаю в с++ MyCoolObject* o = new MyCoolObject(); и через N секунд указатель o будет указывать в другую память.
слабо такое на с++ поиметь?
guest 03.06.2010 15:04 # 0
pushkoff 03.06.2010 15:41 # 0
да, нужно писать и возиться... да, нужно хорошо подумать а нет ли пути проще... да, нужно сначала решить, а нужно ли оно вообще...
все ваши коллекторы написаны не от хорошей жизни... никто не хочет думать, поэтому те кто умеют думать, пишут для тех, кто не умеет...
в большей половине случаев программа на С++ не требует какой либо магии с хипом... в большинстве случаев работа с хипом вообще не требуется, кроме как выделил в начале/удалил в конце, и все приведенные выше тесты из области абсурда... никто (даже последний говнокодер) не пишет так на С++...
P.S. жду тестов где после каждой комманды в С++ будет цикл до миллиона...
guest 03.06.2010 16:38 # 0
Компилиер это соптимизит.
pushkoff 03.06.2010 20:16 # 0
guest 03.06.2010 14:09 # 0
pushkoff 03.06.2010 03:40 # 0
чувствую скоро начнут появляться посты типа если после каждой строки в С++ вставить цикл до миллиона, он начнет тормозить...
guest 03.06.2010 11:40 # 0
ты такой дебил что прямо вообще. основная идея статьи - проверить работу с++ с кучей. как ты собираешься тестировать кучу, не обращаясь к куче, олень?
pushkoff 03.06.2010 12:09 # 0
этот пример можно написать без использования кучи, и никакая ява и окамл даже близко не подлезет по производительности к С++...
С++сом нужно уметь пользоваться... к каждой строке нужно подходить с головой, всетаки не C#/java и тем более не PHP...
guest 03.06.2010 14:01 # 0
guest 03.06.2010 14:02 # 0
Плюс использования new в GC языках в том, что думать ненужно лишний раз. Нет необходимости напрягаться в тех местах, где за тебя может напрячся компилятор. Зато можно напрячся над хорошим алгоритмом.
Если используешь new, а хороший компилер с GC подумает, да выделит память из пула, а то и из стека. И только в критических ситуациях воспользуеться оптимизированной(уже написанной, не велосипедной) кучи.
Попробуй ка в своём С++ переопределить new delete так, что-бы они выделяли память из стека безопасным не хакоподобным образом. Не в жизнь неполучится.
В языках со сборкой мусора между прочим тоже, как и в С++ можно не выделять память лишний раз. Лишний раз выделяют только обезьяны.
guest 03.06.2010 14:08 # 0
Если начали делать линивую систему, делающую всё автоматически, то довелибы её до конца и сделали бы деструктор. Память пускай потом освбождает в свободное время, а деструктор вызовет сейчас в этом потоке.
Как последствие вышесказанного: Занятые ресурсы, типа открытых файлов или занятых семафоров меня бесят.
guest 03.06.2010 14:17 # 0
Ну ты странный. Это то же самое, чтос казать "ООП меня бесит. Использовать процедурное программирование нельзя." или "RAII меня бесит. Использовать в java нельзя" или что-то типа того. Это друголй подход, а ты лезешь в чужой монастырь со своим уставом.
> В случае ловли исключений приходиться чутьли не вручную вызывать "деструктор" (метод dispose()); Бред.
А как иначе? Отсекается 99% ёбли с памятью, из-за чего мы имеем 1% неоднозначных случаев типа этого. А ты предлагаешь из-за 1% непрофита поплевать на 99% профита. На лицо признаки олигофрении.
> . Память пускай потом освбождает в свободное время, а деструктор вызовет сейчас в этом потоке
Как ты представляешь себе вызов деструктора в gc-системе без трекинга ссылок? (который происходит при сборке)? Как система может узнать, что нужно деструктить, не определив, что объект не используется?
Нужно дестурктить прям щас - вызывай dispose. В чём проблема? если забудешь это сделать - то ресурс всё равно высвободится при сборке мусора позднее. в с++ у нас будет 100% утечка.
guest 03.06.2010 15:06 # 0
Кто просил убирать финализатор? Пускай будет финализатор и деструктор. Финализатор вызывается сборщиком в другом потоке, а деструктор сразу, если его конечно переопределили.
Никакого непрофита не будет.
guest 03.06.2010 15:08 # 0
Признаки гидроцифалии?
guest 03.06.2010 15:09 # 0
Ты путаешь. Не у нас, а у тебя. Про деструкторы почитай что-ли.
guest 03.06.2010 15:10 # 0
guest 03.06.2010 15:24 # 0
Это не один процент, а часто. Любая синхронизация, любой доступ к ресурсу.
Между тем, не нужно говорить, что это мега сложно и не оптимально. С++/CLI это умеет. У него финализатор и деструктор есть. деструктор, если его нет - просто не вызываеться, зато решение перекрывает твой так называемый 1%.
И работает ни чуть не медленее.
Если уж не пользоваться goto, то не пользоваться им до конца.
Если пользоваться хорошим нью, то пользоваться и хорошим delete.
ps: Я леньтяй и не хочу, как мудак сидеть и настраивать пулы, да как мудак сидеть и искать где же я забыл вызвать "деструктор".
Зачем полурешение? Если компилятор может сделать ручную работу за меня, достаточно оптимально и надёжно.
Я или всё делаю вручную и сам слежу, или всё отдаю на откуп компилятору. Пусть сам делает, раз начал.
Всякого рода обезьяны не знают, про проблемы деструктора в С#. Вот что им делать? А они тоже люди. А ведь C# позиционируеться, как язык "доступный" обезьянам. Почему он им полностью не потыкает?
pushkoff 03.06.2010 15:44 # 0
pushkoff 03.06.2010 15:46 # 0
то есть вы и сами знаете что проблема с памятью не решена... в С++ только слово по другому называется (delete)... все тоже самое...
guest 03.06.2010 14:02 # 0
чот прямо хочется спросить, ты что за софт такой пишешь, где не нужна динамическая память? тетрис?
guest 03.06.2010 15:11 # 0
pushkoff 03.06.2010 15:47 # 0
раньше казуалки и PS3.
pushkoff 03.06.2010 12:11 # 0
всегда найдется программист который любой код на jave перепишет на С++ и получит профит в виде экономии памяти и выигрыше в производительности... попробуйте поспорить с этим фактом...
guest 03.06.2010 14:03 # 0
спорю: загруженный нонстоп сервер. с++ уже через день будет так дефрагментирован, что будет сначала жутко тормозить, потом вылетать с out of memory exception.
guest 03.06.2010 14:09 # 0
guest 03.06.2010 14:10 # 0
Заметь. Все языки справились с лишними нью, а С++ не справился.
pushkoff 03.06.2010 15:50 # 0
там даже цифры есть из правильной версии, че-то никто не подошел к ним поближе...
guest 03.06.2010 16:36 # 0
pushkoff 03.06.2010 20:18 # 0
guest 31.05.2010 22:08 # −2
absolut 31.05.2010 22:15 # +3
guest 31.05.2010 22:18 # 0
guest 31.05.2010 22:20 # 0
guest 31.05.2010 22:24 # 0
guest 31.05.2010 22:26 # 0
guest 31.05.2010 22:28 # 0
guest 31.05.2010 22:29 # 0
nil 31.05.2010 23:42 # +1
guest 31.05.2010 22:28 # 0
guest 30.05.2010 16:26 # −1
guest 30.05.2010 16:27 # −1
guest 30.05.2010 17:34 # −2
guest 31.05.2010 12:14 # −2
guest 31.05.2010 19:43 # −2
guest 31.05.2010 20:08 # −1
guest 31.05.2010 20:08 # −2
guest 31.05.2010 22:19 # 0
guest 31.05.2010 20:10 # −2
Новый стандарт? Новее С++0х?
guest 01.06.2010 07:52 # +1
guest 01.06.2010 08:04 # −1
guest 01.06.2010 08:05 # −1
guest 01.06.2010 08:08 # −1