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 :
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.
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.
POD struct'ları memcpy ile kopyalamak mümkündür. Örnek:
Non-POD ve Initialization
Primitive Dizi ve Zero Initialization
Primitive diziler aşağıdaki gibi zero initialize edilebilir.
Non-POD Value Initialization
Örnekte non-pod yapının primitive alanları value initialization ile ilklendirilir.
POD Initialization
Default Initialization
Default initialization ile POD içindeki field'lar rastgele değerler ile doldurulur. Örnek:
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.
Bir başka yöntemde ise struct'a default constructor ekleniyor. Ama bu sefer yapı POD olmuyor. Sadece örnek olsun diye ekledim.
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.
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; // uninitializedDefault initialization kuralları aşağıda.
std::cin >> i; // read initial value
- 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()Aşağıda non-pod'lar için sık yapılan bir hata var.
{
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
}
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;Konuyla ilgili olarak Data Alignment başlıklı yazıya göz atabilirsiniz.
char buf [256];
memcpy (buf,&s,sizeof(s));
MyStruct* s2 = (MyStruct)buf;
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