Forum: Ders Arası RSS
Struct boyutu
zafer #1
Üye Tem 2009 tarihinden beri · 695 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Struct boyutu
Merhaba
Aşağıdaki strict s yapısı içerisindeki elemanlara bakarak boyutun 7 olmasını beklerken sizeof metodu 8 olduğunu söylüyor.  Bu konuda bilgisi olan var mı?

import std.stdio;
import std.variant;
 
struct S
{
    int a;
    char b[3];
}
void testStruct()
{
    S s;
    s.a = 310;
    s.b[0] = 'a';
    s.b[1] = 'b';
    s.b[2] = 'c';
 
    writefln("%s %s %s", s.b[0], s.b[1], s.b[2]);
 
    writefln("a->%s, b->%s", s.a.sizeof, s.b.sizeof);
    writefln("Struct S kapladiği boyut : %s", s.sizeof);
}
 
union U
{
    int a;
    char b[3];
}
void testUnion()
{
    U u;
    u.a = 310;
    u.b[0] = 'a';
    u.b[1] = 'b';
    u.b[2] = 99;
 
    writefln("%s %s %s", u.b[0], u.b[1], u.b[2]);
 
    writefln("Union U kapladiği boyut : %s", u.sizeof);
}
 
 
void main()
{
    writeln("Struct ve Union");
 
    testStruct();
    testUnion();
}
https://github.com/zafer06 - depo
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4448 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şu anda vaktim olmadığı için soruyu tam okuyamadım ama sanırım şuradaki bilgiler yararlı olacak:

  http://ddili.org/ders/d/bellek_yonetimi.html#ix_bellek_yon…

Özellikle .offsetof'un altındaki nesneYerleşiminiYazdır() işlevi doldurma baytlarının nerede olduğunu gösteriyor.

Ali
Avatar
zekeriyadurmus #3
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Varsayılan olarak 4 bayt ve 4 baytın katlarına hizalanıyor diye biliyorum. (Windows 32 bit ortam için böyle Linuxta bilmiyorum)

Bunun sebebinini tam olarak bilmiyorum fakat bazı yerlerde hızla alakalı etkilerinin olduğu yazıyor. (bkz http://stackoverflow.com/questions/1496848/does-unaligned-…) Hatta bazı işlemcilerde hizalama yapılmayan hafıza bölgesine erişimde sorunlar yaşandığı yazıyor.

http://ddili.org/ders/d/bellek_yonetimi.html#ix_bellek_yon… adresindeki align özelliğini inceleyebilirsin.

import std.stdio;
 
align(1)
struct S
{
    int a;
    char[3] b;
}
 
 
void main(){
    writeln(S.sizeof);
}
Yukarıdaki şekilde align(1) kullanınca sizeof 7 dönecektir.

Zekeriya
Bilgi meraktan gelir...
Bu mesaj 2 defa değişti; son değiştiren: zekeriyadurmus; zaman: 2015-08-15, 14:56.
zafer #4
Üye Tem 2009 tarihinden beri · 695 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler Zekeriya, tamamdır, şimdi anladım. Sorun hizalama denen olayla ilgiliymiş. Sonuç olarak bir yapının büyüklüğünü bulmak için sizeof'a danışmak en doğrusuymuş :)

Genel olarak bu konu hakkında, hız ve yavaşlıkla ilgili durumuda anlatan güzel bir forum konusu şu adreste : http://forum.ceviz.net/c-c-13/veri-hizalama-nedir-133762/
https://github.com/zafer06 - depo
nurullahisrgan #5
Üye Ock 2015 tarihinden beri · 76 mesaj · Konum: Mardin, Nusaybin
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Kusura bakmayın, konuyu boş yere uzatmak istemzdim de align işlevi ne işe yarıyor? Sizeof işlevinin değerini neden değiştiriyor?
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4448 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yukarıda verdiğim bağlantıdaki hizalama birimi kavramı ile ilgili:

  http://ddili.org/ders/d/bellek_yonetimi.html#ix_bellek_yon…

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-08-16, 20:42:08 (UTC -07:00)