25 Ocak 2017 Çarşamba

auto değişken

auto Kelimesi Nereden Geliyor?
auto kelimesi aslında C dilinden beri var ve zaten de oradan geliyor. Ancak anlamı ve kullanımı çok daha farklı. 

Bu kelime C dilinin atası olan B dilindeki kodların değişikliğe uğramadan C diline aktarılabilmesi için kullanılıyordu. B dilinde auto değişkenin açıklaması şöyle
The keyword was inherited from B.

B was a programming language with no type system at all: every variable held a machine word (corresponding to the int type in C), and the type of each value was determined by the operation performed. Since there was no type to specify for variables, the only thing to declare about a variable was its storage class; unlike in C, the default in B corresponded to C’s static, i.e. a variable that existed for the duration of the whole program’s run time. Thus the auto keyword was included to denote automatic variables, which existed only for the duration of a single function call. The term automatic itself came from PL/I, from which B also borrowed the /* ... */ comment syntax.
Örneğim elimizde şöyle bir B kodu olsun. Bu kodda auto kelimesi görülebilir. C dili de bu kodu auto anahtar kelimesine sahip olduğu için derleyebiliyordu.  
add(a, b) {
  auto ret;
  ret = a + b;
  return ret;
}
Yani C dilinde auto kelimesi automatic storage anlamına geliyordu. Fakat yerel değişkenler zaten automatic storage kullandığı için aslında bir etkisi yoktu.

C++ bu kelimeyi tekrar ele alarak yeni bir anlam kazandırıyor

C++ auto değişken
Değişkenin tipini belirtmeden derleyicinin belirlemesi sağlanır. auto type inference (tip çıkarımı) kullanır. Type inference C#'ta "var" anahtar kelimesi ile sağlanır ve C++'taki auto ile aynı işlevi görür. Açıklaması şöyle
Once the type of the initializer has been determined, the compiler determines the type that will replace the keyword auto using the rules for template argument deduction from a function call.
auto metod
Şöyle yaparız.
auto foo(int bar)
{
  return 0;
}
Şöyle yaparız.
struct Foo
{
  static auto foo(int bar)
  {
    return 0;
  }
};
const ve auto
auto gerekirse const ile kullanılabilir. Eğer const olmasaydı b'nin tipi int* olacaktı. const kullanarak b'nin tipini const int* haline getirdik.
int a = 10;
const auto b = &a; //0x9ffe34
static type system
C++ auto değişkenler yüzünden "static type system" özelliğini kaybetmez.
"auto" ve "auto *" şeklinde kullanmak için şöyle yaparız
#include <iostream>

const char* f()
{
  return "Hello";
}

int main()
{
  auto  s1 = f();
  auto* s2 = f();

  std::cout << s1 << std::endl;
  std::cout << s2 << std::endl;

  return 0;
}
auto ve STL
Auto kullanımının kodun okunurluğunu azalttığını söyleyenler de var. Ancak ben bu fikre katılmıyorum. Özellikle STL template kullanımında kod çok karmaşık hale gelebiliyor.
someWeirdTemplate<someOtherVeryLongNameType, ...>::someOtherLongType x = GetX();
şeklinde yazmaktansa
auto x = GetX();
şeklinde yazmak çok daha okunaklı.

auto kodu hızlandırır mı ?
Normalde hızlandırmaz. Ancak bazen derleyici verimsiz kod üretebiliyor ve biz de farkında olmuyoruz. 
Örnek - silent implicit conversions
Şu kod derlenir ve çalışır
std::map<Key, Val> m;
// ...

for (std::pair<Key, Val> const& item : m) {
  // do stuff
}
Açıklaması şöyle
Here we are, thinking we're elegantly taking every item in the map by const reference and using the new range-for expression to make our intent clear, but actually we're copying every element. This is because std::map<Key, Val>::value_type is std::pair<const Key, Val>, not std::pair<Key, Val>
Yani kod verimsiz. Aslında şöyle yazılması gerekiyordu
for (std::pair<const Key, Val> const& item : m) {
    // do stuff
}
const Key yazılmadığı için her eleman önce geçici bir değişkene kopyalanıyor ve geçici değişkene const ref alınıyor. Yani kod aslında altta şuna benziyor.
std::pair<Key, Val> __tmp = *iter;       // construct a temporary
std::pair<Key, Val> const& item = __tmp; // then, take a reference to it
Eğer auto kullansaydık yani şöyle yazsaydık
for (auto const& item : m) {
    // do stuff
}
Bu hata yapılmazdı ve dolaylı olarak kod hızlanırdı.







Hiç yorum yok:

Yorum Gönder