пятница, 2 октября 2009 г.

Determining 32 vs 64 bit in C++

Для реализации некоторых операций, которые зависят от битности платформы, часто используют директивы препроцессора. Однако, существует проблема с переносимостью такого кода, т. к. в стандарте нет макросов, которые помогают идентифицировать битность платформы.

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

template<int> void DoMyOperation();

template<> void DoMyOperation<4>() 
{
  // do 32-bits operations
}

template<> void DoMyOperation<8>() 
{
  // do 64-bits operations
}

int main()
{
  // appropriate function will be selected at compile time 
  DoMyOperation<sizeof(size_t)>(); 

  return 0;
}
В примере выше использован тип size_t, но стандарт говорит только о том, что этот тип должен уметь хранить максимальный размер блока памяти в текущей реализации системы аллоцирования. Строго говоря, это только косвенно говорит о том скольки битная платформа используется, но сложно представить себе реализацию С++, где это будет неприменимо.

Комментировать в ВКонтакте