Информация об изменениях

Сообщение Re[2]: Что такое Dynamically-sized types (DSTs) в Rust ? от 12.01.2015 8:29

Изменено 12.01.2015 8:30 x-code

Здравствуйте, D. Mon, Вы писали:

DM>А вот если это что-то описано как объект некоторого класса, и этот класс служит базовым для некоторых других, то возможно, что вместо объекта базового класса там окажется объект наследного, он может быть уже другого размера. Что там на самом деле — известно лишь в рантайме, вот и получается тип динамического размера. Если копировать, полагаясь на известный при компиляции тип, то объект может быть скопирован не целиком, получается слайсинг, беда. Поэтому в цивизизованных ОО языках все объекты размерщают в куче и передают лишь по указателю, по значению их не копируют.

DM>Аналогично и тут, только вместо базового класса trait, который служит аналогом интерфейса. Если известен лишь интерфейс/trait, то размер объекта, который его реализует, неизвестен статически, он динамический.

ОК, то есть если тип динамический (точно известен лишь в рантайме — в частности указатель на базовый класс) то и размер динамический — это понятно. Ну а фича-то в чем? Как в С++ жили без этого и почему в Rust это вдруг понадобилось?

Кстати, еще вспоминается низкоуровневая фича из Си "struct hack" — там тоже размер фактического объекта динамический и известен лишь в рантайме:
struct FOO {
  int size;
  char buf[0]; // buf[len]
};

хотел упомянуть в первом сообщении, но непонятно в тему ли это...
Re[2]: Что такое Dynamically-sized types (DSTs) в Rust ?
Здравствуйте, D. Mon, Вы писали:

DM>А вот если это что-то описано как объект некоторого класса, и этот класс служит базовым для некоторых других, то возможно, что вместо объекта базового класса там окажется объект наследного, он может быть уже другого размера. Что там на самом деле — известно лишь в рантайме, вот и получается тип динамического размера. Если копировать, полагаясь на известный при компиляции тип, то объект может быть скопирован не целиком, получается слайсинг, беда. Поэтому в цивизизованных ОО языках все объекты размерщают в куче и передают лишь по указателю, по значению их не копируют.

DM>Аналогично и тут, только вместо базового класса trait, который служит аналогом интерфейса. Если известен лишь интерфейс/trait, то размер объекта, который его реализует, неизвестен статически, он динамический.

ОК, то есть если тип динамический (точно известен лишь в рантайме — в частности указатель на базовый класс) то и размер динамический — это понятно. Ну а фича-то в чем? Как в С++ жили без этого и почему в Rust это вдруг понадобилось?

Кстати, еще вспоминается низкоуровневая фича из Си "struct hack" — там тоже размер фактического объекта динамический и известен лишь в рантайме:
struct FOO {
  int size;
  char buf[0]; // buf[size]
};

хотел упомянуть в первом сообщении, но непонятно в тему ли это...