SORU
4 Aralık 2009, Cuma


Neden bir performans dökme " ifadesini bool için bir uyarı yok?

Extends.

Gibi bir şey yaptım: cool olduğumu düşünüyorum

bool hasParent()
{
  return this->parentNode ;
}

(Bool) bir döküm bile, bu uyarı hala geçmiyor.

Bu->parentNode üst düğüm vardır hiçbir zaman BOŞ değildir.

Ama alıyorum:

warning C4800: 'Node *' : forcing value to bool 'true' or 'false' (performance warning)

Bu sorunun ne ahbap? Neden böyle bir performans uyarı mı? Daha verimli gibi bir şey yazmak olacağını düşündüm:


bool hasParent()
{
  if( this->parentNode )
    return true ;
  else
    return false ;
}

Ama ikinci versiyonu hiçbir uyarı oluşturur ve derleyici çok daha mutlu görünüyor. Daha hızlı olmasına rağmen?

CEVAP
4 Aralık 2009, Cuma


Microsoft bu konuda Bağlayın (http://stackoverflow.com/questions/206564/what-is-the-performance-implication-of-converting-to-bool-in-c) bir tartışma var. Bu örnek, Microsoft verilir:

$ cat -n t.cpp && cl -c -W3 -O2 -nologo -Fa t.cpp
1 bool f1 (int i)
2 {
3 return i & 2;
4 }
5
6 bool f2 (int i)
7 {
8 const bool b = i & 2;
9 return b;
10 }
11
12 bool f3 (int i)
13 {
14 const bool b = 0 != (i & 2);
15 return b;
16 }
t.cpp
t.cpp(3) : warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)
t.cpp(8) : warning C4800: 'int' : forcing value to bool 'true' or 'false' (performance warning)

Ve Microsoft'un cevabı (geliştirici uyarı için sorumlu)

Bu uyarı şaşırtıcı derecede yararlı ve benim kodunda bir hata daha dün bulundu. Martin "performans" bağlam. uyarı alıyor sanırım

Hakkında üretilen kod değil, ya da programcı int bir değeri değiştirmek için bir niyet ifade etmiş olup olmadığı hakkında bool. Bunun için bir ceza var ve kullanıcı "" "sürekli (ya da daha çok tersi) önlemek için" "codegen. boolifying bool" yerine int kullanmak için seçim var Uyarı açıkça int -^ kabul etmeye niyeti işaret ediyor çünkü üçüncü durumda aşağıda bastırılmış . bool geçiş.

Eski bir uyarıdır, ve amacı daha uzun olabilir, ama burada tasarlanmış gibi davranıyor

Yani temel olarak MS geliştirici gibi görünüyor söyleyerek istiyorsanız, 'dökme' int bool yapman gereken daha düzgün yap şunu kullanarak "return this->parentNode != 0" yerine bir örtülü veya açık dökme.

Şahsen, uyarı çıkarır ne hakkında daha fazla bilmek istiyorum. Bu uyarı değeri pek olmaz bence.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Derek Banas

    Derek Banas

    12 AĞUSTOS 2008
  • huyked

    huyked

    28 Mart 2008
  • Sam Kear

    Sam Kear

    14 Temmuz 2007