История изменений
Исправление 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
.