Aşağıdaki yapıyı düşünün:
struct s {
int a, b;
};
Tipik olarak 1 , bu yapı 8 ebatına ve 4 hizalamasına sahip olacaktır.
Ya iki struct s
nesne yaratırsak (daha kesin olarak, tahsis edilen depoya bu tür iki nesneyi yazarız), ikinci nesne birinciyle çakışırsa?
char *storage = malloc(3 * sizeof(struct s));
struct s *o1 = (struct s *)storage; // offset 0
struct s *o2 = (struct s *)(storage + alignof(struct s)); // offset 4
// now, o2 points half way into o1
*o1 = (struct s){1, 2};
*o2 = (struct s){3, 4};
printf("o2.a=%d\n", o2->a);
printf("o2.b=%d\n", o2->b);
printf("o1.a=%d\n", o1->a);
printf("o1.b=%d\n", o1->b);
Bu program hakkında tanımlanmamış bir davranış var mı? Öyleyse, nerede tanımsız hale geliyor? UB değilse, aşağıdakilerin her zaman yazdırılması garanti edilir:
o2.a=3
o2.b=4
o1.a=1
o1.b=3
Özellikle, örtüştüğü nesneye o1
ne zaman o2
, hangi örtüşmeyle yazıldığını bilmek istiyorum . Açılmamış parçaya ( o1->a
) erişmeye hala izin var mı ? Hızlandırılmış bölüme erişim, erişim ile o1->b
aynı o2->a
mıdır?
Etkili tip burada nasıl uygulanır? Kurallar, son mağaza ile aynı konuma işaret eden çakışmayan nesneler ve işaretçiler hakkında konuşurken yeterince açıktır, ancak nesnelerin veya üst üste binen nesnelerin etkili türü hakkında konuşmaya başladığınızda, bu daha az açıktır.
İkinci yazı farklı tipteyse bir şey değişebilir mi? Üyeler söylendi int
ve short
iki int
s yerine ?
Burada onunla oynamak istiyorsanız bir vaftiz babası .
1 Bu yanıt, durumun böyle olmadığı platformlar için de geçerlidir: örneğin, bazılarının boyutu 4 ve hizalama 2 olabilir. Boyut ve hizalamanın aynı olduğu bir platformda, bu soru hizalanmış, çakışan nesneler olacağı için geçerli olmaz imkansız ol, ama böyle bir platform olup olmadığından emin değilim.