LINUX.ORG.RU

История изменений

Исправление Vic, (текущая версия) :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч. Часть бит типа uint отводится под номер кучи, а часть под смещение в куче с заданным номером.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref() или сразу подставлять deref() в код. Понятно, что тут показана идея, но в реальности deref() должен быть более защищен и сложен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для обычных адресов, но только для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL. Смещение 0 занято для первой кучи, так что простой ноль в текущей вариации использовать нельзя.

Но очень хочется, чтобы UINT_PTR_NULL = 0, для паттерна:

uintptr_t VarRefPtr = UINT_PTR_NULL;
...
if (!VarRefPtr)
  return;

Значит надо больше бит под номер кучи и меньше под смещения (под максимальный размер куч). Т.е. реальный код, вероятнее всего, будет работать на размерах куч UINTPTR_MAX / 4 байтов.

Вполне годная вариация использования битов под номер кучи.

Исправление Vic, :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч. Часть бит типа uint отводится под номер кучи, а часть под смещение в куче с заданным номером.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref() или сразу подставлять deref() в код. Понятно, что тут показана идея, но в реальности deref() должен быть более защищен и сложен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для обычных адресов, но только для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL. Смещение 0 занято для первой кучи, так что простой ноль в текущей вариации использовать нельзя.

Но очень хочется, чтобы UINT_PTR_NULL = 0, для паттерна:

uintptr_t VarRefPtr = UINT_PTR_NULL;
...
if (!VarRefPtr)
  return;

Значит надо больше бит под номер кучи и меньше под смещения (под максимальный размер куч). Т.е. реальный код будет работать на размерах куч UINTPTR_MAX / 4 байтов.

Вполне годная вариация использования битов под номер кучи.

Исправление Vic, :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч. Часть бит типа uint отводится под номер кучи, а часть под смещение в куче с заданным номером.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref() или сразу подставлять deref() в код. Понятно, что тут показана идея, но в реальности deref() должен быть более защищен и сложен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для обычных адресов, но только для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL. Смещение 0 занято для первой кучи, так что простой ноль в текущей вариации использовать нельзя.

Но очень хочется, чтобы UINT_PTR_NULL = 0, для паттерна:

uintptr_t VarRefPtr = UINT_PTR_NULL;
...
if (!VarRefPtr)
  return;

Значит надо больше бит под номер кучи и меньше под смещения (под максимальный размер куч). Т.е. реальный код будет работать на размерах куч UINTPTR_MAX / 4 байтов.

Вполне годно.

Исправление Vic, :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч. Часть бит типа uint отводится под номер кучи, а часть под смещение в куче с заданным номером.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref() или сразу подставлять deref() в код. Понятно, что тут показана идея, но в реальности deref() должен быть более защищен и сложен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для обычных адресов, но только для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL. Смещение 0 занято для первой кучи, так что простой ноль в текущей вариации использовать нельзя.

Но очень хочется, чтобы UINT_PTR_NULL = 0, для ленивого паттерна:

uintptr_t VarRefPtr = UINT_PTR_NULL;
...
if (!VarRefPtr)
  return;

Значит надо больше бит под номер кучи и меньше под смещения (под максимальный размер куч). Т.е. реальный код будет работать на размерах куч UINTPTR_MAX / 4 байтов.

Вполне годно.

Исправление Vic, :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч. Часть бит типа uint отводится под номер кучи, а часть под смещение в куче с заданным номером.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref() или сразу подставлять deref() в код. Понятно, что тут показана идея, но в реальности deref() должен быть более защищен и сложен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для обычных адресов, но только для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL. Смещение 0 занято для первой кучи, так что простой ноль в текущей вариации использовать нельзя.

Но очень хочется, чтобы UINT_PTR_NULL = 0, значит надо больше бит под номер кучи и меньше под смещения (под максимальный размер куч). Т.е. реальный код будет работать на размерах куч UINTPTR_MAX / 4 байтов.

Вполне годно.

Исправление Vic, :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч. Часть бит типа uint отводится под номер кучи, а часть под смещение в куче с заданным номером.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref(). Понятно, что тут показана идея, но в реальности deref() должен быть более защищен и сложен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для обычных адресов, но только для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL. Смещение 0 занято для первой кучи, так что простой ноль в текущей вариации использовать нельзя.

Но очень хочется, чтобы UINT_PTR_NULL = 0, значит надо больше бит под номер кучи и меньше под смещения (под максимальный размер куч). Т.е. реальный код будет работать на размерах куч UINTPTR_MAX / 4 байтов.

Вполне годно.

Исправление Vic, :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref(). Понятно, что тут показана идея, но в реальности deref() должен быть более защищен и сложен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для обычных адресов, но только для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL. Смещение 0 занято для первой кучи, так что простой ноль в текущей вариации использовать нельзя.

Но очень хочется, чтобы UINT_PTR_NULL = 0, значит надо больше бит под номер кучи и меньше под смещения (под максимальный размер куч). Т.е. реальный код будет работать на размерах куч UINTPTR_MAX / 4 байтов.

Вполне годно.

Исправление Vic, :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref(). Понятно, что тут показана идея, но в реальности deref() должен быть более защищен и сложен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для обычных адресов, но только для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL. Смещение 0 занято для первой кучи, так что простой ноль использовать нельзя.

PS. Значит смещения уже явно будут работать на размерах куч UINTPTR_MAX / 4 байтов.

Исправление Vic, :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref(). Понятно, что тут показана идея, но в реальности deref() должен быть более защищен и сложен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для обычных адресов, но только для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL. Смещение 0 занято для первой кучи, так что простой ноль использовать нельзя.

Исправление Vic, :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref(). Понятно, что тут показана идея, но в реальности deref() должен быть более защищен и сложен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для обычных адресов, но только для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL.

Исправление Vic, :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref(). Понятно, что тут показана идея, но в реальности deref() должен быть более защищен и сложен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL.

Исходная версия Vic, :

uintptr_t

Это просто целое беззнаковое число, @monk просто ввел свой уникальный тип (для куч heap1 и heap2), который хранит смещение относительно одного из двух базовых адресов этих куч.

typedef unsigned int uintptr_t;

При выделении памяти в одной из куч программист сам назначает к какой куче относится адрес с помощью heap1_ref() или heap2_ref(). Но смещение потом нельзя использовать без преобразования к адресу, для этого придется добавлять переменную и делать ей deref(). Кстати, deref() должен быть более защищен, учитывать и проверять размер куч и возвращать NULL при выходе за границы куч.

Плюс не учтен UINT_PTR_NULL (число, аналог NULL-а для uintptr_t), этот аналог не должен принадлежать ни одной из куч, и deref(UINT_PTR_NULL) = NULL.