The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Выпуск языка программирования Rust 1.50, opennews (?), 12-Фев-21, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


6. Скрыто модератором  +12 +/
Сообщение от Аноним (6), 12-Фев-21, 16:08 
Ответить | Правка | Наверх | Cообщить модератору

7. Скрыто модератором  +2 +/
Сообщение от Аноним (3), 12-Фев-21, 16:09 
Ответить | Правка | Наверх | Cообщить модератору

13. Скрыто модератором  +5 +/
Сообщение от Аноним (6), 12-Фев-21, 16:20 
Ответить | Правка | Наверх | Cообщить модератору

19. Скрыто модератором  +3 +/
Сообщение от Аноним (3), 12-Фев-21, 16:24 
Ответить | Правка | Наверх | Cообщить модератору

28. Скрыто модератором  +/
Сообщение от Аноним (6), 12-Фев-21, 16:35 
Ответить | Правка | Наверх | Cообщить модератору

42. Скрыто модератором  +1 +/
Сообщение от Аноним (42), 12-Фев-21, 16:49 
Ответить | Правка | Наверх | Cообщить модератору

45. Скрыто модератором  –1 +/
Сообщение от Аноним (45), 12-Фев-21, 16:53 
Ответить | Правка | Наверх | Cообщить модератору

53. Скрыто модератором  +/
Сообщение от Аноним (42), 12-Фев-21, 17:01 
Ответить | Правка | Наверх | Cообщить модератору

62. Скрыто модератором  +5 +/
Сообщение от Аноним (62), 12-Фев-21, 17:11 
Ответить | Правка | Наверх | Cообщить модератору

68. Скрыто модератором  –5 +/
Сообщение от Аноним (45), 12-Фев-21, 17:14 
Ответить | Правка | К родителю #53 | Наверх | Cообщить модератору

126. Скрыто модератором  +4 +/
Сообщение от Школьник (ok), 12-Фев-21, 18:23 
Ответить | Правка | Наверх | Cообщить модератору

132. Скрыто модератором  +/
Сообщение от Аноним (45), 12-Фев-21, 18:37 
Ответить | Правка | Наверх | Cообщить модератору

142. Скрыто модератором  +1 +/
Сообщение от Школьник (ok), 12-Фев-21, 19:13 
Ответить | Правка | Наверх | Cообщить модератору

147. Скрыто модератором  +/
Сообщение от Аноним (45), 12-Фев-21, 19:31 
Ответить | Правка | К родителю #142 | Наверх | Cообщить модератору

185. Скрыто модератором  +/
Сообщение от Школьник (ok), 12-Фев-21, 22:29 
Ответить | Правка | К родителю #147 | Наверх | Cообщить модератору

150. Скрыто модератором  +/
Сообщение от Ordu (ok), 12-Фев-21, 19:34 
Ответить | Правка | К родителю #126 | Наверх | Cообщить модератору

188. Скрыто модератором  +/
Сообщение от Школьник (ok), 12-Фев-21, 22:45 
Ответить | Правка | Наверх | Cообщить модератору

56. Скрыто модератором  +/
Сообщение от Michael Shigorinemail (ok), 12-Фев-21, 17:05 
Ответить | Правка | К родителю #45 | Наверх | Cообщить модератору

141. Скрыто модератором  –1 +/
Сообщение от Аноним (45), 12-Фев-21, 19:11 
Ответить | Правка | Наверх | Cообщить модератору

54. Скрыто модератором  +/
Сообщение от Gemorroj (ok), 12-Фев-21, 17:01 
Ответить | Правка | К родителю #13 | Наверх | Cообщить модератору

29. Скрыто модератором  +/
Сообщение от Ordu (ok), 12-Фев-21, 16:35 
Ответить | Правка | К родителю #7 | Наверх | Cообщить модератору

35. Скрыто модератором  +6 +/
Сообщение от Аноним (35), 12-Фев-21, 16:40 
Ответить | Правка | Наверх | Cообщить модератору

43. Скрыто модератором  +2 +/
Сообщение от Аноним (45), 12-Фев-21, 16:50 
Ответить | Правка | Наверх | Cообщить модератору

49. Скрыто модератором  +2 +/
Сообщение от Школьник (ok), 12-Фев-21, 16:57 
Ответить | Правка | Наверх | Cообщить модератору

60. Скрыто модератором  +3 +/
Сообщение от Ordu (ok), 12-Фев-21, 17:10 
Ответить | Правка | Наверх | Cообщить модератору

75. Скрыто модератором  +/
Сообщение от Школьник (ok), 12-Фев-21, 17:20 
Ответить | Правка | Наверх | Cообщить модератору

113. Скрыто модератором  +1 +/
Сообщение от Ordu (ok), 12-Фев-21, 17:55 
Ответить | Правка | Наверх | Cообщить модератору

120. Скрыто модератором  +1 +/
Сообщение от заминированный тапок (ok), 12-Фев-21, 18:01 
Ответить | Правка | К родителю #60 | Наверх | Cообщить модератору

123. Скрыто модератором  +/
Сообщение от Ordu (ok), 12-Фев-21, 18:14 
Ответить | Правка | Наверх | Cообщить модератору

144. Скрыто модератором  +/
Сообщение от Аноним (42), 12-Фев-21, 19:23 
Ответить | Правка | Наверх | Cообщить модератору

156. Скрыто модератором  +/
Сообщение от Ordu (ok), 12-Фев-21, 19:42 
Ответить | Правка | Наверх | Cообщить модератору

357. Скрыто модератором  +/
Сообщение от заминированный тапок (ok), 15-Фев-21, 12:22 
Ответить | Правка | К родителю #123 | Наверх | Cообщить модератору

51. Скрыто модератором  +2 +/
Сообщение от Аноним (42), 12-Фев-21, 16:59 
Ответить | Правка | К родителю #43 | Наверх | Cообщить модератору

57. Скрыто модератором  +/
Сообщение от Ordu (ok), 12-Фев-21, 17:06 
Ответить | Правка | К родителю #35 | Наверх | Cообщить модератору

