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?
ah! To ma sens. –