2015-01-08 2 views
2

Читаю Game Engine Architecture Джейсон Грегори, и я смущен предложения в книге:C++, как определить пользовательские атомный тип данных

»... большинство игр egines достижения исходного кода портативность, определяя их . собственные атомарные типы данных, например, в Naughty Dog мы используем следовать атомарные типы данных:

* F32 представляет собой 32-битный IEEE-754 с плавающей запятой значение

* U8, I8, U16, I16 , U32, I32, U64 и I64 являются неподписанными и подписанными 8-, 16, 32 и 64-битными целыми числами, соответственно ... »

Я просмотрел Google и Интернет, пытаясь найти способ определить эти типы данных. Является ли это обычно делается только с помощью директивы #define, чтобы назначить эти значения независимо от значения является, как это:

#define U8 __int8 т.д ..

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

+3

Вы также можете использовать [typedefs] (http://en.wikipedia.org/wiki/Typedef). Это на самом деле предпочтительная техника. – BWG

+0

http://en.cppreference.com/w/cpp/atomic/atomic – David

+0

В чем ваш вопрос, _specifically_? Как использовать псевдонимы? Как получить целые числа фиксированной ширины? Как получить атомные типы? Какие? –

ответ

2

Использование #define окончательно не рекомендуется в C++. Даже в C вы можете использовать typedef для типов.

typedef unsigned __int8 U8; 

Однако, как было упомянуто Dave (см его ссылку на полный список), то есть атомные определения в C++, такие как:

std::atomic_uint_fast8_t 
// or 
std::atomic<std::uint_fast8_t> 
// with the typedef: 
typedef std::atomic_uint_fast8_t U8; 

Тем не менее, если вы хотите быть немного менее развитой, вы можете включать в себя cstdint включают, что в большинстве случаев то, что будет работать на большинстве компьютеров:

#include <cstdint> 

это дает стандартный [и] Инт [8,16,32,64] _t типов. Таким же типом, как указано выше, будет:

uint8_t my_var; 
// if you really want to use a typedef: 
typedef uint8_t U8; 
U8 my_var; 

Эти типы переносятся, без необходимости в дополнительном typedef.

Для float и double они обычно переносимы. То, что не является long double, который редко используется в любом случае. Вы могли бы еще ЬурейеЕ, на всякий случай:

typedef float F32; 

Тогда в любом месте вашего кода, вы должны использовать эти определения, а не типы по умолчанию C/C++ (т.е. char, short, int, long запрещены.)

Поместите все те заголовки, которые включают в себя все другие файлы на C++.


Update:

достаточно памяти в каждом типе

Очевидно, что если вы используете uint8_t, то вы можете быть уверены, что вы по крайней мере, иметь 8 битное число. Это может быть 16 бит тоже ...(некоторые процессоры ограничены таким образом) Аналогично, uin32_t будет иметь как минимум 32 бита.

Возможно, у вас есть проверка времени компиляции, если вы действительно хотите убедиться. Это использует sizeof() с шаблоном. Смотрите здесь:

Compile-time sizeof conditional

Обратите внимание, что это не относится к играм. Любое программирование должно тщательно выбирать их типы переменных. Все больше и больше людей используют 64-битные целые числа, чтобы удостовериться, что они могут поддерживать размеры более 2 ГБ (4 ГБ, если вы используете неподписанные ...)

FYI - одна из европейских ракет Ariane (это был французский во время аварии) был взорван, потому что переменная составляла 8 бит, когда она должна была быть 16 бит. Это дает вам представление, почему это важно ...

+0

В книге он, похоже, делает все, чтобы быть уверенным, что у вас всегда есть нужный объем памяти в каждом типе данных. Я предполагаю, что, если стандартных типов достаточно, я просто не понимаю, почему он хотел бы упомянуть о создании их самих. –

+0

@max, потому что такие типы ('uint8_t' и т. Д.) Не всегда существовали. Не было и «атомного». И если вам нужно использовать разные потоковые платформы на разных архитектурах, вам понадобится общая оболочка. – Yakk

+0

Да, Якк прав. Если вам нужно было запрограммировать старую консоль, вы можете столкнуться только с более старой версией gcc, например 3.x или что-то еще, или, что еще хуже, VC6 ... В этом случае, имея один заголовок, который определяет все ваши собственные U8, U16 и т. Д. Сэкономит вам много времени. –

Смежные вопросы