94. Скрыто модератором  +1 +/
Сообщение от Аноним (35), 12-Фев-21, 17:34 
Ответить | Правка | Наверх | Cообщить модератору

101. Скрыто модератором  +/
Сообщение от Ordu (ok), 12-Фев-21, 17:41 
Ответить | Правка | Наверх | Cообщить модератору

104. Скрыто модератором  +/
Сообщение от Аноним (42), 12-Фев-21, 17:46 
Ответить | Правка | Наверх | Cообщить модератору

109. Скрыто модератором  +/
Сообщение от Ordu (ok), 12-Фев-21, 17:49 
Ответить | Правка | Наверх | Cообщить модератору

121. Скрыто модератором  +1 +/
Сообщение от Аноним (35), 12-Фев-21, 18:10 
Ответить | Правка | К родителю #101 | Наверх | Cообщить модератору

128. Скрыто модератором  +1 +/
Сообщение от Ordu (ok), 12-Фев-21, 18:25 
Ответить | Правка | Наверх | Cообщить модератору

46. Скрыто модератором  +2 +/
Сообщение от Аноним (42), 12-Фев-21, 16:57 
Ответить | Правка | К родителю #29 | Наверх | Cообщить модератору

52. Скрыто модератором  –1 +/
Сообщение от Аноним (45), 12-Фев-21, 17:00 
Ответить | Правка | Наверх | Cообщить модератору

55. Скрыто модератором  +2 +/
Сообщение от Аноним (42), 12-Фев-21, 17:04 
Ответить | Правка | Наверх | Cообщить модератору

82. Скрыто модератором  –1 +/
Сообщение от Аноним (45), 12-Фев-21, 17:26 
Ответить | Правка | Наверх | Cообщить модератору

58. Скрыто модератором  –2 +/
Сообщение от Ordu (ok), 12-Фев-21, 17:07 
Ответить | Правка | К родителю #46 | Наверх | Cообщить модератору

85. Скрыто модератором  +/
Сообщение от null (??), 12-Фев-21, 17:29 
Ответить | Правка | Наверх | Cообщить модератору

63. "Выпуск языка программирования Rust 1.50"  +1 +/
Сообщение от San (??), 12-Фев-21, 17:11 
int main() {
Test a = Test(std::string("first"));
Test b = Test(std::string("second"));
return 0;
}

Constructor called with name: first
Constructor called with name: second
Destructor called for second
Destructor called for first

Твой пример работает ровно так, как ты написал программу.

Ответить | Правка | К родителю #29 | Наверх | Cообщить модератору

72. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (42), 12-Фев-21, 17:17 
Растаманам это не понять, что программа делает ровно то, что выдумал погромист.
Ответить | Правка | Наверх | Cообщить модератору

74. "Выпуск языка программирования Rust 1.50"  –2 +/
Сообщение от Ordu (ok), 12-Фев-21, 17:20 
> int main() {
> Test a = Test(std::string("first"));
> Test b = Test(std::string("second"));
> return 0;
> }
> Constructor called with name: first
> Constructor called with name: second
> Destructor called for second
> Destructor called for first
> Твой пример работает ровно так, как ты написал программу.

Я знаю что он работает так, как я написал. Мне надо, чтобы он работал иначе, в том то собственно и вопрос, как написать иначе. Твой вариант сработает, но он не решает проблемы. Пример просто упрощён до предела. Представь что a -- это член класса. Мне надоело его значение, и я хочу заменить его на другое. Но при этом a содержит всяких ресурсов, которые надо почистить обязательно -- возможно это указатели, может файловые дескрипторы, или всё что угодно ещё.

Ответить | Правка | К родителю #63 | Наверх | Cообщить модератору

90. "Выпуск языка программирования Rust 1.50"  +1 +/
Сообщение от San (??), 12-Фев-21, 17:32 
Ниже описали, почему два раза освобождается second. А GC в С++ нет. Удаление объекта first на совести программиста (перед тем как присвоить "a" новое значение).
Ответить | Правка | Наверх | Cообщить модератору

97. "Выпуск языка программирования Rust 1.50"  +1 +/
Сообщение от Ordu (ok), 12-Фев-21, 17:38 
> Ниже описали, почему два раза освобождается second. А GC в С++ нет.
> Удаление объекта first на совести программиста (перед тем как присвоить "a"
> новое значение).

Мне не надо _удалять_ объекты. Они на стеке лежат, их память будет автоматически освобождена, когда стековый фрем main будет снят со стека. Мне надо вызвать деструктор. Что за C++ знатоки пошли, которые не знают разницы между вызовом деструктора и delete? Ещё учить меня лезут.

Ответить | Правка | Наверх | Cообщить модератору

106. "Выпуск языка программирования Rust 1.50"  +1 +/
Сообщение от Аноним (106), 12-Фев-21, 17:47 
>> Мне надо вызвать деструктор.

Держи:
a.~Test();

Ответить | Правка | Наверх | Cообщить модератору

110. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (42), 12-Фев-21, 17:50 
> Мне надо вызвать деструктор

Он у тебя и вызывается. Ровно столько и там, как ты написал. Все претензии - к себе задавай. В исполнении твоей программы нет никаких ошибок.

Ответить | Правка | К родителю #97 | Наверх | Cообщить модератору

115. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Ordu (ok), 12-Фев-21, 17:57 
>> Мне надо вызвать деструктор
> Он у тебя и вызывается. Ровно столько и там, как ты написал.
> Все претензии - к себе задавай. В исполнении твоей программы нет
> никаких ошибок.

Мне вот интересно, сколько раз это можно повторять?

И возникает второй вопрос: что никто из знатоков C++ не знает ответа на простой вопрос? Или может быть ответ на исходный вопрос "нельзя так сделать", но признаваться в этом почему-то не хочется?

Ответить | Правка | Наверх | Cообщить модератору

145. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (42), 12-Фев-21, 19:24 
> нельзя так сделать

