Wpis z mikrobloga

@m1chaal: volatile oznacza, że kompilator ci tej zmiennej nie wyoptymalizuje (np. sądząc, że nie jest wykorzystywana).

Static oznacza, że zmienna jest widoczna tylko w danej jednostce kompilacji (w C++ static ma trochę więcej znaczeń, ale piszesz o C).
  • Odpowiedz
@zwei: aha, no i w środku funkcji static oznacza co innego - to, że zmienna ma globalny lifetime. Pomiędzy wywołaniami tej funkcji zmienna zachowa swoją wartość. Np.

void foo () {
  static int x = 0;
  x++;
  • Odpowiedz
@m1chaal: volatile zmusza kompilator do respektowania wszystkich zapisów/odczytów (bez cachowania, zmiany kolejności itd) do danej zmiennej tak jak to jest napisane w programie. Przykładowe zastosowanie to DMA, załóżmy że pod bool* masz wartość, która mówi czy sensor światła coś wykrył. Wartość tej zmiennej zmienia się niezależnie od programu (kompilator nie wie co się dzieje w tle) i w takim przypadku musisz użyć volatile, żeby wszystkie odczyty z tej zmiennej były
  • Odpowiedz
scope != lifetime


@Saly: ups, czyli: lokalna statyczna zmienna w funkcji ma scope funkcji, a lifetime całego programu.

kompilator może załadować x do rejestru


@Saly: z cache'u właśnie. Chodzi o to, że nic nie stoi na przeszkodzie, żeby zmienne volatile były ładowane z cache L1/L2/L3 a nie z pamięci, przez co są cacheowane. Chyba, że znowu się mylę? :D
  • Odpowiedz
Static oznacza, że zmienna jest widoczna tylko w danej jednostce kompilacji (w C++ static ma trochę więcej znaczeń, ale piszesz o C).


@m1chaal: w dużym skrócie

static
globl scope - każda jednostka translacji (czyli plik wynikowy '.o' który robisz z '.c') ma swój słownik nazw. Domyślnie wszystkie globalne zmienne i funkcje lądują w tym słowniku. Dzieki temu możesz odwołać się do tej zmiennej z innego pliku poprzez użycie tej nazwy. Użycie
  • Odpowiedz
Chyba, że znowu się mylę?


@afe1: mylisz się, volatile nie ma nic wspólnego z cache'm, rejestrami ani niczym innym poza kodem C i jak z niego jest generowany assembler. To jest po prostu atrybut zmiennej który mówi, że ma ją obsługiwać tak albo inaczej.
  • Odpowiedz
z cache'u właśnie. Chodzi o to, że nic nie stoi na przeszkodzie, żeby zmienne volatile były ładowane z cache L1/L2/L3 a nie z pamięci, przez co są cacheowane.


@afe1: tak i nie. Cache L1/L2/L3 to tylko szczegół implementacyjny, który nie zmienia semantyki. To o czym mówię yo moźliwość ignorowania odczytu danej zmiennej (z pamięci do rejestru) jeśli kompilator wyśledzi, że ta zmienna już jest przeczytana i nikt po drodze jej
  • Odpowiedz
mylisz się, volatile nie ma nic wspólnego z cache'm, rejestrami ani niczym innym poza kodem C i jak z niego jest generowany assembler. To jest po prostu atrybut zmiennej który mówi, że ma ją obsługiwać tak albo inaczej.


@BeginEnd:no i gdzie tu się niby mylę? To co napisałeś nie zabrania aby dane volatile były ładowane z np L3, czyli z cache.

@Saly: ok, rozumiesz każdorazowe ładowanie jako brak
  • Odpowiedz