Класс, содержащий int в разных байтах? - PullRequest
0 голосов
/ 03 января 2019

Я хотел бы придумать класс Record, который содержит int, но это может быть int64_t, int32_t, int16_t, int8_t.
Но у меня возникла проблема, когда я хочу прочитать данные из этого Record объекта.


Предположение в нашем контексте:
Мы знаем, какой int мы хотим сохранить.
Мы должны заплатитьобратите внимание на производительность из getValue() такой функции и размер такого класса или объединения.

Я бы попробовал 3 реализации в контексте (очень пустышки).
1. Первая реализация:

class Record{
  int64_t value;
  unsigned int bytes; // number of bytes, in context 1 or 2 or 3 or 4 representing int8_t, int16_t, int32_t, int64_t

  int64_t getValue() { return value; }
  unsigned int getNumByte() { return bytes; }
}

Я бы попытался вызвать getValue() и getNumByte(), а затем привести значение к правильному типу, например if (getNumByte() == 1) auto value = (int8_t getValue()).


2.Second: Использование template.

template <class T> 
class Record{
  T value;
  T getValue() { return value; }
}

3.Third: Использование union:

union Record {
  int64_t int64;
  int32_t int32;
  int16_t int16;
  int8_t int8;
};

Мой вопрос:
Что касается этого контекста, какая реализация лучше?
Когда все они не настолько оптимальны, какой подход вы бы придумали?


Причина дляэтот вопрос: это был Recordза char*.Таким образом, в этой ситуации char* value с unsigned int length имеет смысл.Я хочу переключиться на ситуацию int и у меня возникла эта проблема.

1 Ответ

0 голосов
/ 03 января 2019

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

template <class T> 
class Record {
    T value;
  public:
    const T& getValue() const { return value; }
}

Однако это решение не позволяет вам иметь контейнер записей с различными аргументами шаблона и усложняет работу с кодом сериализации / десериализации.

Кроме того, если этот код работает для вас, то спросите себя, для чего служит эта «Запись»?Я бы просто использовал сам базовый тип.

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