Да, С++ просто так не позволяет писать чушь.

Ответить | Правка | Наверх | Cообщить модератору

149. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (45), 12-Фев-21, 19:34 
Эм, чушь как раз он позволяет писать, количество его undefined для стажёров и джунов сравнимо с языками со слабой типизацией.

Видимо, Вы всё-таки просто хейтр, не читающий ответы оппонента.

Ответить | Правка | Наверх | Cообщить модератору

139. "Выпуск языка программирования Rust 1.50"  +1 +/
Сообщение от yet another anonymous (?), 12-Фев-21, 19:08 
> ... Представь что a -- это член класса. Мне надоело его значение, и я хочу заменить
> его на другое. Но при этом a содержит всяких ресурсов, которые надо почистить
> обязательно -- возможно это указатели, может файловые дескрипторы, или всё что угодно ещё.

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

Неявные ctors/assignments вполне логичны.

Возможно, происхождение столь затейливого недопонимания в том, что подросло поколение, которое считает что Test --- "это я написал", а string --- это часть языка. D или клоунада Александреску этому способствует.

Ответить | Правка | К родителю #74 | Наверх | Cообщить модератору

64. "Выпуск языка программирования Rust 1.50"  +1 +/
Сообщение от Аноним (64), 12-Фев-21, 17:11 
Я конечно могу ошибаться, на плюсах только учился, а не программировал, но при конструкции "Test a = Test(std::string("first"));" происходит copy объекта, а не move, как в расте, потому и освобождает 2 раза. Если явно указать перемещение объекта, то возможно и 1 раз освободит (у меня нет желания проверять, я просто воздух тут сотрясаю).
Ответить | Правка | К родителю #29 | Наверх | Cообщить модератору

76. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (42), 12-Фев-21, 17:21 
Вы что, совсем не знаете, как конструкторы в С++ работают?!
Ответить | Правка | Наверх | Cообщить модератору

84. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (64), 12-Фев-21, 17:27 
Лично я плюсы не осилил. Не вижу в этом ничего плохого.
Выше никто не написал ответа, я предположил (причём обозначил, что не знаток С++), какие могут быть вопросы? Может быть лично Вы дадите развёрнутый ответ?
Ответить | Правка | Наверх | Cообщить модератору

91. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Ordu (ok), 12-Фев-21, 17:34 
> Я конечно могу ошибаться, на плюсах только учился, а не программировал, но
> при конструкции "Test a = Test(std::string("first"));" происходит copy объекта, а не
> move, как в расте, потому и освобождает 2 раза. Если явно
> указать перемещение объекта, то возможно и 1 раз освободит (у меня
> нет желания проверять, я просто воздух тут сотрясаю).

Оно не освобождает ни разу, потому что не выделяет. Ну, то есть выделяет, но на стеке, это не считается. А то, что два деструктора вызывается -- это норм: два значения создаётся, два раза деструктор вызывается. Просто первый вызов деструктора происходит после того, как значение в a переписано новым.

Ответить | Правка | К родителю #64 | Наверх | Cообщить модератору

111. "Выпуск языка программирования Rust 1.50"  –1 +/
Сообщение от Аноним (42), 12-Фев-21, 17:52 
Тебе Школьник подробно разжевал, но ты так и не можешь допереть, что чушь сморозил...
Ответить | Правка | Наверх | Cообщить модератору

118. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Ordu (ok), 12-Фев-21, 17:59 
> Тебе Школьник подробно разжевал, но ты так и не можешь допереть, что
> чушь сморозил...

Он разжевал, что делает эта программа. Но если ты перечитаешь мой коммент с вопросом, ты увидишь, что там есть словесное описание того, что она делает. И хоть оно и менее подробно, нежели у Школьника, оно абсолютно верно. Школьник не сказал ничего полезного для меня, чего бы я не знал.

А вопрос у меня остался: как сделать так, чтобы деструктор бы вызывался _до_того_ как значение было перезаписано.

Ответить | Правка | Наверх | Cообщить модератору

168. "Выпуск языка программирования Rust 1.50"  –1 +/
Сообщение от пердёжник (?), 12-Фев-21, 20:15 
Вы там на c++ всегда так программы из 4 строчек пишите?

Я не c++ разработчик (уже лет 7 наверное на дотнете пишу), и у нас никогда не бывает таких споров

Ответить | Правка | Наверх | Cообщить модератору

175. "Выпуск языка программирования Rust 1.50"  +1 +/
Сообщение от Ordu (ok), 12-Фев-21, 20:49 
> Вы там на c++ всегда так программы из 4 строчек пишите?

Я закинул сюда пример кода, который был упрощён до крайней степени, чтобы продемонстрировать то, о чём я говорю. Если у меня код на 10k строк, я же не буду постить сюда 10k строк, чтобы продемонстрировать свою проблему, да? "В строчке 6730 есть объявление класса Test, а в строчке 8113 не вызывается деструктор" хороший такой вопрос, люди бы с удовольствием выискивали в 10k строках те, которые релевантны вопросу, обдумывали бы прочитанное и отвечали.

> Я не c++ разработчик (уже лет 7 наверное на дотнете пишу), и
> у нас никогда не бывает таких споров

Я честно говоря сам удивлён реакции. Не знаю насколько это свойственно C++. Или может это свойственно русскоязычным обсуждениям. А может это чисто опеннетовская штука. Сложно сказать: про rust я спрашиваю на реддите на английском, там такого не случалось со мной ни разу.

Ответить | Правка | Наверх | Cообщить модератору

205. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Alkog (?), 13-Фев-21, 00:51 
> Я честно говоря сам удивлён реакции. Не знаю насколько это свойственно C++.
> Или может это свойственно русскоязычным обсуждениям. А может это чисто опеннетовская
> штука. Сложно сказать: про rust я спрашиваю на реддите на английском,
> там такого не случалось со мной ни разу.

