Re[26]: Inline records
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 16.10.09 08:51
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

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


G>>не тупи, иллюстрация наследования никак не является кодом реального приложения.

G>>И то что так можно делать, не означает что так надо делать.
PD>>>>>Кстати, и передать вполне можно, пока указатель действителен.
G>>>>Ну коненчо. Только как принимающая сторона узнает о действительности указателя?
PD>>>Язык учи и не задавай глупые вопросы. Это тысячу раз обсуждалось.
G>>Да я знаю язык, ты ответь на этот простой вопрос.

PD>В форум по С++! Там тебе на все такие вопросы ответят. Там много желающих отвечать новичкам на их вопросы. А меня такое последний раз интересовало лет 15 назад, когда я С изучал.


G>>Даже ответить ничго не можешь


PD>И не буду. Отвечать на все глупые вопросы я не намерен. Разберись сначала с основами С++, понятием времени жизни, а потом приходи.


Слив засчитан.
Re[24]: ссылка на стандарт
От: Pavel Dvorkin Россия  
Дата: 16.10.09 09:34
Оценка:
привожу на всякий случай

http://www.kuzbass.ru:8086/docs/isocpp/derived.html
With best regards
Pavel Dvorkin
Re[26]: Inline records
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 17.10.09 20:54
Оценка: :))) :))
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Разберись сначала с основами С++, понятием времени жизни, а потом приходи.


Между прочим, я бросил "разбираться с основами С++" и перешел, ээээ... на другие языки, именно тогда, когда ко мне пришло понимание о времени жизни. Ибо я понял, что она слишком коротка, чтобы тратить ее на сколь-нибудь глубокое изучение С++

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[27]: Inline records
От: Pavel Dvorkin Россия  
Дата: 18.10.09 04:39
Оценка: :)
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>Между прочим, я бросил "разбираться с основами С++" и перешел, ээээ... на другие языки, именно тогда, когда ко мне пришло понимание о времени жизни. Ибо я понял, что она слишком коротка, чтобы тратить ее на сколь-нибудь глубокое изучение С++


Видишь ли, я разобрался с этими понятиями еще когда С++ у нас не было, а был просто Turbo C. А переходить было тоже некуда, разве что обратно на ТурбоПаскаль, но там то же самое, даже сложнее немного (вложенные функции). Так что мне не пришлось потом с чем-то еще разбираться. С тех пор так и живу

Вот, кстати, пример того, как указатель на локальную переменную передается, страшно вымолвить для gandjustas , в другой поток. И ничего, все будет работать. Но КодТ совершенно прав — "так делать категорически можно, но умеючи" . А для этого нужно все же язык знать, и главное, понимать, что делаешь. Если понимаешь, то никаких проблем не возникнет, так как правила-то простенькие. А вот если не понимать, то да, получится одна ерунда.

http://rsdn.ru/forum/cpp.applied/3549503.1.aspx
Автор: Кодт
Дата: 27.09.09


Я бы так сказал — язык С++ дает мне свободу делать все, что я хочу. А это неизбежно сопряжено с возможностью сделать и ошибку. Чтобы свободой как следует воспользоваться, надо хорошо понимать, что при этом можно, и что нельзя делать.
With best regards
Pavel Dvorkin
Re[27]: Inline records
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.10.09 06:20
Оценка: +1
Здравствуйте, kochetkov.vladimir, Вы писали:

PD>>Разберись сначала с основами С++, понятием времени жизни, а потом приходи.


KV>Между прочим, я бросил "разбираться с основами С++" и перешел, ээээ... на другие языки, именно тогда, когда ко мне пришло понимание о времени жизни. Ибо я понял, что она слишком коротка, чтобы тратить ее на сколь-нибудь глубокое изучение С++ ;)


Хм.... +10. Или даже +100.

Причём я видел его судьбу и пользовался ещё начиная с первой версии языка. И видел, что всё текущее развитие глубоко логично в практически всех своих деталях: задачу "превратить Си в объектно-ориентированный язык не сломав совместимость с Си" крайне сложно было бы решить иначе, чем сейчас. (Это вам не PHP, где развитие проводится методом лотереи из готовых расширений не приведя их в хоть какую-то консистентность). Но тем более видно, что с момента введения шаблонов язык принципиально поменял характер, и теперь это фактически совсем другой язык. И что неприятно — сложность его складывается из сложности всех уровней.
The God is real, unless declared integer.
Re[28]: Inline records
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.10.09 06:33
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Вот, кстати, пример того, как указатель на локальную переменную передается, страшно вымолвить для gandjustas :-) , в другой поток. И ничего, все будет работать. Но КодТ совершенно прав — "так делать категорически можно, но умеючи" :-). А для этого нужно все же язык знать, и главное, понимать, что делаешь. Если понимаешь, то никаких проблем не возникнет, так как правила-то простенькие. А вот если не понимать, то да, получится одна ерунда.


