2013-04-05 15 views
11

Czytam N3485 C++ Standardowy projekt i w części dotyczącej dostosowania, stwierdza co następuje:C++ wyrównanie - surowe i słaby

3.11 Wyrównanie [basic.align]

1. .. Wyrównanie jest wartością całkowitą zdefiniowaną przez implementację reprezentującą liczbę bajtów między kolejnymi adresami, na które można przydzielić dany obiekt. Typ obiektu nakłada wymóg wyrównania na każdy obiekt tego typu; Ostrzejsze wyrównanie można zamówić za pomocą specyfikatora wyrównania (7.6.2).

Tutaj stwierdza, czym jest wyrównanie, a ja to rozumiem. Oznacza to, że jeśli posiadasz system 32-bitowy (4-bajtowy), będzie on odczytywał w 4-bajtowych porcjach w tym samym czasie, więc powinieneś umieszczać rzeczy w pamięci na 4-bajtowych adresach offsetowych. Wiele z tego jest obsługiwanych przez dobry kompilator, jednak C++ pozwala ci również wyrazić swoje zdanie.

Specyfikator wyrównania, o którym mówi, to alignas.

można przekazać liczbę całkowitą do alignas określić swoje wymagania wyrównania lub typ jak alignas(double)

Teraz masz słaby lub ścisłe dopasowanie, który jest określony jako co następuje:

5 trasowania Mają zlecenie od słabsze na mocniejsze lub bardziej rygorystyczne linie trasowania . Ostrzejsze linie trasowania mają większe wartości wyrównania. Adres spełniający wymagania dotyczące wyrównania spełnia także wszelkie słabsze wymagania dotyczące wyrównania.

7 Porównywanie wyrównania ma sens i stanowi oczywiste wyniki:

- Dwa wyrównania są równe kiedy ich wartości liczbowe są równe.

- Dwa wyrównania są różne, gdy ich wartości liczbowe nie są równe.

- Gdy wyrównanie jest większe niż inne, oznacza to bardziej wyrównane wyrównanie.

Tutaj stwierdza się, że ściślejsze ustawienie jest większe. Czy to oznacza, że ​​alignas(8) jest bardziej restrykcyjne niż alignas(4)? W systemie 32-bitowym (4-bajtowym) wersja 8 oznaczałaby, że typ: int wymagałby dwóch odczytów zamiast jednego, a drugiego tylko dopełnienia. Czy ścisłe odniesienie do faktu, że nakłada potencjalny narzut na procesor, gdy wyrównanie jest "niewłaściwie używane", jak w tym głupim przykładzie?

Zdaję sobie sprawę, że nie wszystkie wyrównania są ważne w danym systemie i że przedłużone wyrównania muszą być ważne, aby uzyskać prawidłowe zachowanie.

Wyrównanie polega na umożliwieniu procesorowi dostępu do danych pamięci w porcjach rozmiaru słowa, co jest najbardziej optymalnym sposobem na pobieranie i zapisywanie danych do i z pamięci przez procesor.

To ścisłe dopasowanie, jak rozumiem, może potencjalnie zrujnować to. Czy się mylę? Czym jest ścisłe wyrównanie względem słabego wyrównania?

Odpowiedz

8

Określenie "ścisły" odnosi się jedynie do faktu, że większe wartości wyrównania są bardziej restrykcyjne pod względem możliwych adresów.

Występuje tylko połowa poprawnych adresów dla wyrównania 8, ponieważ są one dla wyrównania 4, więc typ z wyrównaniem 8 jest bardziej ograniczony w odniesieniu do miejsca, w którym można go umieścić.

+0

ah! To ma sens. –