Для начала Ordu следовало бы извиниться за труднообучаемость его в том чтобы должным образом к Нам обращаться. Затем, если и когда оно будет обучено этому, возможно он сможет задать вопрос о деструкторах...

Ответить | Правка | Наверх | Cообщить модератору

214. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (45), 13-Фев-21, 01:43 
Смею заметить, что именно Вы не написали ни одного конструктивного комментария, упрекнув при этом в труднообучаемости задавшго вопрос и показавшего, что ответные комментарии не содержат по существу ответа, ведь задавший вопрос это знал. При это он признает, что не разбирается в C++.

"Знатоки" же (навроде Вас) лишь не в ту сторону уводят разговор, не отвечая на прямые вопросы. Лишь Аноним (35) вносил конструктив. ЕДИНСТВЕННЫЙ, кто внёс хоть какой-то конструктив со стороны плюсовиков. Остальные либо отвечали на незаданные вопросы, игнорируя заданные (в лучшем случае). Либо вовсе разводили холивар, показав сторонников C++ не с лучшей стороны.

Ответить | Правка | Наверх | Cообщить модератору

122. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Ordu (ok), 12-Фев-21, 18:11 
> Я конечно могу ошибаться, на плюсах только учился, а не программировал, но
> при конструкции "Test a = Test(std::string("first"));" происходит copy объекта, а не
> move, как в расте, потому и освобождает 2 раза. Если явно
> указать перемещение объекта, то возможно и 1 раз освободит (у меня
> нет желания проверять, я просто воздух тут сотрясаю).

А, кстати, реально. Я не задумывался раньше, но в расте оказывается нельзя комбинировать Copy+Drop. Там какие-то технические причины[1], но в принципе даже без них такая комбинация выглядит подозрительно, если подумать. То есть, осталось придумать, как отломать копирующий конструктор, не поломав возможность делать move... В C++0x17 есть move конструктор, я что-то читал про это... Надо будет попробовать, может сработает.

[1] https://github.com/rust-lang/rust/issues/20126

Ответить | Правка | К родителю #64 | Наверх | Cообщить модератору

73. "Выпуск языка программирования Rust 1.50"  +5 +/
Сообщение от Школьник (ok), 12-Фев-21, 17:19 
Там всё правильно, никто там ничего не "забывал", естественно.

Сначала вызывается конструктор объекта Test(std::string("first")), затем из-за применения компилятором техники оптимизации копирования (copy elision) содержимое этого объекта становится объектом a. Без этой техники было бы так: вызывался бы конструктор временного объекта Test(std::string("first")), далее бы вызывался конструктор копирования по умолчанию объекта a, далее бы вызывался деструктор временного объекта Test(std::string("first")).

Что происходит во второй строке? Там вызывается конструктор объекта Test(std::string("second")), и неперегруженный метод присваивания (operator=) заново инициализирует поля объекта a соответствующими полями временного объекта Test(std::string("second")). После этого временный объект Test(std::string("second")) прекращает свое существование, и вызывается его деструктор.

Затем выполнение подходит к концу функции, начинается освобождение всех объектов - локальных переменных, и вызывается уже деструктор объекта a, который содержит в себе строку second, перезаписанную ранее методом присваивания.

Ответить | Правка | К родителю #29 | Наверх | Cообщить модератору

78. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (42), 12-Фев-21, 17:24 
Это слишком сложно для растаманов :) Они сами придумывают байки у себя в голове вместе с тараканами.
Ответить | Правка | Наверх | Cообщить модератору

81. "Выпуск языка программирования Rust 1.50"  –2 +/
Сообщение от Ordu (ok), 12-Фев-21, 17:26 
> Там всё правильно, никто там ничего не "забывал", естественно.

Ну, правильно, и что дальше? Я ведь не задал вопрос "не баг ли это в g++"? Нет, я задал вопрос, как сделать так, чтобы деструктор вызывался бы так, чтобы зачистить существующее значение a, прежде чем затирать его.

> Что происходит во второй строке? ... бла-бла-бла... operator= ...

Ну, и? Перегружать operator=? Как из оператора = вызвать деструктор для self^W this?

> из-за применения компилятором техники оптимизации копирования

Эмм... ну отключать оптимизацию это не вариант. Да и будет странно если при -O0 код будет работать иначе.

Ответить | Правка | К родителю #73 | Наверх | Cообщить модератору

107. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (107), 12-Фев-21, 17:48 
Ты не на тот деструктор тыкаешь.
Запрети все неиспользуемые тобой конструкторы, деструкторы и операторы копирования, а потом принтфами отлаживайся.
Ответить | Правка | Наверх | Cообщить модератору

114. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (42), 12-Фев-21, 17:55 
> вызвать деструктор

Ты что, сейчас будешь по всем спекам С++ тупые вопросы спрашивать? Может, тебе ещё рассказать, как бинарные числа проц складывает?

Ответить | Правка | К родителю #81 | Наверх | Cообщить модератору

119. "Выпуск языка программирования Rust 1.50"  –1 +/
Сообщение от Ordu (ok), 12-Фев-21, 18:01 
>> вызвать деструктор
> Ты что, сейчас будешь по всем спекам С++ тупые вопросы спрашивать?

Возможно. Мне понравилась реакция мнимых знатоков C++, которые не могут ответить на прямо поставленный вопрос. Хочется повторения.

> Может, тебе ещё рассказать, как бинарные числа проц складывает?

Расскажи.

Ответить | Правка | Наверх | Cообщить модератору

124. "Выпуск языка программирования Rust 1.50"  +2 +/
Сообщение от Маняним (?), 12-Фев-21, 18:17 
> Ну, и? Перегружать operator=? Как из оператора = вызвать деструктор для self^W this?

