﻿# Можно заставить тип size\_t быть 32\-битным в 64\-битной программе?

В процессе переноса кода с 32\-битной на 64\-битную систему иногда может возникнуть желание для сокращения количества ошибок и предупреждений, выдаваемых компилятором, сделать типы size\_t/ ptrdiff\_t вновь 32\-битными\. Обычно это аргументируется тем, что программа не будет работать с большим количеством памяти и объектов\.

С примером подобного обсуждения на форуме можно познакомиться здесь: "[Can use 32 bit size\_t in x64 VC2008 STL?](https://social.msdn.microsoft.com/Forums/vstudio/en-US/50027f72-7b17-4b42-a25c-f33ec4c5b5d9/can-use-32-bit-sizet-in-x64-vc2008-stl?forum=vclanguage)"\.

Вначале краткий ответ на вопрос\. Нельзя и не стоит думать в этом направлении\. Сосредоточьтесь на исправлении ошибок и предупреждений\. Обоснований такому ответу множество\. Перечислим только некоторые из них\.

Представим, что используя хитрости \(typedef, \#define\), вам удастся переопределить тип size\_t в вашем коде как 32\-битный\. Тогда:

1\) Вы получите несовместимость при попытке линковки с библиотеками, которые собраны с size\_t нормального размера\.

2\) Вы получите дополнительные ошибки\. Пример:

```cpp
#define size_t unsigned
void Errors(void *ptr, CArray<int> &arr)
{
  size_t a = (size_t)ptr;
  ptr = (void *)a; //Invalid pointer
  //Infinity loop if array size > UINT_MAX
  for (size_t i = 0; i != arr.GetSize(); i++)
    arr[i] = 0;
}
```

3\) Многие операции начнут выдавать предупреждения и будут потенциально некорректны\. Пример:

```cpp
#define size_t unsigned
void A(float *p1, float *p2)
{
  size_t s = p1 - p2; //Warning C4244
}
```

Подведем итог\. Не следует пытаться осуществить "хак" по смене размера типа size\_t/ptrdiff\_t\. Трудозатраты на разрешение проблемы с линковкой, исправлением новых ошибок и предупреждений компилятора могут быть больше, чем при рефакторинге кода для полноценной поддержки 64\-битности\. При этом занимаясь "хаком" вы рискуете внести в код массу скрытых дефектов, которые долго не удастся выявить\. Например, код с помещением указателя в 32\-битныое целое может долгое время успешно работать, пока указатель ссылается на объект, лежащий в младших четырех гигабайтах памяти\. Но в любой момент объект может быть создан за пределами младших четырех гигабайт\. И скорее всего это произойдет у пользователя при активном использовании программы, а не при тестовых испытаниях\.

Дополнительно предлагаем ознакомиться со статьями, приведенными в библиографическом списке\.

## Библиографический список

1. Андрей Карпов\. [Что такое size\_t и ptrdiff\_t](https://pvs-studio.ru/ru/blog/posts/cpp/a0050/)\.
1. Андрей Карпов\. [64\-битный конь, который умеет считать](https://pvs-studio.ru/ru/blog/posts/cpp/a0043/)\.
1. Андрей Карпов, Евгений Рыжков\. [20 ловушек переноса Си\+\+ \- кода на 64\-битную платформу](https://pvs-studio.ru/ru/blog/posts/cpp/a0004/)\.