Я пишу диспетчер памяти для своей виртуальной машины на С++. Ну, точнее, инструкции VM будут скомпилированы в С++ с встроенным менеджером памяти. Мне гораздо удобнее обрабатывать C, но теперь мне нужна встроенная поддержка обработки исключений, в значительной степени единственная причина, по которой я использую С++.
И C и С++ имеют строгое правило сглаживания, что два объекта несовместимых типов не должны пересекаться, с небольшим исключением в C для объединений. Но для определения поведения функций выделения памяти, таких как malloc
, calloc
, alloca
и т.д., Стандарт C имеет следующий абзац.
6.5-6 Эффективным типом объекта для доступа к его сохраненному значению является объявленный тип объекта, если таковой имеется. Выделенные объекты не имеют объявленного типа. Если значение хранится в объекте, не имеющем объявленный тип через lvalue, имеющий тип, который не является символом тип, то тип lvalue становится эффективным типом объект для этого доступа и для последующих обращений, которые не изменяют сохраненное значение. Если значение копируется в объект, не имеющий объявленного типа, используя
memcpy
илиmemmove
, или копируется как массив типа символа, тогда эффективный тип измененного объекта для этого доступа и для последующих обращений, которые не изменяются значение - это эффективный тип объекта, из которого копируется значение, если оно есть. Для всех других доступов к объекту, не имеющему объявленного типа, эффективным типом объекта является просто тип lvalue, используемый для доступа.
Это эффективно делает использование необработанной выделенной памяти для любого типа хорошо определенным поведением в C. Я попытался найти аналогичный абзац в стандартном документе С++, но не смог его найти. Я думаю, что у С++ есть другой подход в этом отношении. Что такое эквивалент С++ "выделенный объект, не имеющий объявленного типа" в C, и как его определяет стандарт С++?