Умные определения типа - PullRequest
8 голосов
/ 30 марта 2009

Я всегда использовал typedef во встроенном программировании, чтобы избежать распространенных ошибок:

int8_t - 8-битовое целое число со знаком
int16_t - 16-разрядное целое число со знаком
int32_t - 32-разрядное целое число со знаком
uint8_t - 8-битное целое число без знака
uint16_t - 16-разрядное целое число без знака
uint32_t - 32-разрядное целое число без знака

Недавняя встроенная муза (выпуск 177, еще не опубликованная на сайте) подтолкнула меня к мысли, что полезно иметь некоторые специфичные для производительности typedefs. Этот стандарт предлагает иметь typedefs, которые указывают, что вы хотите самый быстрый тип с минимальным размером.

Например, можно объявить переменную, используя int_fast16_t, но на самом деле она будет реализована как int32_t на 32-битном процессоре или int64_t на 64-битном процессоре, так как это будут самые быстрые типы по крайней мере 16 бит на этих платформах. На 8-битном процессоре это будет int16_t бит, чтобы соответствовать требованию минимального размера.

Никогда раньше не видел такого использования, я хотел знать

  • Вы видели это в каких-либо проектах, встроенных или нет?
  • Какие-нибудь возможные причины, чтобы избежать такого рода оптимизации в typedefs?

Ответы [ 6 ]

4 голосов
/ 30 марта 2009

Например, можно объявить переменная с использованием int_fast16_t, но это будет фактически реализован как int32_t на 32-битном процессоре, или int64_t на 64-битном процессоре как таковые были бы самые быстрые типы по крайней мере 16 бит на этих платформах

Вот для чего int, не так ли? Вероятно ли в ближайшее время встретиться с 8-битным процессором, где этого будет недостаточно?

Сколько уникальных типов данных вы можете запомнить ?

Предоставляет ли это так много дополнительных преимуществ, что стоит эффективно удваивать число типов, учитываемых при создании простой целочисленной переменной?

Мне трудно даже представить себе возможность его постоянного использования.

Кто-то собирается написать функцию, которая возвращает int16fast_t, а затем кто-то другой придет и сохранит эту переменную в int16_t.

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

4 голосов
/ 30 марта 2009

Выезд stdint.h из C99.

3 голосов
/ 30 марта 2009

Основная причина, по которой я бы избегал этого определения типа, заключается в том, что он позволяет типу лгать пользователю. Возьми int16_t против int_fast16_t. Оба имени типа кодируют размер значения в имя. Это не редкая практика в C / C ++. Я лично использую typedefs определенного размера, чтобы избежать путаницы для себя и других людей, читающих мой код. Большая часть нашего кода должна работать как на 32-, так и на 64-битных платформах, и многие люди не знают различных правил определения размера между платформами. Типы типа int32_t устраняют неоднозначность.

Если бы я не прочитал 4-й абзац вашего вопроса и вместо этого просто увидел имя типа, я бы предположил, что это был какой-то специфический для сценария способ получения быстрого 16-битного значения. И я, очевидно, был бы неправ :(. Для меня это нарушило бы правило программирования "не удивляй людей".

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

2 голосов
/ 31 марта 2009

Когда я смотрю на int_fast16_t, и я не уверен насчет собственной ширины процессора, на котором он будет работать, это может усложнить ситуацию, например, оператор ~.

int_fast16_t i = 10;
int_16_t j = 10;

if (~i != ~j) {
  // scary !!!
}

Каким-то образом я хотел бы умышленно использовать 32-битные или 64-битные в зависимости от собственной ширины процессора.

0 голосов
/ 30 марта 2009

Я обычно использую size_t, это самый быстрый размер адреса, традиция, которую я выбрал при встраивании. И это никогда не вызывало проблем или путаницы во встроенных кругах, но на самом деле это начало вызывать у меня проблемы, когда я начал работать на 64-битных системах.

0 голосов
/ 30 марта 2009

Я на самом деле не большой поклонник такого рода вещей.

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

...