Ponieważ ścisłe aliasingowanie może pomóc w lepszej optymalizacji kompilatora, C99 wprowadziło słowo kluczowe restrict
, które może być użyte jako kwalifikator zmiennej, jeśli programiści gwarantują, że nie będzie on dostępny przez wskaźnik do innego typu. Jednak typowanie między różnymi typami jest nieuniknione z kilku powodów, a to spowoduje, że kompilator przyjmie, że jeden wskaźnik nie jest aliasem drugiego. Dlatego metoda obejścia problemu polega na wyłączeniu globalnej ścisłej optymalizacji aliasingowej poprzez przekazanie -fno-strict-aliasing
(flagi GCC). To nie ma sensu, ponieważ mogą istnieć tylko dwa wskaźniki, które nie powinny być w pełni zoptymalizowane. Dlatego warto wprowadzić przeciwne słowo kluczowe o numerze restrict
, które mówi kompilatorowi, że nie zakłada, że te dwa wskaźniki wskazują na różne adresy. Jest to trochę podobne do tego, co robi volatile
, a to mówi kompilatorowi, że zmienna ta jest bardzo zmieniona, więc traktuj je w specjalny sposób. Czy jest możliwe utworzenie takiego słowa kluczowego?Przeciwne słowo kluczowe "restrict" w C?
EDYCJA: Istnieje sposób na rozwiązanie tego problemu. Zobacz poniżej komentarz do: yano's.
ścisłe aliasing nie gwarantuje, że coś nie będzie dostępne przez więcej niż jeden wskaźnik - tylko, że nie będzie on dostępny (ogólnie) przez wskaźnik do innego typu. 'restrict' jest inne. – Dmitri
Czy masz konkretny MVCE? –
Wdrażam listę połączonych XOR, która będzie typować dwa różne typy wskaźników. To sprawia, że GCC jest zdezorientowany i tworzy wyjątki wykluczające bez ustawienia flagi '-fno-strict-aliasing'. Myślę, że wyłączenie globalnej optymalizacji to taka szkoda. –