PD>http://rsdn.ru/forum/cpp.applied/3549503.1.aspx
Автор: Кодт
Дата: 27.09.09


Ну хорошо, обложишь ты такой кусок кода страницей комментариев, что оно такое и зачем, и в каком случае можно так писать, и как можно менять. А завтра окажется, что надо запускать на платформе, на которой все локальные стеки разных тредов мапятся на один и тот же адрес. Язык этого не запрещает — ему пофиг треды (по крайней мере до наступления коммуни^W нового стандарта).

PD>Я бы так сказал — язык С++ дает мне свободу делать все, что я хочу. А это неизбежно сопряжено с возможностью сделать и ошибку. Чтобы свободой как следует воспользоваться, надо хорошо понимать, что при этом можно, и что нельзя делать.


Осталось понять, какой смысл так делать. Безусловно, ~1% населения согласится ради адреналина жить в доме, где внешней стены просто нет (вопрос климата опускаем). Но остальные захотят таки вернуть на место стену, и это не вопрос "трусости" или "нежелания свободы" — это вопрос экономии усилий на ненужном.
The God is real, unless declared integer.
Re[29]: Inline records
От: Pavel Dvorkin Россия  
Дата: 18.10.09 07:57
Оценка:
Здравствуйте, netch80, Вы писали:

N>Ну хорошо, обложишь ты такой кусок кода страницей комментариев, что оно такое и зачем, и в каком случае можно так писать, и как можно менять. А завтра окажется, что надо запускать на платформе, на которой все локальные стеки разных тредов мапятся на один и тот же адрес. Язык этого не запрещает — ему пофиг треды (по крайней мере до наступления коммуни^W нового стандарта).


В стандарте языка тредов нет, верно. В библиотеке RTL C++ для Windows треды присутствуют, так как __beginthreadex — функция из RTL. Что такое
стеки, маппирующиеся на один и тот же адрес — не знаю, но с потоками Windows это не совместимо — при запуске потока надо указать размер его стека, и стек будет, конечно, новый . Так что если придется это переписывать под иную платформу — здесь все равно придется изменять все, а не только этот кусочек.

PD>>Я бы так сказал — язык С++ дает мне свободу делать все, что я хочу. А это неизбежно сопряжено с возможностью сделать и ошибку. Чтобы свободой как следует воспользоваться, надо хорошо понимать, что при этом можно, и что нельзя делать.


N>Осталось понять, какой смысл так делать. Безусловно, ~1% населения согласится ради адреналина жить в доме, где внешней стены просто нет (вопрос климата опускаем). Но остальные захотят таки вернуть на место стену, и это не вопрос "трусости" или "нежелания свободы" — это вопрос экономии усилий на ненужном.


Все очень просто. Дело в том, что стены не нет вообще, а она убираемая. И если 99% хотят все же стену — пусть вернут ее на место. А вот Мак Сим хотел иное (выделено мной)

Ладно, ладно, спать. И когда же мне удастся поспать
по-человечески? В большой просторной комнате, на свежих
простынях... Что у них здесь за обычай -- спать по многу раз на
одной простыне?.. Да, на свежих простынях, а перед сном
почитать хорошую книгу, потом убрать стену в сад, выключить
свет и заснуть...

(С) Стругацкие, Обитаемый остров

http://thelib.ru/books/strugackie_arkadiy_i_boris/obitaemiy_ostrov-read.html

With best regards
Pavel Dvorkin
Re[28]: Inline records
От: Pavel Dvorkin Россия  
Дата: 18.10.09 08:01
Оценка:
Здравствуйте, netch80, Вы писали:

N>Но тем более видно, что с момента введения шаблонов язык принципиально поменял характер, и теперь это фактически совсем другой язык.


В значительной мере верно.

>И что неприятно — сложность его складывается из сложности всех уровней.


Тоже верно.

Я вовсе не утверждаю, что С++ идеален. Более того, мне многое в нем не нравится. Но альтернативы-то пока нет. Скажу сразу — все управляемые языки в качестве альтернативы не предлагать, это не обсуждается.
With best regards
Pavel Dvorkin
Re[29]: Inline records
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 18.10.09 12:59
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Я вовсе не утверждаю, что С++ идеален. Более того, мне многое в нем не нравится. Но альтернативы-то пока нет.


Ada?

PD> Скажу сразу — все управляемые языки в качестве альтернативы не предлагать, это не обсуждается.


