Как говорится в ответе @ datenwolf, вы не можете делать никаких предположений о том, как malloc
предоставляет вам адрес памяти. MSB может содержать важные биты, которые вы могли бы перезаписать, если попытаетесь использовать их для хранения метаданных. Я работал над 32-разрядной системой, которая возвращала адреса с битами, установленными в MSB адресов (не от malloc
, а других функций выделения памяти в системе).
Однако : гарантирует, что malloc
вернет адрес, подходящий для вашей системы. Например, в 32-битной системе вы получите 4-байтовый выровненный указатель, а на 64-битном вы получите 8-байтовый выровненный указатель. Это означает, что вам гарантировано, что нижние 2 или 3 бита соответственно будет равным нулю. Вы можете увеличить количество гарантированных бит, используя вместо этого memalign
. Это, по сути, тот же эффект, что и хранение метаданных в наиболее значимом бите. Чтобы получить/установить литерал, вы можете просто перевернуть его вниз в оставшиеся биты.
Однако я бы не предложил ни один из методов. Спасите себе некоторую душевную боль и выделите лишь немного больше памяти для хранения флага. Если у вас нет миллиардов, это действительно не стоит.
У меня нет котировки, но я думаю, что это не указано. 'malloc' может вернуть все, что угодно. На практике это часто растет, и некоторые языки (OCaml) фактически делают то, что вы говорите безопасным способом. –
что случилось с 'int64_t' или' uint64_t'? – pmg
Это зависит от стратегии отображения памяти «OS» и потому, что стратегия - это детали реализации, она может меняться от одной версии «ОС» до следующей без предупреждения. Я не стал бы полагаться на такие хаки. – axiac