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

  • eisleyhead

    eisleyhead

    11 Ocak 2006
  • modica89

    modica89

    24 HAZİRAN 2007
  • Video-Tutorials.Net

    Video-Tutori

    15 Mart 2011