"Сразу скажу" — не понимаю причин такого ограничения.
The God is real, unless declared integer.
Re[28]: Inline records
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 18.10.09 17:12
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Вот, кстати, пример того, как указатель на локальную переменную передается, страшно вымолвить для gandjustas , в другой поток. И ничего, все будет работать. Но КодТ совершенно прав — "так делать категорически можно, но умеючи" . А для этого нужно все же язык знать, и главное, понимать, что делаешь. Если понимаешь, то никаких проблем не возникнет, так как правила-то простенькие. А вот если не понимать, то да, получится одна ерунда.

одного понимания мало. Даже если ты понимаешь что создаешь указатель, время жизни которого больше чем время жизни объекта на который он указывает, то тебе это понимание никак не поможет его просто передать куда-либо, тебе понадобися копирование.

PD>http://rsdn.ru/forum/cpp.applied/3549503.1.aspx
Автор: Кодт
Дата: 27.09.09

Я плакал.... Сихронизация + копирование структуры. И после этого еще кто-то говорит что код на C++ быстрый?

PD>Я бы так сказал — язык С++ дает мне свободу делать все, что я хочу.

Чушь, это кажущаяся тебе свобода. Потому что для получения фич, которые есть в других языках, тебе надо ручками писать инфраструктуру (как замыкания например). При этом написанное ручками будет совсем не быстрее.
Есдинственная свобода которая ничего не стоит — свобода делать ошибки, но такая свобода нафиг не нужна.

PD>А это неизбежно сопряжено с возможностью сделать и ошибку. Чтобы свободой как следует воспользоваться, надо хорошо понимать, что при этом можно, и что нельзя делать.

И чтобы не совершать ошибок надо или изобразить "закат солна вручную", или не пользоваться многими возможностями.
Например чтобы не поиметь утечек надо не возвращать указатель на объект из функции. Надо или отказаться от этой возможности и обрезать возможность применения многих паттернов, или считать ссылки, что получается медленно. Вот тебе и свобода.
Re[30]: Inline records
От: Pavel Dvorkin Россия  
Дата: 19.10.09 04:40
Оценка:
Здравствуйте, netch80, Вы писали:

PD>>Я вовсе не утверждаю, что С++ идеален. Более того, мне многое в нем не нравится. Но альтернативы-то пока нет.


N>Ada?


Хороший язык. Помню, еще тогда, в начале 80-х читал книгу с удовольствием. Но не пошел...

PD>> Скажу сразу — все управляемые языки в качестве альтернативы не предлагать, это не обсуждается.


N>"Сразу скажу" — не понимаю причин такого ограничения.


Не будем обсуждать.
With best regards
Pavel Dvorkin
Re[29]: Inline records
От: Pavel Dvorkin Россия  
Дата: 19.10.09 04:58
Оценка: -1 :)
Здравствуйте, gandjustas, Вы писали:

PD>>http://rsdn.ru/forum/cpp.applied/3549503.1.aspx
Автор: Кодт
Дата: 27.09.09

G>Я плакал.... Сихронизация + копирование структуры. И после этого еще кто-то говорит что код на C++ быстрый?

Я уже давно рыдать должен, читая твои опусы. Нет там копирования. Там просто КодТ ошибку допустил, что вполне простительно, так как это лишь псевдокод

Вместо

A data = &(A*)(pd->data)

должно быть

A* data = (A*) pd->data;

Впрочем, проще было бы вот так

struct PassData
{
event thanks; // ваш любимый инструментарий
A* data;
PassData(A* p) : data(p) {}
};

и тогда

A* data = pd->data;

Иди учи язык!
With best regards
Pavel Dvorkin
Re[30]: Inline records
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.10.09 05:09
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


PD>>>http://rsdn.ru/forum/cpp.applied/3549503.1.aspx
Автор: Кодт
Дата: 27.09.09

G>>Я плакал.... Сихронизация + копирование структуры. И после этого еще кто-то говорит что код на C++ быстрый?

PD>Я уже давно рыдать должен, читая твои опусы. Нет там копирования. Там просто КодТ ошибку допустил, что вполне простительно, так как это лишь псевдокод


PD>Вместо


PD> A data = &(A*)(pd->data)


PD>должно быть


PD> A* data = (A*) pd->data;


PD>Впрочем, проще было бы вот так


PD>struct PassData

PD>{
PD> event thanks; // ваш любимый инструментарий
PD> A* data;
PD> PassData(A* p) : data(p) {}
PD>};

PD>и тогда


PD> A* data = pd->data;


Да ты че?
Если ты не понял, то указатель A* data в потоке станет ни разу не валидным после завершения функции launch.

PD>Иди учи язык!

Иди учись программировать. Язык тут кстати совершенно не при чем.
Re[31]: Inline records
От: Pavel Dvorkin Россия  
Дата: 19.10.09 05:31
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Да ты че?

G>Если ты не понял, то указатель A* data в потоке станет ни разу не валидным после завершения функции launch.