В С++ не надо вызывать деструкторы руками, RAII для этого и придуман. Компилятор сгенерит код, который вызовет деструкторы где и когда нужно в нужном порядке. Если у тебя есть выделение памяти в хипе для дейта-мемберов используй смарт-поинтеры с их конструкторами, деструкторами и присваиваниями, которые тоже будут вызваны автоматически. Твой std::string это и есть пример - его деструктор будет вызван во время вызова деструктора объекта а, но до исполнения кода самого деструктора объекта a. Если ты используешь нетривиальное присваивание, то переопределяй оператор присваивания и руками управляй выделениями и освобождениями памяти для мемберов объекта. Обычно пишут обёртки над такими специфическими объектами с имплементацией конструирования, присваивания и удаления. А потом везде используют без всякого гемора. Такое нужно раз в сто лет. С++ смарт-поинтеры это примеры "владеющих" обёрток над голыми указателями и хандлерами ОС. Такой автоматикой С++ и отличается от всяких говноязыков со всякими defer'ами, ManuallyDrop'ами и прочими закатами солнца вручную. Именно RAII позволяет описать один раз работу с сущностью и везде пользоваться ей единообразно.

Ответить | Правка | К родителю #81 | Наверх | Cообщить модератору

134. "Выпуск языка программирования Rust 1.50"  –1 +/
Сообщение от Ordu (ok), 12-Фев-21, 18:55 
>> Ну, и? Перегружать operator=? Как из оператора = вызвать деструктор для self^W this?
> В С++ не надо вызывать деструкторы руками, RAII для этого и придуман.
> Компилятор сгенерит код, который вызовет деструкторы где и когда нужно в
> нужном порядке. Если у тебя есть выделение памяти в хипе для
> дейта-мемберов используй смарт-поинтеры с их конструкторами, деструкторами и присваиваниями,
> которые тоже будут вызваны автоматически. Твой std::string это и есть пример
> - его деструктор будет вызван во время вызова деструктора объекта а,
> но до исполнения кода самого деструктора объекта a.

Тут ты меня потерял. "Во время вызова деструктора" но "до исполнения деструктора"? В смысле имеется в виду, что деструктор -- это что-то большее, чем мой код деструктора. Это что-то большее может быть побито на куски и эти куски могут быть перетасованы с кодом, где я жонглирую объектами? Или имеется в виду, что есть идеологически правильное место для вызова деструктора, которое в силу copy_elision не используется, ... и хрен его знает.

Или ладно, иначе задам вопрос. То есть в этом примере деструктор для string вызывается, вся память из под обоих string'ов корректно освобождается, и всё ок? То есть, допустим, если у меня в этом Test'е будет лежать грядка uniq_ptr указателей, то их деструкторы будут вызваны, до того, как они будут перезаписаны присваиванием, и вся память будет корректно освобождена, так?

А! Ну тут фишка в том, что по дефолту копирование полей Test выполняется тем же operator=, но в тех реализациях которые на типы полей навешаны. А поскольку на стринг повешена реализация, которая умеет эту ситуацию корректно разруливать, то всё проходит без эксцессов. Ну да, если так, то понятно.

> Если ты используешь
> нетривиальное присваивание, то переопределяй оператор присваивания и руками управляй
> выделениями и освобождениями памяти для мемберов объекта.

Ок.

> Такое нужно раз в сто лет.

Постоянно же. Ты создал File объект, он содержит файловый дескриптор. Ты открыл другой файл, положил новый File в ту же переменную и вот тебе уже это нужно. Или, скажем, я столкнулся с тем, что у меня есть объект, лежащий членом-переменной в другом объекте. Я всегда хочу всегда иметь его инициализированным, но иногда менять на другой инициализированный объект. И эмм... это не очень работает, потому что деинициализация не триггерится вовремя. А когда триггерится, уже поздно пить боржоми. Даже хуже, мне кажется таким образом можно сначала дать утечь памяти, а потом на другой кусок сделать free дважды.

Это очень удобная штука, на самом деле. Я не очень понимаю, как вообще RAII может работать без неё. Подозреваю, что просто надо вспомнить детство, ассемблер, и начать снова думать не о значениях и переменных, а о кусках памяти, которые эти значения занимают, и указателях на эти куски памяти.

> С++ смарт-поинтеры это примеры "владеющих" обёрток над голыми указателями
> и хандлерами ОС.

Да, во. Хороший пример. Я и говорю, что это постоянно нужно. Но смартпоинтеры ж обёртки над указателями, а мне бы то же самое, но над неуказателем. А, ну такую штуку можно написать, наверное, единожды в виде параметризованного типа, и потом заворачивать объекты в этот тип. Можно, наверное, даже взять код uniq_ptr, выкинуть оттуда delete и *, если они там есть, и переименовать в uniq_value.

Ответить | Правка | Наверх | Cообщить модератору

133. "Выпуск языка программирования Rust 1.50"  +4 +/
Сообщение от Школьник (ok), 12-Фев-21, 18:48 
>> Там всё правильно, никто там ничего не "забывал", естественно.
> Ну, правильно, и что дальше? Я ведь не задал вопрос "не баг
> ли это в g++"? Нет, я задал вопрос, как сделать так,
> чтобы деструктор вызывался бы так, чтобы зачистить существующее значение a, прежде
> чем затирать его.

Поля класса, которые сами умеют себя чистить (типа std::string), обычно имеют перегруженный operator=, который при присваивании не позволит, например, утечь внутреннему буферу, где лежат символы, составляющие строку.

Если же у тебя в полях класса обычные указатели (char*), то будь уж добр перегрузить operator= в этом классе, чтобы operator= объемлющего класса правильно отрабатывал.

> Ну, и? Перегружать operator=? Как из оператора = вызвать деструктор для self^W
> this?

Именно - перегружать operator= . Можно сделать какой-нибудь защищенный (protected) метод Finalize, где будут аккуратно чиститься все те поля класса, которые требуют ручной очистки, и дергать его и в перегруженном operator=, и в деструкторе.

Все те комментарии, что тебе написали тут - они не столько со зла, сколько реакция на недоумение  прибывшего в монастырь гостя его уставом. Не всякий корректно ответит на такое. Представь себе, что ты приходишь к жабистам и говоришь: "Посаны, у чего это у вас тут деструкторов нет? А чего finalize перегруженный ни разу не вызвался? Нет, вы ответьте, вы ответьте, как мне добиться того, чтобы finalize дернулся при выходе из области видимости?!"

