Поскольку после освобождения (memory1) доступ к чему-либо через указатель memory1 является неопределенным поведением (носовые демоны и т. Д.), И, следовательно, компилятор может оптимизировать, предполагая, что memory2 не является псевдонимом любого другого указателя после malloc () позвоните.
Что касается того, почему это важно, предполагая, что сам компилятор не имеет внутренней информации о семантике malloc (), т.е. что он обрабатывает ее так же, как любую другую функцию, то он не может предположить, что возвращенный указатель не является псевдонимом других указатель. __declspec(restrict)
(или, что то же самое, __attribute__((malloc))
в GCC) сообщает компилятору, что указатель не является псевдонимом какого-либо другого указателя, что допускает некоторые оптимизации, невозможные в противном случае.