О господи! Сил уже нет!

Ты хоть пойми, что такое рандеву! Внутри launch стоит wait_event(pd.thanks); А в потоковой функции есть set_event(pd->thanks);, который и означает, что работа с этим A* закончена.
До тех пор, пока не вызвали в потоке set_event(pd->thanks), переменная A a из основного потока существует, так как выход из launch невозможен.И как только дождемся в основном потоке — только теперь эта переменная может помереть.
With best regards
Pavel Dvorkin
Re[32]: Inline records
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.10.09 05:35
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

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


G>>Да ты че?

G>>Если ты не понял, то указатель A* data в потоке станет ни разу не валидным после завершения функции launch.

PD>О господи! Сил уже нет!

Главное чтобы мозг был.

PD>Ты хоть пойми, что такое рандеву! Внутри launch стоит wait_event(pd.thanks); А в потоковой функции есть set_event(pd->thanks);, который и означает, что работа с этим A* закончена.

PD>До тех пор, пока не вызвали в потоке set_event(pd->thanks), переменная A a из основного потока существует, так как выход из launch невозможен.И как только дождемся в основном потоке — только теперь эта переменная может помереть.
Дождемся чего? Завершения потока?
Иначе придется скопировать данные из A еще куда-либо.
Чудес не бывает.

Так что иди учись программировать.
Re[32]: пример
От: Pavel Dvorkin Россия  
Дата: 19.10.09 05:45
Оценка:
Наиболее типичное использование

основной поток

A a;
beginthreadex(&a);
while(не знаю что)
{
заполняем а
SignalObjectAndWait(...) // или пара SetEvent + WaitForSingleObject
}

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

второй поток

threadfunc(void* p)
{
A* pa = (A*) p;
while(не знаю что)
{
WaitForSingleObject;
// что-то делем c pa
// SetEvent
}
With best regards
Pavel Dvorkin
Re[33]: Inline records
От: Pavel Dvorkin Россия  
Дата: 19.10.09 05:48
Оценка:
Здравствуйте, gandjustas, Вы писали:

PD>>До тех пор, пока не вызвали в потоке set_event(pd->thanks), переменная A a из основного потока существует, так как выход из launch невозможен.И как только дождемся в основном потоке — только теперь эта переменная может помереть.

G>Дождемся чего? Завершения потока?

ивента! Ясно же написано — wait_event(pd.thanks);

G>Иначе придется скопировать данные из A еще куда-либо.


Зачем ? Они уже обработаны. Поток продолжает свою деятельность без обращения к ним.

G>Чудес не бывает.


Это точно. Бывает лишь элементарное непонимание!

См. пример http://rsdn.ru/forum/philosophy/3574170.1.aspx
Автор: Pavel Dvorkin
Дата: 19.10.09
With best regards
Pavel Dvorkin
Re[34]: Inline records
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.10.09 05:56
Оценка: +1
Здравствуйте, Pavel Dvorkin, Вы писали:

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


PD>>>До тех пор, пока не вызвали в потоке set_event(pd->thanks), переменная A a из основного потока существует, так как выход из launch невозможен.И как только дождемся в основном потоке — только теперь эта переменная может помереть.

G>>Дождемся чего? Завершения потока?
PD>ивента! Ясно же написано — wait_event(pd.thanks);

G>>Иначе придется скопировать данные из A еще куда-либо.

PD>Зачем ? Они уже обработаны. Поток продолжает свою деятельность без обращения к ним.

То есть на время обработки А (фактически где существует обращение к А) launch будет заблокирован?
Прекрасно!!! Особенно если вся работа потока сводится к A.


G>>Чудес не бывает.

PD>Это точно. Бывает лишь элементарное непонимание!
PD>См. пример http://rsdn.ru/forum/philosophy/3574170.1.aspx
Автор: Pavel Dvorkin
Дата: 19.10.09

Ты вообще представляешь как это медленно работать будет? Особенно если тебе в цикле надо раскидать работу по множеству потоков.
Re[35]: Inline records
От: Pavel Dvorkin Россия  
Дата: 19.10.09 06:02
Оценка:
G>Ты вообще представляешь как это медленно работать будет?

Ты вообще понимаешь, для чего SignalObjectAndWait сделана ? Кстати, ее добавили в NT 4.0, до этого ее не было.
With best regards
Pavel Dvorkin
Re[36]: Inline records
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.10.09 06:11
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

G>>Ты вообще представляешь как это медленно работать будет?


PD>Ты вообще понимаешь, для чего SignalObjectAndWait сделана ? Кстати, ее добавили в NT 4.0, до этого ее не было.


В курсе, только причем тут это?

Напиши таким образом реальный код, который например распараллеливает суммирование массива чисел на N потоков.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.