2014-12-17 22 views
8

Próbuję użyć alignas dla wskaźników, które są członkami klasy, i szczerze mówiąc nie jestem pewien, gdzie mam go umieścić.Zmaganie z alignas Składnia

na przykład:

class A 
{ 
private: 
    int n; 
    alignas(64) double* ptr;  

public: 
    A(const int num) : n(num), ptr(new double[num]) 
    {} 
}; 

które nadzieję zapewnić dane PTR był ustawiony w bloku 64 bajtów. Użycie kompilatora Intel nie powoduje.

Czy ktoś może wskazać mi właściwy kierunek, proszę?

+5

Wygląda na to, że pracuję dla mnie (http://rextester.com/LCVUW98273) (zwróć uwagę na zbyt duży rozmiar litery "A"). A może masz nadzieję, że dane "ptr" wskazują ** na **, będą zbyt wyrównane? To wymagałoby naruszenia związku przyczynowego. –

+0

Może Twój kompilator nie obsługuje wyrównania 64? – Brian

+0

Dzięki Igor, to pokazuje źródło mojego nieporozumienia. Wskaźnik jest wyrównany, a nie dane, do których wskazuje. Miałem nadzieję, że blok danych zostanie wyrównany. – user1683586

Odpowiedz

5

Użycie słowa kluczowego na elemencie klasy powoduje, że ten element zostanie wyrównany zgodnie z określonym wyrównaniem, a nie żadna jednostka potencjalnie wskazana. Wszakże podczas inicjowania wskaźnika o wartości nie ma kontroli wyrównania już istniejących obiektów.

Czasami warto spojrzeć na std::align() który trwa

  1. specyfikację dla dostosowania zwróconego wskaźnika.
  2. Rozmiar wyrównanego bloku.
  3. Wskaźnik do przydzielonej pamięci.
  4. Ilość przydzielonej pamięci.

Zwraca odpowiednio wyrównany wskaźnik, chyba że nie ma wystarczającej ilości miejsca, aby spełnić wymagania dotyczące wyrównania i rozmiaru. Jeśli nie ma wystarczającej ilości miejsca, funkcja zwraca wskaźnik zerowy.

+0

Zamieniając 'ptr = x;' na 'ptr = decltype (ptr) (x & ~ uintptr_t (64-1));' gwarantowałoby wyrównanie ptr na 64 bajtowych granicach. W każdym razie niezbyt dobrze. – Yakk

+0

@Yakk: Myślę, że najlepiej jest użyć 'std :: align()'. To, co robi implementacja, aby odpowiednio wyrównać ponter jest entirly aż do realizacji. Ponieważ twoje podejście może zakłócać pamięć - na początku wskaźnika, prawdopodobnie najpierw zrównoważysz wskaźnik odpowiednią ilością. –

+0

Myślę, że prawdziwym problemem z moim "rozwiązaniem" jest to, że odszedłem i zmodyfikowałem wskaźnik niedobrze. Wskaźnik jest wyrównany, ale nie wskazuje na nic użytecznego. – Yakk