2016-09-02 8 views
0

После довольно длительного времени в нескольких программах я обнаружил, что в зависимости от платформы мне иногда приходится опускать использование ОЗУ резко, из-за крайне ограниченных ресурсов на некоторых платформах. Я обычно храню большие карты и матрицы в терминах этих типов, поэтому переход от int32 к int16 или от float до double (в случае, если они фактически имеют разный размер), легко сокращает мое использование почти на половину. Таким образом, я просто добавил переопределениями как таковые:Переопределить примитивные типы для быстрой смены использования ОЗУ, лучшей читаемости (и, возможно, повышения производительности)

typedef double Float; 
typedef int32_t Int; 
typedef uint32_t UInt; 

Это позволяет мне быстро настроить все важные примитивные типы в моей программе. Обратите внимание: ни одно из моих целых чисел в программе фактически не превышает размер 2 байтового целого числа, поэтому нет проблемы, используя любой из int16 для int64.

Кроме того, кажется более читаемым, чтобы просто иметь приятный «Int» вместо «uint32_t». И в некоторых случаях я наблюдал изменение производительности, уменьшая размер примитивных типов и увеличивая его.

Мой вопрос: есть ли недостатки, которые я просто пропускаю? На самом деле я ничего не мог найти об этой теме, поэтому, пожалуйста, отведи меня туда, если я тоже это пропустил. Код в основном для меня, другие могут его увидеть, но в любом случае он будет предоставлен мной лично или с надлежащей документацией.

EDIT: Извините за прошлую ошибку, я действительно использую typedefs.

+0

Ну «недостаток» я мог видеть, как при совместном использовании кода с другими, потому что они не используются к typedefs. И если вы проверяете границы, вы должны использовать numeric_limits, а не hardcode (что обычно всегда лучше), потому что, когда вы меняете тип на меньший, границы также изменяются. – Hayt

+0

@Hayt Спасибо за комментарий. Да, я думал об использовании числовых ограничений в целом. Тем не менее, наибольшие целые числа, которые я достигаю, имеют размер 2000-3000, и в моей программе нет возможности превзойти его. Для плавающих точек это похоже. – phil13131

+0

Если вы никогда не превышаете границы меньших типов, есть ли причина не использовать их безоговорочно? Кроме того, меня пугает идея иметь тип 'Int' на современной архитектуре, тайно составляющий всего 16 бит. –

ответ

2

typedef int32_t Int; НЕ ПЛОХО, но typedef double Float; НЕ ХОРОШО. Потому что это сбивает с толку: Float - это, по сути, двойной !?

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

#ifdef LARGE 
typedef int32_t Int; 
typedef double Real; 
#else 
typedef int16_t Int; 
typedef float Real; 
#endif 
void f() { 
    cout << sizeof(Int) << endl; 
    cout << sizeof(Real) << endl; 
} 

Для использования больших типов: g++ -o test test.cpp -DLARGE

Чтобы использовать небольшие типов: g++ -o test test.cpp

+0

Мне нравится идея препроцессора. Я должен был бы сделать его немного более регулируемым, потому что только малый/большой не всегда будет покрывать его, но я, скорее всего, сделаю это. «Реал», кроме того, очень хорошее имя, я в прошлом называл его FloatPt в прошлом, ссылаясь на общую плавучую точку, но «Реал» действительно лучше. – phil13131