2016-04-09 3 views
0

Обычно я использую #define MY_PARRENT_THE_FIRST 1, чтобы использовать меньше памяти.Лучшая эквивалентность #define в C++

Я искал лучшей эквивалентности в C++ об этом, и я нашел два:

Первый заключается в использовании перечислений:

enum class MyParrent : char 
{ 
    theFirst = 1, 
    theSecond = 6, 
    theThird = 64 
} 

Во-вторых, используя пространства имен и переменных:

namespace MyParrent 
{ 
    char const theFirst (1); 
    char const theSecond (6); 
    char const theThird (64); 
} 

Однако Я не смог узнать, не использует ли какой-либо из них никакой объем памяти в качестве оператора #define MY_PARRENT_THE_FIRST 1.

Какая наилучшая практика для достижения такой же незаметности памяти в C++ (встроенная вставка значения вместо выделения памяти и вставки там значения)?

+0

'static const int MY_PARRENT_THE_FIRST = 1;' не должно занимать какое-либо место в памяти. –

+0

не может быть сделано в пространстве имен, таком как вторая версия, но со статикой впереди? – codiac

+0

Несомненно, он может отображаться в 'namespace'. –

ответ

0

Типы не занимают память во время выполнения, только значения делают. Это связано с тем, что в результате исполняемого файла не нужно хранить все о типах, но требуется хранить большинство переменных. Ваш enum MyParrent является типом и не принимает память, но значение типа enum MyParrent занимает один байт памяти, потому что базовый тип enum MyParrent - это char. Когда вы определяете переменные, как во втором примере, это требует памяти.

PS: Ваше определение MY_PARRENT_THE_FIRST расширяется до целого литерала 1 и в некоторых случаях может занять даже памяти во время выполнения, так как целые литералы имеют тип int или даже некоторого более широкого целого типа. Вы можете подтвердить это:

auto const var = MY_PARRENT_THE_FIRST; 
static_assert(sizeof(var) > sizeof(MyParrent), "");