Используют ли имена членов структуры больше памяти, чем если бы я использовал унаследованные члены класса? - PullRequest
1 голос
/ 13 января 2020

Я пытаюсь реализовать формат на основе классов в Rust, который не имеет классов или объектно-ориентированных концепций, таких как наследование.

Рассмотрим следующий пример:

class Creature {
  int id;
  bool alive
};

class Human: public Creature {
  int salary;
};

class Dog: public Creature {
  bool has_fur;
};

Если я хочу реализовать ту же структуру в Rust, я бы сделал что-то вроде этого:

struct Human {
    id: i32,
    alive: bool,
    salary: i32,
}

struct Dog {
    id: i32,
    alive: bool,
    has_fur: bool,
}

Из-за дублированных структур приложению потребуется больше памяти, чем если бы они были написаны на C ++ и унаследованы от базового класса ( или, может быть, использовали прототипы в JavaScript)? Приложение будет содержать миллионы объектов.

Я предполагаю, что в коде будет много дублированных имен членов, что, возможно, само по себе является проблемой. Но как бы вы перевели структуру данных в Rust (с наименьшим возможным объемом памяти)? Или это путь к go?

Ответы [ 2 ]

3 голосов
/ 13 января 2020

Нет.

Информация о типе не сохраняется во время выполнения, поэтому struct s могут свободно создаваться.

2 голосов
/ 13 января 2020

C ++ выполняет следующее: каждый Human занимает достаточно много байтов для хранения id, alive, salary - в этом порядке (если вы не используете какие-либо атрибуты упаковки (см. Принудительная сборка структуры C ++ )). Для выравнивания памяти поля struct могут быть дополнены, поэтому они могут занимать на несколько байтов больше, чем вы ожидаете.

Аналогично для Dog.

Наследование от общего базового класса уменьшает код, но - как вы его написали - не экономит память.

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

Повтор id и alive в двух разных структурах делает код немного более повторяющимся, но не будет потреблять больше байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...