Поскольку строгое наложение псевдонимов может помочь лучше оптимизировать компилятор, C99 представила ключевое слово restrict
, которое может использоваться в качестве квалификатора переменной, если программисты гарантируют, что к нему не будет доступен указатель на другой тип. Тем не менее, приведение типов между разными типами неизбежно по нескольким причинам, и это заставит компилятор предположить, что один указатель не является псевдонимом другого. Поэтому метод обходного пути состоит в том, чтобы отключить глобальную оптимизацию строгих псевдонимов, передав -fno-strict-aliasing
(флаг GCC). Это совершенно не имеет смысла, потому что может быть только два указателя, которые не должны быть полностью оптимизированы. Следовательно, почему бы не ввести противоположное ключевое слово restrict
, которое сообщает компилятору, что не предполагают, что эти два указателя указывают на разные адреса. Это несколько похоже на то, что делает volatile
, и что говорит компилятору, что эта переменная сильно изменена, поэтому относитесь к ним особым образом. Возможно ли создать такое ключевое слово?Противоположное ключевое слово "ограничить" в C?
EDIT: Существует способ решить эту проблему. См. Комментарий yano's.
Строгое сглаживание не является гарантией того, что к чему-то не будет доступен более чем один указатель - просто он не будет доступен (обычно) с помощью указателя на другой тип. 'ограничение' отличается. – Dmitri
У вас есть конкретный MVCE? –
Я реализую связанный список XOR, который будет приписывать два разных типа указателей. Это заставляет GCC запутаться и произвести excgables segfault без установки флага '-fno-strict-aliasing'. Я считаю, что отвращение к глобальной оптимизации очень жаль. –