Ответить | Правка | К родителю #81 | Наверх | Cообщить модератору

137. "Выпуск языка программирования Rust 1.50"  +1 +/
Сообщение от Ordu (ok), 12-Фев-21, 19:06 
>> Ну, и? Перегружать operator=? Как из оператора = вызвать деструктор для self^W
>> this?
> Именно - перегружать operator= . Можно сделать какой-нибудь защищенный (protected) метод
> Finalize, где будут аккуратно чиститься все те поля класса, которые требуют
> ручной очистки, и дергать его и в перегруженном operator=, и в
> деструкторе.

Угу. Понял.

> Все те комментарии, что тебе написали тут - они не столько со
> зла, сколько реакция на недоумение  прибывшего в монастырь гостя его
> уставом. Не всякий корректно ответит на такое. Представь себе, что ты
> приходишь к жабистам и говоришь: "Посаны, у чего это у вас
> тут деструкторов нет? А чего finalize перегруженный ни разу не вызвался?
> Нет, вы ответьте, вы ответьте, как мне добиться того, чтобы finalize
> дернулся при выходе из области видимости?!"

Мне это непонятно. Что-то бумкнуло и C++ фаны рванулись обсуждать личности, будто они по жизни не программисты, а психологи.

В Jave, насколько я её помню, есть простой ответ на поставленный вопрос:

finalize вызовется тогда, когда сборщик мусора будет подбирать память за объектом -- это может произойти через секунду, или через двое суток, зависит от разных факторов, на которые не следует полагаться. Сделать так, чтобы он вызвался при выходе из области видимости объекта невозможно. Если очень надо, вызывай finalize вручную там, где надо.

Ну, то есть, может я не правильно помню жабу, лет двадцать в неё не заглядывал, но это _три_ предложения ответа. На мой вопрос, по-хорошему, примерно столько же. Надо одно предложение на упоминание copy_elision, на случай, если я не понимаю что происходит в моём примере. Одно предложение на то, как надо заходить к решению -- перегружать =. То есть даже в два можно уложиться.

ps. А на форумах C++ сплошные тролли небось? Если на простые вопросы такая реакция, там небось кормиться можно так, что потом не встать будет.

Ответить | Правка | Наверх | Cообщить модератору

146. "Выпуск языка программирования Rust 1.50"  +2 +/
Сообщение от Школьник (ok), 12-Фев-21, 19:25 
> Мне это непонятно. Что-то бумкнуло и C++ фаны рванулись обсуждать личности, будто
> они по жизни не программисты, а психологи.

Это рунет, тут такое сплошь и рядом.

> finalize вызовется тогда, когда сборщик мусора будет подбирать память за объектом --
> это может произойти через секунду, или через двое суток, зависит от
> разных факторов, на которые не следует полагаться. Сделать так, чтобы он
> вызвался при выходе из области видимости объекта невозможно. Если очень надо,
> вызывай finalize вручную там, где надо.

Не, мой вопрос был в том, как сделать полный аналог деструкторов C++, но в жабе. Ответ тут один - никак. Требовать такое в жабе - значит, не понимать, куда пришёл.

Скорее всего, тебя именно за такого и приняли здесь все (включая, увы, и меня).

> Надо одно предложение на упоминание copy_elision, на
> случай, если я не понимаю что происходит в моём примере. Одно
> предложение на то, как надо заходить к решению -- перегружать =.
> То есть даже в два можно уложиться.

Да, всё именно так, можно было просто упомянуть copy elision и перегрузку operator=.

> ps. А на форумах C++ сплошные тролли небось? Если на простые вопросы
> такая реакция, там небось кормиться можно так, что потом не встать
> будет.

В рунете даже на анонимных имиджбордах можно кормиться, не напрягаясь.

Ответить | Правка | Наверх | Cообщить модератору

77. "Выпуск языка программирования Rust 1.50"  +1 +/
Сообщение от Кир (?), 12-Фев-21, 17:23 
Ссылочная модель головного мозга детектед.

int a = 10;
a = 20;

Чему равна переменная a после присваивания?

Ответить | Правка | К родителю #29 | Наверх | Cообщить модератору

83. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Ordu (ok), 12-Фев-21, 17:27 
> Ссылочная модель головного мозга детектед.
> int a = 10;
> a = 20;
> Чему равна переменная a после присваивания?

3.14?

Скажите, это вы все тролли поголовно, или это у C++ программистов коллективное психическое отклонение, не позволяющее им отвечать на чётко и ясно поставленные вопросы?

Ответить | Правка | Наверх | Cообщить модератору

88. "Выпуск языка программирования Rust 1.50"  +2 +/
Сообщение от Кир (?), 12-Фев-21, 17:31 
Чётче вроде некуда, если не понимаешь, учи матчасть, я тут бессилен.
Ответить | Правка | Наверх | Cообщить модератору

99. "Выпуск языка программирования Rust 1.50"  –2 +/
Сообщение от Аноним (45), 12-Фев-21, 17:40 
Кир, ответ, на заданный Вами вопрос 20.

Теперь ответьте, пожалуйста, на изначально заданный вопрос.
Ведь Вы не тролль, значит можете ответить.

Хотя лично я считаю, что приведённый Вами пример совершенно не показывает разницы между ссылочными и значимыми типами разных ЯП, везде результат будет одинаковый, так что неудивительно, что Ordu посчитал Вас троллем, ведь Вы бесполезно натоксили вместо чёткого ответа либо хотя бы корректного примера "неграмотности" задавшего вопрос.

Ответить | Правка | Наверх | Cообщить модератору

129. "Выпуск языка программирования Rust 1.50"  +2 +/
Сообщение от Кир (?), 12-Фев-21, 18:28 
Вопрошающий имел в виду что-то вроде такого:

int main() {
auto  a = make_shared<Test>("first");
a = make_shared<Test>("second");
return 0;
}

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

