LINUX.ORG.RU

Запилите кто-нибудь нормальный обзор Rust

 , ,


6

9

Коллеги, а не мог бы кто-нибудь из вас запилить нормальное сравнение Rust с плюсами? В последнее время rust то и дело упоминают как будущего убийцу с++, вот мне и стало интересно. Но изучать новый язык у меня сейчас времени нет, а все обзоры и сравнения (вот последнее на хабре: http://habrahabr.ru/post/225507/) сводятся к следующему:

Возьмем пример стандартного кода на с++

$ cat test.cpp
int main()
{
    *((int*)nullptr) = 0xdeadbeef;
}
Давайте его запустим, и посмотрим, что получится:
$ g++ -std=c++0x -o testcpp test.cpp && ./testcpp
Segmentation fault
Как видите, с++ позволяет выстрелить себе в ногу!
А теперь давайте посмотрим, что будет, если этот же код попытаться скомпилировать rust:
rust -o testrust test.cpp
test.cpp:1:1: 1:4 error: expected item but found `int`
test.cpp:1 int main()
           ^~~
Смотрите, компилятор rust не скомпилировал этот код и сохранил нам ногу! ergo, rust - убийца с++.

Очевидно, что сравнивая ошибки в синтетических двухстрочниках, ничего показать нельзя. Хотелось бы увидеть какую-нибудь задачу на примере из нескольких десятков строк, хорошо решенную на с++ (то есть без саботажа и попыток продемонстрировать убогость плюсов), краткий обзор проблем в коде, которые в с++ не решаются, потом реализация той же задачи на rust, в которой эти проблемы решены, а новых не добавилось.

Если где-то есть уже что-то подобное в сети, киньте ссылку.

UPD: нашел очень качественное сравнение с++ и go (http://kidoman.io/programming/go-getter.html).
tl;dr: товарищ сравнивал производительность, в качестве демонстрационной программы использовал трассировщик лучей. В первой серии go победил после множества оптимизацй, во второй серии с++ после таких же оптимизаций одолел go на одном ядре, в третьей серии в с++ впилили многопоточность, и он разорвал go пополам.
Стоит обратить внимание, что рейтрейсер на c++ в этом примере написан без единого new/delete.
Буду очень признателен, если кто-то напишет подобное сравнение с++ с rust, а еще лучше - если портирует трассировщик из примера выше на rust о объяснит, почему он лучше (там уже на несколько других языков портировали).



Последнее исправление: ymn (всего исправлений: 3)

Хорошая игра!

Наиграл в неё 8 часов в стиме, за голожопиков играть интересно. Разработчики сейчас кляпают новое обновление, хорошее комьюнити.

Звуки в игре - 8/10 Графика в игре - 8/10 Геймплей - 9/10 Сюжета нет.

PavelRyzhov ★★
()
Ответ на: комментарий от anonymous

Где ты столкнулся с «потекло»?

Приведены названия инструментов, ловящих ошибки вида «утечка» и «выход за границу массива», и написаны эти инструменты не просто так и не для идиотов. Но да, их названия знают только обезьяны, а риальне поцанам это не нужно.

Где твои не ошмётки? Где твой код? Где твоя нужность? Ещё раз спрошу.

Мои? Я-то обычный инженер, и любой, кто работает «в поле», понимает это. А ты типа звезда, которая осилила Си круче всех нас, вместе взятых, и может обоссать весь мир. Где _твои_ проекты?

tailgunner ★★★★★
()

Смешно получилось, молодец. Продолжай в этом духе.

fenris ★★★★★
()
Ответ на: комментарий от tailgunner

Забавно, поймал себя на желании откомменить:

гопников вроде спкх

что, мол, сокращение - дабы не употребить имя царя всуе, чтобы (в свою очередь) не скастануть его. А тут и виновник торжества нарисовался).

anonymous
()
Ответ на: комментарий от anonymous

Ну и друга ты себе нашёл.

Ну и представление о дружбе у тебя.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от anonymous

Ты объясни для начала, как все heartbleed еблами прощелкали.

anonymous
()
Ответ на: комментарий от tailgunner

Приведены названия инструментов, ловящих ошибки вида «утечка» и «выход за границу массива», и написаны эти инструменты не просто так и не для идиотов. Но да, их названия знают только обезьяны, а риальне поцанам это не нужно.

Да, их придумали для обезьян. Ты мне ещё расскажи про переполнение буфера.

Естественно досовская обезьяна пишет:

char monkey_style_buffer[256];
В чуть более лучшем случае:
char * monkey_style_buffer = malloc(256);

В любом случае жопа в обоих случаях.

Пацан же, зная как работает память в норм ОС - пишет так:

static inline void * mmalloc(uint64_t size, uint64_t flags) {
  return mmap(NULL, size, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | flags, 0, 0);
}
enum {KB = 1024, MB = KB * 1024, GB = MB * 1024};

void * unique_infinity_buffer(void) {
  static void * ptr = 0;
  return (ptr) ?: (ptr = mmalloc(32ul*GB, 0));
}

void unique_infinity_buffer_fullreset(void) {
  madvise(unique_infinity_buffer(), 32ul*GB, MADV_DONTNEED);
}

void unique_infinity_buffer_reset(uint64_t len) {
  madvise(unique_infinity_buffer(), len, MADV_DONTNEED);
}
//prefault и прочее делается так же через madvise().

Юзается общий уникальный буфер, который либо выделяется первым и его переполнить никак не получится - будет сегфолт, либо ставится PROT_NONE на крайнюю страницу и тоже будет сегфолт.

Далее, этот буфер может быть «бесконечный», если у тебя «64битный» vmsize. Который переполнить вообще не получится.

Конечно же, обезьяне этого не известно.

Конечно же, обезьяна не юзает вместо «массивов» в куче:

static inline void * alloc(uint64_t size, uint64_t flags) {
  return mmap(NULL, size, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | flags, 0, 0);
}

typedef struct {
  void * ptr; uint64_t size;
} buf_t;

static inline buf_t buf_create(void * ptr, uint64_t len) {
  return (buf_t){ptr, len};
}

static inline buf_t buf_alloc(uint64_t size, uint64_t flags) {
  return (buf_t){alloc(size, flags), size};
}

static inline int32_t buf_dealloc(buf_t buf) {
  return munmap(buf.ptr, buf.size);
}

static inline void * buf_begin(buf_t buf) {
  return buf.ptr;
}

static inline void * buf_end(buf_t buf) {
  return buf.ptr + buf.size;
}

static inline uint64_t buf_size(buf_t buf) {
  return buf.size;
}

Об этом я уже 10раз говорил. Выйти запределы такого буфера нереально.

Обходить его таким макросом:

#define buf_foreach(type, iter, buf) for(type * __iterator = buf_begin(buf), * __iterator_end = buf_end(buf), iter = *__iterator;__iterator < __iterator_end; ++__iterator, iter = *__iterator)

buf_foreach(int, i, buf) {i;}//и никакого переполнения.

Такие же макросы пишутся для массивов вне кучи, для которых работает sizeof().

Как я уже писал, обезьяна не знает, что такое «конструкторы»:

char * buf = (char[256]){};
type_t t = (type_t){a, b, c, d};
t.a = a; t.b =b;//обезьяна будет писать так, а потом ныть, что она где-то ошиблась в копипасте.
char mas[strlen(str)];//и прочие фичи выше c89.

Это избавлят от 90% случаев, в которых обезьяна делает утечку памяти, бездумно дёргая маллок.

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

Я уже приводил тысячи примеров, допустим обезьяне надо открывать при каждом вызове функции файл и читать его, а потом закрывать.

Делается это просто:

int oneuse_open(char * file, int flags) {
  static int fd[16];
  static uint8_t i = 0;
  i &= 0xf;
  if(fd[i]) close(fd[i]);
  fd[i] = open(file, flags);
  return fd[i++];
}

int oneuse_open_ro(char * file) {
  return true_open(file, O_RDONLY);
}
//вызывается oneuse_open_ro("") и ниочем не думается, а бомжи будут писать всякую муть с ООП и прочим говном. Причем моя байда абсалютно надёжна.

anonymous
()
Ответ на: комментарий от tailgunner

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

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

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

Это делается через обратный стек антивызовов:

typedef struct {
  void * ptr;
} unmalloc_calldump_t;


typedef struct {
  unmalloc_calldump_t * data, * sp, * top;
} unmalloc_calldump_stack_t;

unmalloc_calldump_stack_t unmalloc;

__attribute__((constructor)) void unmalloc_init(void) {
  buf_t buf = buf_alloc(4096, MAP_POPULATE);
  unmalloc = (unmalloc_calldump_stack_t){buf_begin(buf), buf_end(buf) - sizeof(unmalloc_calldump_t), buf_end(buf) - sizeof(unmalloc_calldump_t)};
}

void push(void * ptr) {
  *unmalloc.sp-- = (unmalloc_calldump_t){ptr};//!TODO
}

void * pop(void) {
  void * ret = unmalloc.sp->ptr; ++unmalloc.sp;//!TODO
  return ret;
}

void * _malloc(size_t size) {
  void * ptr = malloc(size);//!TODO
  push(ptr);
  return ptr;
}

void _free_callstack(void) {
  void * ptr;
  while(free(pop()), unmalloc.sp != unmalloc.top);
}

int main(void) {
  _malloc(10);
  _malloc(10);
  _malloc(10);
  _free_callstack();
}

Т.е. допусти, тебе надо создать какой-то констекст - ты просто юзаешь _malloc(), а когда надо сбросить контекст _free_callstack().

И у тебя всё в ажуре.

Штука в том, что обезьяна пытается всё свести к примитивной однообразной недоконцепции. По этой причине обезьяна никогда не напишет вменяемый код. Скилл же даёт тебе понимание задачи и ты пишешь так, как нужно исходя из задачи.

anonymous
()
Ответ на: комментарий от tailgunner

Не я себя так называл, зачем ты врёшь? Вот почему вместо того, чтобы послушать меня - ты начинаешь нести херню?

Твои оправдания, аля «я же не программист», а если ты не программист, то какого хрена ты делаешь в этом разделе и споришь со мною? Ты реально не понимаешь, что это детсад.

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

Ты тоже не понимаешь, что это детсад? Вместо с того, чтобы дружить со мною, ты ведёшь себя как ляля. Зачем?

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

anonymous
()
Ответ на: комментарий от AoD314

Ты реально не понял, что пацан про это сравнение и говорит? Сравнение такая же бездарная мура, как пример ТС"а. Это не сравнение, а говно для обезьян.

anonymous
()
Ответ на: комментарий от tailgunner

Приведены названия инструментов, ловящих ошибки вида «утечка» и «выход за границу массива», и написаны эти инструменты не просто так и не для идиотов. Но да, их названия знают только обезьяны, а риальне поцанам это не нужно.

Ах да, это инструменты созданы в основном для копания в говне. Ты ещё скажи, что отладчик для чего-то, акромя реверсинжа нужен, ну и для слежения за хардваром(т.е. стейтами процессора и иже с ним).

Мои? Я-то обычный инженер, и любой, кто работает «в поле», понимает это.

Т.е. ты даже хелворд не писал, а очень любишь балаболить о коде, которого ты не писал? Куллстори.

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

Там было слово «понимает», а не осилил, но зачем тебе быть внимательным. Я допускаю, что какой-то пацан авось что-то знает, чего я не знаю, но не более.

Понимаю сишку, её концепцию и как на ней можно и нужно писать я лучше вас всех вместевзятых с шансом 98% в 95% случаев.

Где _твои_ проекты?

Ну какбэ это не я кукарекаю про проекты, а ты. Чтож ты пытаешься съехать? Со мною это не работает.

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

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

Т.е. я не только знаю/понимаю сишку, но и запильные задачи. Поэтому я могу с вероятность близкой к сотке сказать какая фича полезна и насколько. И мои знания не основаны на мифах и легендах, а на скилле, понимании и запиле.

Зачем ты загоняешь своё мышление в рамки анскилла и досовских говнарей, в с89, ненужную маздайку? Тыж мне там кукарекал, что симды не нужны?

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

anonymous
()
Ответ на: комментарий от anonymous

static inline void * alloc(uint64_t size, uint64_t flags) {

return mmap(NULL, size, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS | flags, 0, 0);

}

typedef struct {

void * ptr; uint64_t size;

} buf_t;

О вау, наша суперзвезда предлагает использовать mmap в роли malloc. Я, конечно, предполагал, что ты даже ПТУ не закончил, но теперь я знаю, что тебя туда даже не взяли. По причине умственной отсталости, наверное.

Что, ты просто предлагал использовать страничную защиту? А, ну поздравляю, ты заново изобрел libElectricFence, которой лет больше, чем тебе. И просто для протокола - большинство объектов в программе имеют размер, гораздо меньший, чем страница.

Ах да, inline на функции, делающей системный вызов - это так трогательно.

static inline void * buf_begin(buf_t buf) {

...но, с другой стороны, inline при (нафиг не нужной) передаче объекта по значению тоже умиляет.

Твой unmalloc нафиг не нужен при живом alloca, ну и apr_pool_t тоже не будем забывать (хотя ты не можешь про него забыть - ты о нем тупо не знаешь). Про твой позорный oneuse писать просто лень.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Скажи, а ты вообще по-русски разговаривать умеешь?

anonymous
()
Ответ на: комментарий от tailgunner

О вау, наша суперзвезда предлагает использовать mmap в роли malloc. Я, конечно, предполагал, что ты даже ПТУ не закончил, но теперь я знаю, что тебя туда даже не взяли. По причине умственной отсталости, наверное.

А ты мне наверное мне скажешь почему я не могу его юзать? Или обосрёшься?

Что, ты просто предлагал использовать страничную защиту? А, ну поздравляю, ты заново изобрел libElectricFence, которой лет больше, чем тебе. И просто для протокола - большинство объектов в программе имеют размер, гораздо меньший, чем страница.

Причем тут страничная защита

Что конкретно я изобрёл? В чем заключается сходство? У меня объекты не пишутся в конец страницы, тут ты обосрался. Да и это не про объекты, а про буфера, питушок.

Суть в том, что когда твои кривые лапки напишут какое-то говно и что-то переполнится, у меня будет сегфолт, а у тебя доступ ко стеку. И объекты тут непричем, но я рад, что ты осилил погуглить, правда нето.

А ты знаешь, что буфер - это основад ля пулла/стека. Хотя обезьянка может только курлыкать.

Ах да, inline на функции, делающей системный вызов - это так трогательно.

Ах, ничтожество не знает что такое сисколл. Для обезьянки поясню - это не функция, которая делает системный вызов, а glibc обрётвка, внутри которой делается сисколл, да и что вообще ты этим хотел сказать? Обосраться?

...но, с другой стороны, inline при (нафиг не нужной) передаче объекта по значению тоже умиляет.

По значению, да я вижу ты прошаренная. Какая тут передача какого объекта? Для обезьянки поясню - это разварачивается в buf.begin;

Что ты мне конкретно хотел сказать? Обосраться?

Твой unmalloc нафиг не нужен при живом alloca

Ты реально даун? alloca() для глобального контекста? Хотя да, яж забыл, обезьяна не знает что такое конструкторы, поэтому юзает аллоку.

Все же надо обезьянки показать:

char * buf = (char[256]){};//это аллока.

Что ты этих хотел сказать? О5 обосрался.

apr_pool_t

Зачем мне юзать эту ссань, да и при этом тащить другую ссань? Яж не обезьянка типа тебя - я обоссу и тебя, и твой apr_pool_t в говно.

Про твой позорный oneuse писать просто лень.

Ответить нечего, ты даже ен понял зачем это и почему.

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

anonymous
()
Ответ на: комментарий от anonymous

Ну вы ж друг друга в жопы прете, значит друзья.

anonymous
()
Ответ на: комментарий от tailgunner

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

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

Хочешь быть ничтожеством - будь. Как был, как есть, так и сдохнешь говном. Это твой выбор. Настолько надо быть слепым и тупым, чтобы этого не понимать.

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

На что ты надеешься? Что на лоре 99% твоих братьев по разуму? И в их глазах неся херню ты оправдаешься? Мне жаль тебя. Подумай всёже, авось что-то в тебе проснётся.

anonymous
()
Ответ на: комментарий от anonymous
char * buf = (char[256]){};//это аллока.

Не требуй от обезьянки слишком много, да и всё «она» портабельная^

anonymous
()
Ответ на: комментарий от anonymous

обоссу и тебя, и твой apr_pool_t в говно.

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

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

С твоими скиллами написания кода вопрос закрыт

Эка как ты бойка обосравшись закрыл вопрос. Ты же мне объснишь почему он закрыт? Или как и раньше обосрёшься?

Слушай, да начинай уже ссать.

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

Ждем волну мочи высотой хотя бы до третьего этажа.

Зачем? Тебе и полэтажа хватит.

anonymous
()
Ответ на: комментарий от anonymous

Ждем волну мочи высотой хотя бы до третьего этажа.

Зачем? Тебе и полэтажа хватит.

Более чем хватит - не утону, так умру от брезгливости. Давай, царь, ссы.

tailgunner ★★★★★
()

С вами Павел Лобков, и мы продолжаем нашу бессменную передачу из девелопмента «Диалоги с Царём».

anonymous
()
Ответ на: комментарий от anonymous

Вообще-то до говнокода Царь был года 2-3-4-5 на лоре, а на говнокод ушел когда его забанили годик-другой назад.

Какаим надо быть дауном, чтобы нести такую херню, если рега на лоре старше говнокодовской.

anonymous
()
Ответ на: комментарий от tailgunner

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

anonymous
()
Ответ на: комментарий от anonymous

Ну иди сравни время реги sphk на лоре и на говнокоде. sphk я придумал тут, после очередного забана на лоре, после чего я много времени писал тут, после чего я поставил поняшку на аву, и только через месяц+ меня забанили по ипаку и я ушел на говнокод.

Да, да, я и есть Царь.

anonymous
()
Ответ на: комментарий от anonymous

Царь прав (бывает и такое)

Его мнение очень важно для меня. Так же, как и твое.

ты абсолютно некомпетентный и тупой упорыш.

Ты еще один гений, который пользуется mmap вместо malloc и путает alloca с автоматическими массивами?

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Его мнение очень важно для меня. Так же, как и твое.

Поэтому ты ничтожество. Если бы ты умел думать/понимать, и вести себя чуть более вменяемей, то ты бы небыл таким некомпетентным ничтожеством.

Вам чтоли нравится в говно всегда нырять? Почему тебе не хочется разобраться перед тем, как кукарекать? Хотябы попытайся понять что я тебе пытаюсь объяснить. Либо хотябы попытайся что-ли сформулировать минимальную аргументацию твоей правоты, если ты считаешь себя правым.

Твоя аргументация состоит из, - «ко-ко-ко сложный код, ко-ко-ко ты его не писал, ко-ко-ко я он нём кукарекаю, но я тоже его никогда не писал, ибо я !программист». Рили?

который пользуется mmap вместо malloc

Ты же мне скажешь где я использую mmap() вместо malloc(), и почему этого делать нельзя?

путает alloca с автоматическими массивами?

Ты же мне скажешь чем отличается alloca() от «автоматического массива», да и вообще, с какого хрена ты начал курлыкать про аллоку? К чему ты вообще её приплёл?

anonymous
()
Ответ на: комментарий от tailgunner

А, и после того, как они заменили ~ на Box<>, шансов у языка почти нет.

Серьёзно что ли? А столько восторженных отзывов - мол «избавляются от закорючек» и т.д. А в чём проблема? Сильно больше писать? Может мне после С++ с его всякими ..._ptr-ами не особо страшно кажется...

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Серьёзно что ли?

Отчасти.

А столько восторженных отзывов - мол «избавляются от закорючек» и т.д.

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

А в чём проблема?

В обосновании. Каким-то клоунам не понравилось, что ~ отсутствует на каких-то европейских клавах, и для ее набора придется нажимать 2-3 клавиши. Ну да, зато теперь мы все будем нажимать 6. И, @#$%, ключевое слово box.

Может мне после С++ с его всякими ..._ptr-ами не особо страшно кажется...

После Си++ много чего не страшно %)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

В обосновании. Каким-то клоунам не понравилось, что ~ отсутствует на каких-то европейских клавах

Мля, серьезно чтоль? я что-то упустил сей момент в развитии языка. Европейские программеры не умеют в деструкторы в С++?

anonymous
()
Ответ на: комментарий от anonymous

Скажи, тебя зависть сильно разъедает? За то, что ты на лоре далеко не в первых рядах по тупости и упоротости, и того же tailgunner-а тебе никогда не догнать.

anonymous
()
Ответ на: комментарий от anonymous

Европейские программеры не умеют в деструкторы в С++?

~ в Rust была значком owned pointer, а не деструктора. Аналог деструкторов остался.

tailgunner ★★★★★
()
Ответ на: комментарий от anonymous

Европейские программеры не умеют в деструкторы в С++?

А так же деструкторы C#, D. И заодно «битовое нет» в просто огромной куче языков. Так что аргумент вообще дурацки смотрится. Я бы ещё как-то понял, если бы они так за «читабельность» боролись...

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Я бы ещё как-то понял, если бы они так за «читабельность» боролись...

Этот аргумент тоже был - якобы Rust слишком «sigil-heavy». Правда, я не вижу, чем Box<SomeType> читабельнее, чем ~SomeType. Особенно, если учесть, что Box<> - это на самом деле BoxPtr<>.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.