2016-03-22 23 views
3

Bazı AOSP kod bakarak oldum ve ben bu gibi aramalar kullanılırReinterpet_cast'de neden sayısal bir değer kullanıyorsunuz?

#define OFFSETOF_MEMBER(t, f) \ 
    (reinterpret_cast<const char*>(&reinterpret_cast<t*>(16)->f) - reinterpret_cast<const char*>(16)) // NOLINT 

(sanat/çalışma zamanı/baz/macros.h altında, bir 5.0+ daldan) bu rastladım:

MemberOffset(OFFSETOF_MEMBER(Class, dex_cache)); 

Sınıf bir sınıf ve dex_cache bu sınıfın üyesidir. Bu, alanın ofsetini döndürür ve daha sonra bir MemberOffset sınıfının kurucusu olarak kullanılır.

Benim sorum, yeryüzünde oradaki "16" nı niçin kodlamak istersiniz? Üyenin adresini almak ve sınıfın temel adresini çıkarmak daha mantıklı olmaz mıydı?

+0

Bu "deneme ve hata programlaması" dır ... Muhtemelen birisi 16 yerine 0 kullanmanın kötü olduğunu duydu, böylece farklı bir sayı koyma ve işe yarayıp yaramadığına dair parlak fikirleri vardı. Belki bazı mimarilerde çalışır. –

+0

Not * burada * bir sınıfın bir üyesinin adresi veya adresi yok, çünkü bellekte * nesne yok * - makronun ilk argümanı bir * sınıf * adıdır, bir * nesne değildir *. Bu yüzden, önerilen "düzeltmek" aslında mümkün olmaz. Bunun nedeninin '16' ve '0' değil '0' olduğunu (statik olarak kanıtlanabilir) 'nullptr' olduğunu düşünüyorum ve bu nedenle derleme başarısız olabilir. –

+0

Ayrıca, anladığım kadarıyla, modern bir derleyici ile, 'std :: declval' bu tür bir hileyi gereksiz hale getirmelidir. Bu [aslında bu şekilde uygulanmadı] (http://stackoverflow.com/q/14657092/1858225), ama yakın olabileceğini hayal ediyorum. –

cevap

2

Sınıfın temel adresini kaldıramazsınız. Nesnenin temel adresi için bunu yapabilirsin, ama hiç yok. Dolayısıyla makro, 16 adresini bu temel adrese dönüştürür.

Neden değil? Lint şikayet ederdi. Neden 1 değil? Yapı hizalama problemleri.

+0

İyi nokta. Aslında bir nesne kullanmadıklarını ve sadece bir decltype almaya çalıştıklarını özledim. – Maxthecat

İlgili konular