Hizalama her tür için etkili değildir. Okumak edeceğiz, o zaman
#include <stdio.h>
struct my_float {
float number;
} __attribute__((aligned(0x1000)));
struct my_float a[4] = { {1.0}, {2.0}, {3.0}, {4.0} };
int
main(void)
{
printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]);
}
Ve: Sen eylem özelliklerini görmek için bir yapıyı kullanmayı düşünmelisiniz Beklediğiniz ne
0x603000 0x604000 0x605000 0x606000
.
Düzenleme: @yzap ve aşağıdaki @Caleb Vaka yorum tarafından itilen ilk sorun GCC sürümü sadece kaynaklanmaktadır. Ben istek sahibinin kaynak koduyla GCC 4.4.1 vs GCC 3.4.6 kontrol ettim:
$ ./test_orig-3.4.6
0x7fffe217d200 0x7fffe217d204 0x7fffe217d208 0x7fffe217d20c
$ ./test_orig-4.4.1
0x7fff81db9000 0x7fff81db9004 0x7fff81db9008 0x7fff81db900c
O eski GCC sürümleri (bir yere 4.4.1 öncesi) hizalama patolojileri gösteren şimdi ortada.
Not 1: Önerilen kodum, "dizinin her alanını hizalama" olarak anladığım soruyu yanıtlamıyor.
Not 2: Statik olmayan a [] 'ı ana()' ye getirmek ve GCC 3.4.6 ile derlemek, struct dizisinin hizalama yönergesini kırar ancak struct'ler arasında 0x1000 mesafesini korur ... hala kötü! (bkz. geçici çözümler için yanıtla)
+1 doğru yanıt. Alternatif bir çözüm, yerel diziyi statik yapmaktır. Yığındaki hizalama her zaman bir problemdir ve kaçınmaktan kaçınmak en iyisidir. –
Oh evet, onu statik yapmayı düşünmedim. Bu isim çarpışmasını önlediği için iyi bir fikir. Cevabımı düzenleyeceğim. – Zifre
Statik hale getirilmesinin, aynı zamanda reentran olmayan ve iplik olmayan güvenli olmasını da sağladığını unutmayın. – ArchaeaSoftware