typedef struct {
void * field1;
} s1;
void func1(void) {
s1 my_s1;
s1 * __restrict my_s1_ptr = &my_s1;
*((int*)((char*)my_s1_ptr->field1 + 4)) = 0;
*((int*)((char*)my_s1_ptr->field1 + 8)) = 1;
*((int*)((char*)my_s1_ptr->field1 + 12)) = 2;
*((int*)((char*)my_s1_ptr->field1 + 16)) = 3;
}
Wydaje się, że dla wersji 11.1 kompilatora Intel i wersji 4.6 gcc że ładuje kompilatora my_s1_ptr-> pole1 dla każdego z ostatnich 4 wypowiedzi. Moje rozumienie __restrict sugerowałoby mi, że ostatnie 3 obciążenia powinny być zbędne i mogą zostać wyeliminowane. Tak, wiem, że kod jest dziwny, ale jest powód, dla którego jest tak skonstruowany. Chciałbym móc skompilować kompilator, aby wyeliminować nadmiarowe ładunki. Masz pomysł, jak to przekonać?c99 __restrict i kompilator optymalizacji
Czy kompilowałeś z optymalizacją? I dlaczego używasz '__restrict' zamiast' restrict', które jest słowem kluczowym C99? –
Zrobiłem kompilację z optymalizacją, a __restrict versus restrict nie robi różnicy. – DrTodd13
Po prostu próbowałem kilka odmian wskaźnika na pole zamiast wskaźnika do struktury i nic nie zmieniło. W prawdziwym kodzie może być wiele wskaźników wskazujących, które pole 1 wskazuje, więc nie jest ważne dodawanie ograniczenia do pola 1 (ale nawet gdy próbowałem, to nie eliminowało obciążenia). Jeśli skopiuję field1 do ograniczającego wskaźnika zmiennej lokalnej, wówczas zbędne obciążenia zostaną wyeliminowane, ale tak jak powiedziałem, narusza to semantykę programu. – DrTodd13