Linia kod jest wart tysiąca słów :) Oto mój problem:C++ wyrównanie pamięć pytanie
/* Platform specific 16-byte alignment macro switch.
On Visual C++ it would substitute __declspec(align(16)).
On GCC it substitutes __attribute__((aligned (16))).
*/
#define ALIGN_16 ...
struct ALIGN_16 A {...};
A* ptr = new A;
A* ptr2 = new A[20];
assert(size_t(ptr) % 16 == 0);
for (int i=0; i<20; ++i)
assert(size_t(ptr2+i) % 16 == 0);
assert(sizeof(A) % 16 == 0);
mogę się spodziewać, że wszystkie twierdzenia przejść na platformach z obsługą SSE? Dziękuję Ci.
EDYCJA. Częściowa odpowiedź. Zrobiłem test z VS2008, GCC i ICC. Kompilator MS wyrównał zarówno ptr i ptr2, ale GCC i ICC nie udało się wyrównać ptr2.
Dlaczego tablicą 20 Tak jak? – John
Po prostu z mojej głowy. Błąkałem się, jeśli każdy element tablicy jest wyrównany. – watson1180
Elementy poprawnie przydzielonej macierzy są gwarantowane przez standard, aby być odpowiednio wyrównane dla danego typu. To wyrównanie jest jednak szczegółem implementacji i teoretycznie może być jednym bajtem (to jest wyrównaniem spakowanym). –