2015-11-21 11 views

Odpowiedz

25

Bez słowa kluczowego , Solidity próbuje zadeklarować zmienne w pamięci masowej.

Poprowadź charytha o wysokiej wydajności: "Możesz myśleć o pamięci masowej jako o dużej macierzy, która ma wirtualną strukturę ... strukturę, której nie możesz zmienić w czasie wykonywania - jest ona określana przez zmienne stanu w twojej umowie".

Oznacza to, że struktura pamięci jest ustalona w momencie tworzenia kontraktu na podstawie deklaracji zmiennych na poziomie kontraktu i nie może być zmieniona przez przyszłe wywołania metod. ALE - zawartość tego magazynu można zmienić za pomocą wywołań sendTransaction. Takie wywołania zmieniają "stan", dlatego zmienne na poziomie kontraktu nazywane są "zmiennymi stanu". Tak więc zmienna uint8 storagevar; zadeklarowane na poziomie kontraktu można zmienić na dowolną prawidłową wartość uint8 (0-255), ale to "gniazdo" dla wartości typu uint8 zawsze będzie dostępne.

Jeśli zadeklarujesz zmienne w funkcjach bez słowa kluczowego 2016, to solidność spróbuje użyć struktury pamięci, która obecnie kompiluje, ale może przynieść nieoczekiwane rezultaty. Pamięć mówi solidności, aby utworzyć kawałek miejsca dla zmiennej w czasie wykonywania metody, gwarantując jej rozmiar i strukturę do wykorzystania w przyszłości w tej metodzie.

Pamięć nie może być używana na poziomie umowy. Tylko w metodach.

Zobacz w FAQ na stronie the entry "What is the memory keyword? What does it do?". Cytuję tutaj:

Maszyna wirtualna Ethereum ma trzy obszary, w których może przechowywać przedmioty.

Pierwsza to "pamięć", w której znajdują się wszystkie zmienne stanu umowy. Każda umowa ma swoją własną pamięć i jest trwała między wywołaniami funkcji i dość droga w użyciu.

Druga to "pamięć", służy do przechowywania wartości tymczasowych. Jest on usuwany między (zewnętrznymi) funkcjami i jest tańszy w użyciu.

Trzeci to stos, który służy do przechowywania małych zmiennych lokalnych. Jest prawie darmowy w użyciu, ale może zawierać tylko ograniczoną liczbę wartości.

Dla prawie wszystkich typów nie można określić, gdzie powinny być przechowywane, ponieważ są kopiowane za każdym razem, gdy są używane.

Typy, w których tak zwana lokalizacja przechowywania jest ważna, to struktury i tablice. Jeśli np. przekazywać takie zmienne w wywołaniach funkcji, ich dane nie są kopiowane, jeśli mogą pozostać w pamięci lub pozostać w pamięci. Oznacza to, że możesz modyfikować ich zawartość w wywołanej funkcji, a modyfikacje te będą nadal widoczne w dzwoniącym.

Istnieją domyślne dla lokalizacji magazynu w zależności od typu zmiennej to dotyczy:

  • zmienne stanu są zawsze w pamięci
  • argumenty funkcji są zawsze w pamięci
  • zmienne lokalne struct, tablicy lub domyślnie przechowywanie referencyjne typu odwzorowania
  • zmienne lokalne typu wartości (tj. ani tablica, ani struktura, ani odwzorowanie) są przechowywane w stosie
+0

Czy masz jakieś linki do dokumentów, które to wyjaśniają? Chciałbym przeczytać nieco więcej o tym, jak działa pamięć masowa. – Acapulco

+0

@Acapuclo Jest w FAQ "Co to jest słowo kluczowe pamięci?" Co robi? – bortzmeyer