Ответить | Правка | Наверх | Cообщить модератору

131. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Кир (?), 12-Фев-21, 18:37 
> Хотя лично я считаю, что приведённый Вами пример совершенно не показывает разницы между ссылочными и значимыми типами разных ЯП, везде результат будет одинаковый

Вы ошибаетесь. В шарпе, скажем, копировались бы именно ссылки на объекты класса (если Test не struct) и он работал бы именно так, как мой пример с shared_ptr на C++. Другое дело, что деструктор там вызвался бы в совершенно неопределенный момент времени.

Ответить | Правка | К родителю #99 | Наверх | Cообщить модератору

135. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (45), 12-Фев-21, 19:05 
Именно приведённый Вами пример (я выделил это) разницы не показывает:
int a = 10;
a = 20;

В любом более менее популярном языке a будет содержать 20.

Вы же придираетесь к словам, к заданному вопросу. Вместо того, чтобы хоть намёк на ответ дать.
Так что в приведённом ВАМИ ЖЕ примере я не ошибаюсь. И ни о каких указателях, ссылках, классах/структурах или хотя бы куче/стеке речи не идёт. И нет объяснения при чём тут "ссылочная модель головного мозга", что вообще-то невежливо с Вашей стороны. Тем более с учётом приведённого примера.

Ответить | Правка | Наверх | Cообщить модератору

159. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Кир (?), 12-Фев-21, 19:45 
А, вы про этот пример, пардон. В нём вроде достаточно толстый намек на копирование по значению, разве нет? В паре с обсуждаемым выше кодом есть о чем задуматься. Или я должен был изложить стандарт C++ в полном объёме?
Ответить | Правка | Наверх | Cообщить модератору

242. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (45), 13-Фев-21, 11:55 
> В нём вроде достаточно толстый намек на копирование по значению, разве нет?

Если бы Вы сначала прочитали его вопрос и дальнейшие комментарии, а потом решилиответить, то поняли бы, что человек прекрасно осведомлён в разнице ссылочных и значимых типов.

Вмето этого Вы, захотев "технично унизить" человека, лишь показали свою грубость.

> Или я должен был изложить стандарт C++ в полном объёме?

Нет, я Вам уже третий раз даю подсказку, что следовало сделать - прочитать сам вопрос и только после этого формулировать ответ.

Ответить | Правка | Наверх | Cообщить модератору

89. "Выпуск языка программирования Rust 1.50"  +1 +/
Сообщение от Аноним (42), 12-Фев-21, 17:31 
Да ты, оказывается, даже не знаешь понятий "значение" и "ссылка"...
Ответить | Правка | К родителю #83 | Наверх | Cообщить модератору

143. "Выпуск языка программирования Rust 1.50"  –1 +/
Сообщение от Аноним (45), 12-Фев-21, 19:16 
Вы вообще ветку читали? Или на любое его сообщение будете бессмысленно токсить?

Задан конкретный вопрос. Человек сказал, что делает приведённый код. Вопрос про то, как получить то, о чём он спросил. А не что делает его код.

Вас подобному поведению шутки про Stackoverflow научили?

Ответить | Правка | Наверх | Cообщить модератору

152. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (42), 12-Фев-21, 19:37 
> Человек сказал, что делает приведённый код.

И? Всё правильно код делает, как чел написал - так и делает. В чём вопрос? Почему чел так написал?

Ответить | Правка | Наверх | Cообщить модератору

160. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (45), 12-Фев-21, 19:46 
Перечитайте ветку, если не понимаете.

Могу немного помочь: человек, задавший вопрос, сам написал, что код делает. И он задал ряд вопросов, на которые попыталось ответить только два комментатора, остальные решили утопить у слюне неодобрения.

Конкретно к Вам вопрос - с какой целью Вы так толсто троллите задавшего вопрос?

Ответить | Правка | Наверх | Cообщить модератору

170. "Выпуск языка программирования Rust 1.50"  +2 +/
Сообщение от Аноним (170), 12-Фев-21, 20:19 
Ты такой тупой, просто жесть. Тебе же четко объяснили, что ты изменил содержимое объекта пред его уничтожением. Деструкторы обоих объектов вызываются. Просто у них содержимое одинаковое после твоего присваивания
Ответить | Правка | К родителю #83 | Наверх | Cообщить модератору

180. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Ordu (ok), 12-Фев-21, 21:32 
> Ты такой тупой, просто жесть. Тебе же четко объяснили, что ты изменил
> содержимое объекта пред его уничтожением. Деструкторы обоих объектов вызываются. Просто
> у них содержимое одинаковое после твоего присваивания

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

Ответить | Правка | Наверх | Cообщить модератору

183. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Кир (?), 12-Фев-21, 21:48 
> Ты так забавно поступаешь -- чуть ли не слово-в-слово скопировал из моего первого коммента объяснение, и заявляешь, что я не понимаю этого объяснения.

Если ты продолжаешь считать, что это:

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

правильное описание того, что происходит, у меня для тебя плохие новости. Может это хоть как-то поможет:


class Field {
public:
    Field &operator = (const Field &) {
        std::cout << "Assigning to field" << std::endl;
        return *this;
    }
};

class Test {
public:
Test(std::string name) {
std::cout << "Constructor called with name: " << name << std::endl;
this->name = name;
}
~Test() {
std::cout << "Destructor called for " << this->name << std::endl;
}
private:
std::string name;
Field field;
};

int main() {
auto  a = Test("first");
a = Test("second");
return 0;
}


Ответить | Правка | Наверх | Cообщить модератору

194. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Ordu (ok), 12-Фев-21, 23:24 
> Может это хоть как-то поможет:

Ты тоже почитал ответы Школьника и Манянима?

Нет, не поможет. Тут проскакивали ссылки на copy_elision, сходи и почитай, там описывается откуда берётся это поведение, при котором деструктор вызывается не на значение, а на область памяти содержащее это значение.

