2010-08-26 18 views
33

Benim anlayış C++ reinterpret_cast ve C işaretçi döküm adil bir derleme zamanı işlevselliği olmasıdır ve hiç performans maliyetine sahip olduğunu mal oldu.reinterpret_cast dökme

Bu doğru mu?

cevap

49

Başlamak için iyi bir varsayım. Bununla birlikte, en iyileştirici, reinterpret_cast<> veya C işaretleme kalıbı varlığında üstlenebileceği şekilde kısıtlanabilir. Daha sonra, dökümün kendisiyle ilişkili bir talimatı olmamasına rağmen, sonuçta ortaya çıkan kod daha yavaştır. Eğer bir işaretçi bir int döküm halinde

Örneğin, iyileştirici büyük olasılıkla bu işaretçi işaret ne olabilir hiçbir fikrim yok olacaktır. Sonuç olarak, muhtemelen bu işaretçiden bir yazının herhangi bir değişkeni değiştirebileceğini varsaymak zorundadır. Bu, yazmaçlardaki değişkenleri depolamak gibi çok yaygın optimizasyonları yener.

+1

"Bu doğru mu?" Sorusu için verdiğiniz yanıt "genelde değil" diye düşünmüyorum. –

+0

@Rob Kennedy: Eh, evet. Yeniden sayılır. Bu cevap için – MSalters

+1

çok teşekkür ederim. Belki bu durumda kayıt anahtar kelimesi ile GCC'ye ipucu verebilir (!?). – fulmicoton

0

Evet, bu doğru. Çalışma zamanı maliyetine sahip döküm türü dynamic_cast'dir.

+2

'static_cast' çalışma zamanı maliyetine de sahip olabilir; genellikle sadece tek bir işaretçi ayarı veya bir türden diğerine (örneğin, bir "float" içine "int" gibi) kod yazılmasına rağmen –

+0

Won't 'static_cast' de kullanıcı tanımlı dönüşümleri çağırır mı? Çalışma zamanı maliyeti sınırsızdır. –

+0

Sağ, static_cast, type (pointer değil) dönüşüm durumunda çalışma zamanı maliyetine sahiptir. Benim amacım, dynamic_cast'in C dökümüne göreceli olarak ek çalışma zamanı maliyetine sahip tek döküm tipidir. –

5

Doğru. Ekleyebildiğim yeni genişlikteki talimatların yerine getirilmesinde performansta herhangi bir kazanç/kayıp haricinde hiçbir maliyet nadir durumlarda yalnızca bir endişe kaynağıdır. Duyduğum her platformda işaretçiler arasında döküm yapmak sıfır maliyete ve hiçbir performans değişikliğine sahip değil.

0

Haklısın, ama bir düşün: reinterpret_cast belki kötü bir tasarım anlamına gelir ya da çok düşük düzeyde bir şey yaptığımızı. Zamanında bir arama tablosu görünmek zorunda çünkü

dinamik döküm bunun yerine, size bir şey mal olacak.

+0

'dynamic_cast'," reinterpret_cast "yerine çalışma zamanı denetimi ile" static_cast' "e daha yakındır. "ReinterpreT_cast" ile polimorfik türler atayamazsınız. –

+1

@Billy ONeal: Polimorfik olarak farkında değilsiniz. –

0

reinterpret_cast çalışma zamanı maliyetine neden olmaz. Ancak, dikkatli olmanız gerekir, çünkü her kullanımda reinterpret_cast tanımlanmıştır. Örneğin, char dizisini bir int dizisi olarak yeniden yorumlamak mümkün olabilir, çünkü hedef mimarinin bir kesme atamasına neden olabilir, çünkü farklı türlerde farklı hizalama kuralları olabilir.

ilk doğru alın, sonra da verimlilik dert.

4

C++ biçimindeki C stilleri, önce static_cast'i çalıştıracak ve yalnızca statik bir cast gerçekleştirilemiyorsa reinterpret_cast gerçekleştirecektir. Bir static_cast, çoklu kalıtım durumunda işaretçinin değerini değiştirebilir (veya bir arabirimi bir beton türüne dökerken), bu ofset hesaplaması, fazladan bir makine talimatı içerebilir. Bu en çok 1 makine talimatı olacak, bu yüzden gerçekten çok küçük.

İlgili konular