Thread overview
Struct boyutu
Aug 15, 2015
zafer
Aug 16, 2015
zafer
August 15, 2015

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();
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 15, 2015

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-memory-access-always-cause-bus-errors/1496881#1496881) 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_yonetimi.align 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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 15, 2015

Ş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_yonetimi.hizalama

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

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 17, 2015

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/

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]