C & C++ Dinamik Bellek Yönetimi & Extern C Bildirimi


#1
  * {
    font-family: Georgia, Cambria, "Times New Roman", Times, serif;
  }
  html, body {
    margin: 0;
    padding: 0;
  }
  h1 {
    font-size: 50px;
    margin-bottom: 17px;
    color: #333;
  }
  h2 {
    font-size: 24px;
    line-height: 1.6;
    margin: 30px 0 0 0;
    margin-bottom: 18px;
    margin-top: 33px;
    color: #333;
  }
  h3 {
    font-size: 30px;
    margin: 10px 0 20px 0;
    color: #333;
  }
  header {
    width: 640px;
    margin: auto;
  }
  section {
    width: 640px;
    margin: auto;
  }
  section p {
    margin-bottom: 27px;
    font-size: 20px;
    line-height: 1.6;
    color: #333;
  }
  section img {
    max-width: 640px;
  }
  footer {
    padding: 0 20px;
    margin: 50px 0;
    text-align: center;
    font-size: 12px;
  }
  .aspectRatioPlaceholder {
    max-width: auto !important;
    max-height: auto !important;
  }
  .aspectRatioPlaceholder-fill {
    padding-bottom: 0 !important;
  }
  header,
  section[data-field=subtitle] {
    display: none;
  }
  </style></head><body>

C & C++ Dinamik Bellek Yönetimi & Extern C Bildirimi

Bu konuda fazla derine inmeden c dilinden c++ diline geçerken dinamik bellek yönetiminde bizi bekleyen bazı değişikliklerden bahsetmek istiyorum. Aynı zaman da extern c bildirimi ve interface tasarımı ile ilgili birkaç noktaya değinmek istiyorum.

~> C dilinde stdlib kütüphanesinde ki fonksiyonları kullanıyorduk.. (malloc, alloc vs.)

~> C++ dilinde bunlara gerek kalmayacak. Yeni operatörlerimiz var ismi new olan operatörler ve ismi delete olan operatörler…

~> new operatörler nesneyi hataya getirir.

~> delete dinamik nesnelerin hayatını sonlandırır.

~> malloc hayat başlatmıyor sadece yer ayırıyor. new nesneyi hayata getiriyor,(initialize etme, yazma)

~> Bellekte bir nesnenin yerinin olması onu aslında nesne yapmıyor, storage nesnenin gerek şartı ama yeter şartı değil


NEDEN ?
~> Primitive türler olduğunda şu değişkene bir veri atarım diyebiliriz fakat sınıf olduğunda olay bu kadar basit olmayacak. O bellek alanın kullanılabilir bir hale getirilmesi için birçok şey yapılacak(kaynaklar edinilecek vs vs)

~> Yer elde etmek başka birşey, elde edilen yerde bir nesneyi hayata getirmek başka birşey

~> Bellekte yeri olmayan nesneden bahsetmek mümkün değil

~> new operatörünün 4–5 biçimi var, biz şimdilik 2 biçiminde bahsedeceğiz

~> Primitive türlerden örnek
new int → int türden bir dinamik nesneyi hayata başlatıyorum

new intdelete

~> auto keywordu tanıttığı ismi, ilk değer vereceğimiz ifadenin türü yapar

~> memory leak ile resource leak birbirne karıştırmamak gerek

~> memory leak → bellek sızıntısı, resource → kaynak sızıntısı

~> İşimiz bittikten sonra nesneleri delete etmemiz gerekiyor. Etmezsek bellek sızıntısı olur, birçok userdefined tür için de kaynak sızıntı işi olur


Basitçe arka planda ne oluyor ?

~> new operatörü 2 işi birden yapıyor (derleyicinin oluşturduğu kodda)

~> Hayata gelen nesne için bellek alan gerekiyor. sizeof_t kadar. Arka planda bunu operator new isimli fonksiyona yaptırıyor

~> new operatörü ile operator new fonksiyonu (karıştırılmamalı)

~> operator fonksiyonları, isimlerinin doğal parçası operator… Ornek toplama operatörü ise operator+ gibi.

~> operator new, malloc un parametrik yapısının aynısı.


C++ Niye malloc Kullanılmamış?

~>Çünkü exception handling için


~> new operatörü bellek elde etmek dışında, sınıf nesnelerinin hayata gelmesi için gerekli olan constructor fonksiyonunu çağrıyor

~> delete ise destructor ı çağırır, operator delete kullanır

~> C++ dilinde default olarak garbage collector olmaması sonucunda delete operatörü var, biz de hazır bir garbage collector yok,

~> Dinamik nesne oluşturma ile, dinamik nesnelerden oluşan bir liste oluşturma sentaksi farklıdır

operator

~> C++ 11 öncesi [] ile hayata getirilen primitive türlere ilk değer vermek yoktu, C++11 ile {} initializer list geldi.

initializer list

~> Nesneleri kısmen öldürmek gibi birşey söz konusu değil, toplu halde bildirim, toplu halde hayat bitirme


CC++

Not: endl alt satıra geçirmekten baska bufferı flush eder.
http://www.cplusplus.com/reference/ostream/endl/


Extern C Bildirimi

~> C++ programcısı C++ kaynak dosyasında C de derlenmiş bir dosyayı çağırıyor. Mesela C dilinde yazdığımız bir isprime fonksiyonunu derledim ve sonra C++ projesi oluşturuyorum. Compile time da sorun yok ama runtime da problem oluyor. Bu linkera bağlı bir problem

~> C dilinde function overloading yok. C dilinde function overloading olmadığı için C de derleyiciler dışsal referans olarak bir fonksiyona atıfta bulunduklarında(bir fonksiyon inline değil ise derleyici object koda fonk çağırıldığına yönelik bir isim yazıyor özel bir notasyonla… linker için yazıyor).

~> C derleyicileri bir fonksiyon çağrısını dışsal referansa dönüştürdüklerinde sadece fonksiyon isminden haraketle bir fonksiyon oluşturuyorlar.

~> C++ derleyicileri linkera overloadlardan hangisini çağırdığını anlamaları için parametrelerin türleri ve sayısını belirten bir notasyonda kullanmak zorunda

~> Bu problem, derleyiciye anlatmamız gerekiyor, bu bildirime extern c bildirimi deniyor. Bunun amacı bu fonksiyon C dilinde derlenmiştir, bu fonksiyona yapılan çağrıyı C nin notasyonuyla yaz, derleyici bulsun demek.

Extern C Bildirimi

C++ Interface Tasarımı Hakkında

~> Client ın ihtiyaç duymuyacağı bir ismi header dosyasına koymayın. Tasarım her zaman dıştan içe doğru yapılır.(interface tasarımı)

~> Önce başlık dosyası, sonra cpp (önce interface, sonra implemantasyon)

~> Tasarım dışardan içeriye olucak, interface ten → implemantasyon a

Kaynak: https://goo.gl/AeDU01