11 Mart 2014 Salı

C++ Notlarım POD

Default Initialization Nedir?
Bir değişkene değer ileride yazılacağı farz edilerek değer atanmadan yaratılması anlamına gelir. Tamamen hızlı çalışmaya yönelik bir karardır. Default initialization sonrasında değişkenin değeri belirsizdir.  Örnek :
int i;         // uninitialized
std::cin >> i; // read initial value
Default initialization kuralları aşağıda.

  • Eğer değişken bir array ise yine aynı şekilde garbage değer taşır. 
  • Eğer değişken bir sınıf ise ve default constructor'ı varsa çağırılır (bu durumda non-pod olur)
  • Eğer sınıfın default constructor'ı yoksa derleyici bir tane yaratır ve onu çağırır.
Örnek:

void default_initialization()
{
  int i;                  // default-initialize i
  std::mutex m;   // default-initialize m. m default constructor'ı olan bir sınıf
  widget w;        // default-initialize w. w default constructor'ı olmayan bir sınıf
  int a[9];           // default-initialize a
}
Aşağıda non-pod'lar için sık yapılan bir hata var.
Struct *a =new Struct;         //default initialize. Constructor çağırılımaz
Struct *a =new Struct ();     //value initialize. Constructor çağırılır

Value Initialization Nedir?
Bir değişkene ileride okuma yapılacağı farz edilerek değer atanması anlamına gelir. Pritimive tipler için C++ standardında aşağıda belirtilen başlama değeri kullanılır. Görüldüğü gibi primitive tipler için value initialization, zero initialization ile aynıdır.

int = 0, 
bool = false,
float = 0.0f,
enum = (enum type)0,
pointer
= null pointer
pointer to member
= null member pointer


POD Nedir?
POD C gibi yazılan, constructor, destructor, virtual metod gibi C++'a mahsus hiçbir şey içermeyen struct veya sınıflara verilen isimdir. Member method POD olmasına engel değildir.

POD Kontrolü
Bir tipin POD olup olmadığını is_pod kullanarak aşağıdaki gibi öğrenebiliriz.
#include <type_traits
std::is_pod <T>::value;

POD struct'ları memcpy ile kopyalamak mümkündür. Örnek:
MyStruct s;
char buf [256];
memcpy (buf,&s,sizeof(s));
MyStruct* s2 = (MyStruct)buf;
Konuyla ilgili olarak Data Alignment başlıklı yazıya göz atabilirsiniz.
Non-POD ve Initialization

Primitive Dizi ve Zero Initialization
Primitive diziler aşağıdaki gibi zero initialize edilebilir.
int array[100] = {};
Döngü ile 0 atamak veya memset yapmak arasındaki hız farkını bilmek mümkün olmayabilir.

Non-POD Value Initialization
Örnekte non-pod yapının primitive alanları value initialization ile ilklendirilir.

struct Struct {
Struct() : memberVariable() {}
int memberVariable;
};

POD Initialization
Default Initialization
Default initialization ile POD içindeki field'lar rastgele değerler ile doldurulur. Örnek:

MyPodClass instance2;//Fields are garbage
MyPodClass* instance3 = new MyPodClass;//Fields are garbage

POD ve Zero Initialization
POD'ların 0 ile doldurulması için aşağıdaki örneğe dikkat etmek gerekir.

//Struct does not have a constructor
struct X {
 int field;
}
X x; //Default initialized. Not zero initialized
X x = {}; // Zero initialized
X x = X(); // Zero initialized
X* x = new X () // Zero initialized

Pod Dizisi ve Zero Initialization
POD'lardan oluşan bir diziyi 0 ile doldurmak için memset kullanılabilir.
 
struct X {};
X myArray [10]; //array'deki elemanlar default initialize edilir
memset (myArray,0,sizeof(myArray)); //array'deki elemanlar 0 ile doldurulur

Bir başka yöntemde ise struct'a default constructor ekleniyor. Ama bu sefer yapı POD olmuyor. Sadece örnek olsun diye ekledim.
struct X {
  Test (){}//Zero Initialize all members
private:
  X (const X&);
  X& operator=(const X&);
          }

C# ve Default Initialization
C# bir sınıf içindeki field'ları constructor çağırılmadan önce default değerleri ile ilklendirir. Default değerin ne olduğu burada yazıyor. C++'takinin aksine default değerler garbage değiller. Scalar tipler için default değer 0'dır.
  • For a variable of a value-type, the default value is the same as the value computed by the value-type's default constructor (Section 4.1.1).
  • For a variable of a reference-type, the default value is null.



Hiç yorum yok:

Yorum Gönder