Czy naprawdę muszę się martwić o wyrównanie podczas korzystania z nowego operatora umieszczania?
Czytam toKiedy powinienem martwić się o wyrównanie?, ale nadal nie wiem, czy muszę się martwić, że nie zostanie wyrównany wskaźnik zwrócony przez umieszczenie nowego operatora - jak w tym przykładzie:
class A {
public:
long double a;
long long b;
A() : a(1.3), b(1234) {}
};
char buffer[64];
int main() {
// (buffer + 1) used intentionally to have wrong alignment
A* a = new (buffer + 1) A();
a->~A();
}
__alignof(A) == 4
, (buffer + 1)
nie jest wyrównane do4
. Ale wszystko działa dobrze - pełny przykład tutaj:http: //ideone.com/jBrk
Jeśli to zależy od architektury, używam: linux / powerpc / g ++ 4.x.x.
[AKTUALIZACJA] Zaraz po opublikowaniu tego pytania przeczytałem ten artykuł:http: //virtrev.blogspot.de/2010/09/memory-alignment-theory-and-c-examples.htm. Może jedyną wadą w moim przypadku byłaby utrata wydajności, to znaczy niezaangażowany koszt dostępu bardziej niż wyrównan