Видимость произвольных операций с памятью не гарантируется при таких распределениях.
Каждое удаление / выделение должно быть упорядочено относительно других, а выделения, которые возвращают ту же память, что и предыдущее выделение, явно упорядочены.,Но это не подразумевает упорядочение в отношении других операций , которые произошли между ними.То есть это не означает последовательной согласованности всех других операций.
Теперь могут быть видны другие операции, например, те, которые происходят до освобождения.Но все, что предшествовало освобождению, этого не делает.
Смысл этого утверждения состоит в том, чтобы прояснить, что, если вы получаете тот же адрес памяти, что и при предыдущем выделении, то порядок, который привел вас туда, безусловно, включал обавыделение и освобождение памяти, включающей этот адрес.
Спецификации иногда бывают довольно педантичными.
Это может показаться чрезвычайно странным бременем для реализации
Не совсем.Видимость может потребоваться только в отношении выделения / выделения памяти, но даже видимость вряд ли будет удивительной или обременительной.
В конце концов, куча является общим ресурсом.Таким образом, доступ к нему как к общему ресурсу обычно блокируется мьютексом.И большинство мьютексов обеспечивают полную видимость всего, что блокирует / разблокирует.И это важно, потому что управление кучей требует записи данных управления кучей, которые должны быть видны другим потокам, которые пытаются ее выделить.Таким образом, вам нужен довольно широкий барьер памяти, чтобы выполнять свою работу в качестве распределителя с доступом к потокам.
И никто не ошибся в использовании общего распределителя памяти как операция fast .
Таким образом, если бы реализация действительно обеспечивала полную видимость, это, вероятно, было бы связано с тем, что она необходима для управления памятью кучи, и другие обращения к памяти, которые получают видимость, просто пришли для поездки.
Вотпотенциально проблемный случай: компилятор может предоставить атрибуты для указания семантических свойств функций (например, атрибутов общих функций GCC), которые идентифицируют функции, которые могут влиять только на некоторый диапазон памяти (в текущем «модуле», который будет являться областью программных инвариантов:user, stdlib, other library ...).
Такая функция не может вызвать предоставленный компилятором распределитель памяти общего назначения.По определению, для такой функции требуется, чтобы имел жесткий контроль над тем, какую память она использует, а базовый распределитель памяти этого не дает.Поэтому, если ему нужно динамическое распределение, ему придется использовать специализированный распределитель, и такой распределитель может играть по любым правилам, которые он хочет.