Я так подумал, о том что происходит в голове у того анонима выше, и почему ему до сих пор кажется, что я чего-то не понимаю, и у меня возникло предположение. И думаю, что у тебя происходит то же самое, что и у него. Вы не различаете достаточно точно переменную и её значение. Или кусок памяти, и значение хранящееся в нём. Ты знаешь разницу между указателем и адресом? Вот здесь примерно то же самое. Когда выполняется присваивание, одно из значений (которое в данном случае является инстансом класса, или объектом) исчезает. Оно превращается в тепловую энтропию. Это как здесь:

int a = 2;
a = 7;

После a = 7 значение 2 исчезло и превратилось в термодинамическую энтропию, процессор стал чуть теплее. Так и в том примере моём присваивание уничтожило старый объект (старое значение переменной). Память, которая содержала тот объект осталась, и в ней теперь хранится новый объект, а старый прекратил существование. Но деструктор старого объекта будет вызван тогда, когда лайфтайм куска памяти/переменной закончится.

То есть, дефолтный operator= реализован с нарушением семантики C в пользу каких-то там оптимизаций. Это называется Copy Elision. Ссылки ты можешь найти в этом обсуждении. Нарушения этой семантики не проявляют себя, если дефолтного деструктора достаточно. Если же деструктор кастомный, то чтобы получить семантику C, которая проводит чёткую границу между значением и памятью, надо реализовывать ещё и свой operator=.

Ответить | Правка | Наверх | Cообщить модератору

201. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Кир (?), 13-Фев-21, 00:28 
Дядя Петя, ты ... ?

Твой код фактически эквивалентен вот такому:


class Test {
public:
    Test(std::string name) {
        std::cout << "Constructor called with name: " << name << std::endl;
        this->name = name;
    }
    ~Test() {
        std::cout << "Destructor called for " << this->name << std::endl;
    }
    std::string name;
};

int main() {
    Test a = Test(std::string("first"));
    {
        Test b{"second"};
        a.name = b.name;
    }
    return 0;
}

Здесь b -- аналог временного объекта, который у тебя создается в выражении присваивания. И в этом коде, и в твоем создаются 2 объекта, и уничтожаются два объекта. Между этими событиями происходит изменение поля a.name, что ты и видишь при вызове деструктора для a. Как именно происходит копирование строки -- не твоя забота, это реализовано в std::string. Изменение поля name никоим образом не должно приводить к вызову деструктора класса Test. Никаким Copy Elision тут и не пахнет. Если до тебя и сейчас не дошло, я умываю руки.

Ответить | Правка | Наверх | Cообщить модератору

204. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Кир (?), 13-Фев-21, 00:48 
Подумалось, может тебя смущает это:


Test a = Test(std::string("first"));

Это НЕ оператор присваивания и НЕ вызов копирующего конструктора -- это инициализация, т.е. полностью эквивалентно вот такому:


Test a(std::string("first"));

Ответить | Правка | Наверх | Cообщить модератору

221. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Ordu (ok), 13-Фев-21, 06:15 
Нет, меня не смущает это.
Ответить | Правка | Наверх | Cообщить модератору

222. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Ordu (ok), 13-Фев-21, 06:19 
Чукча не читатель, да? Чукча писатель? Ты с кем сейчас и о чём разговаривашь, мальчик? Ты читал комментарий, на который отвечаешь? Какое отношение написанное тобою имеет к моему комментарию, на который ты отвечаешь?
Ответить | Правка | К родителю #201 | Наверх | Cообщить модератору

244. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (45), 13-Фев-21, 11:58 
> Чукча не читатель, да? Чукча писатель?

К сожалению, Вы пишете на русском языке, показывая код C++, а надо было полностью на C++ писать, может тогда бы эти комментаторы поняли и попытались подумать. Потому что воспринимать информацию на русском языке у них не получается.

Ответить | Правка | Наверх | Cообщить модератору

254. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Кир (?), 13-Фев-21, 14:30 
Ясно, понятно, не помогло. Бывает. Продолжай бредить.
Ответить | Правка | Наверх | Cообщить модератору

207. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Alkog (?), 13-Фев-21, 01:05 
> То есть, дефолтный operator= реализован с нарушением семантики C в пользу каких-то
> там оптимизаций. Это называется Copy Elision.

Опять пошли абсурдные утверждения про C...

Ответить | Правка | К родителю #194 | Наверх | Cообщить модератору

8. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (64), 12-Фев-21, 16:11 
Людей вообще не стоит переубеждать, им кто-то донёс мысль, что С/С++ самые лучшие языки, они так и думают. А кого спроси на чём проекты пилят, то в большинстве случаев вообще на Go, потому что удобно, быстро и не надо бороду в пол отращивать.
Ответить | Правка | К родителю #6 | Наверх | Cообщить модератору

14. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от анон (?), 12-Фев-21, 16:21 
Это норм, если не надо работать с ассемблером, а с ассемблером не работает тот, кто пишет либо скрипты, либо велосипед.
Ответить | Правка | Наверх | Cообщить модератору

22. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (22), 12-Фев-21, 16:31 
Ну это уже другое дело и не кросс-платформенное.
Ответить | Правка | Наверх | Cообщить модератору

26. "Выпуск языка программирования Rust 1.50"  +/
Сообщение от Аноним (22), 12-Фев-21, 16:33 
Хотя в Го можно получить листинг на асм и подпилить.
Ответить | Правка | Наверх | Cообщить модератору

39. "Выпуск языка программирования Rust 1.50"  –3 +/
Сообщение от Аноним (45), 12-Фев-21, 16:45 
А в каком зрелом компилируемом языке нет инструментов для получения листинга на АСМ? Как будто Го какой-то уникальный в этом плане.
Ответить | Правка | Наверх | Cообщить модератору

40. "Выпуск языка программирования Rust 1.50"  –2 +/
Сообщение от Аноним (45), 12-Фев-21, 16:46 
Да, они просто отращивают бороду. Не в пол, а чтобы была.
Ответить | Правка | К родителю #8 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру