SORU
13 Kasım 2011, Pazar


Ne "Bağımlı Değişken Arama" (aka ADL, ya da "Koenig Arama")?

Bağımlı arama bazı iyi açıklamalar nelerdir? Bazı insanlar da Koenig Arama de arama.

Tercihen bilmek istiyorum:

  • Neden iyi bir şey mi?
  • Neden kötü bir şey mi?
  • Nasıl çalışır?

(Not: Bu*. *27) için bir giriş olarak tasarlanmıştır

CEVAP
13 Kasım 2011, Pazar


Koenig Aramaayrıca, bilindiği gibiArgument Dependent LookupC ve Standart C derleyici çoğu bunu destekliyor.

/1 § 3.4.2 C 11 standart Devletleri:

Ne zaman postfix ifade bir işlev çağrısı (5.2.2) bir niteliksiz kimliği, başka bir ad kabul sırasında her zamanki gibi niteliksiz arama (3.4.1) olabilir araştırdım ve bu AD, AD-kapsam arkadaş işlev bildirimleri (11.3) aksi görünür görülebilir. Arama için bu değişiklikler bağımsız değişkenler (bağımsız değişken ve şablon için şablon ad türleri üzerinde bağlıdır bağımsız değişken).

Daha basit terimlerle Nicolai Josuttis Birleşik Devletleri1:

Eğer bir veya daha fazla bağımsız değişken türleri işlevi ad alanında tanımlanan fonksiyonlar için Ad nitelemek gerek yok.

Basit bir kod örneği:

namespace MyNamespace
{
    class MyClass {};
    void doSomething(MyClass);
}

MyNamespace::MyClass obj; // global object


int main()
{
    doSomething(obj); // Works Fine - MyNamespace::doSomething() is called.
}

Yukarıdaki örnekte ne var using-declaration ne using-directive ama yine de derleyici doğru tanımlar niteliksiz adı doSomething() olarak işlev olarak bildirilmemiş ad MyNamespace tarafından uygulanıyorKoenig algoritması.

Nasıl çalışır?
Algoritma derleyici sadece yerel kapsam, ama aynı zamanda bağımsız değişken türünü içeren ad bakmak için söyler. Bu nedenle, yukarıdaki kodu, derleyici nesne bulur doSomething(), 10* *Ad alanına ait fonksiyonun argümanı olan obj,. Yani, bu ad doSomething() Bildirgesi bulmak için görünüyor.

Koenig Lookup avantajı nedir?
Koenig Algoritmasının üzerinde gösterilmektedir yukarıdaki basit kod örneği olarak kolaylık sağlar ve programcı için kullanım kolaylığı. Koenig Algoritma olmadan programcı bir yükü, sürekli tam adlarını belirtmek için olacak, ya da yerine, çok sayıda bildirimleri kullanır.

Neden eleştiri Koenig Algorithm?
Koenig Algoritma üzerinde bağımlılık anlamsal sorunlara yol açtığı ve hazırlıksız programcı bazen yakalayamaz.

Örnek olarak düşününstd::swapiki değeri değiş tokuş etmek için standart bir kütüphane algoritması. Koenig algoritması bu algoritma kullanırken dikkatli olmak zorunda zira

std::swap(obj1,obj2);    

aynı davranışı gösterebilir:

using std::swap;
swap(obj1, obj2);

Fonksiyon çağrılan ADL ile, yer yer bağımsız değişken olarak geçirilen ad bağlı olacaktır.
Eğer orada var, bir ad A ve eğer A::obj1, A::obj2 & A::swap() mevcut sonra ikinci örnek içinde sonuçlanacak bir çağrı için A::swap() hangi olmayabilir ne kullanıcı istedim.

Nedense daha fazla, hem:
A::swap(A::MyClass&, A::MyClass&) std::swap(A::MyClass&, A::MyClass&) tanımlanmış, daha sonra ilk örnek std::swap(A::MyClass&, A::MyClass&) arayacak ama ikinci swap(obj1, obj2) belirsiz olurdu çünkü derlenir değil.

Trivia:
Neden Koenig Lookup deniyor?
AT&T ve Bell Labs eski araştırmacı ve programcı tarafından icat edildi çünküAndrew Koenig.


İyi Okur:

Herb Sutter's Name Lookup on GotW
Standart C 03/11 [temel.arama.argdep]: 3.4.2 bağımlı Değişken adı arama.


1Koenig Algoritma tanımı Josuttis kitabında tanımlanırC Standart Kütüphane: Öğretici ve Bir Başvuru.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BetterCoder

    BetterCoder

    17 Aralık 2012
  • tatermoog

    tatermoog

    2 AĞUSTOS 2006
  • tychoadragmire

    tychoadragmi

    20 Mart 2006