SORU
11 Mart 2013, PAZARTESİ


Neden dize::return int karşılaştırmak?

Neden string::compare short char gibi daha küçük bir tip yerine bir int döndürür? Benim anlayışıma göre bu yöntem sadece -1, 0 veya 1 değerini döndürür.

İkinci bölüm, eğer ben tasarım bir karşılaştırma yöntemi karşılaştıran iki nesne tipi Foo ve ben sadece iade etmek istiyorum -1, 0 veya 1, kullanarak short char genellikle iyi bir fikir mi?

EDİT: düzeltilmiş oldum string::compare -1, 0, döndürmez ya da 1, aslında bir değer ^ verir . 0, &; 0 veya 0 lt. Çizgi adam beni tutmak için teşekkür ederiz.

Göründüğü gibi cevap kabaca, orada hiçbir neden dönmek bir türü daha küçük int çünkü dönüş değerleri vardır "rvalues" ve bu "rvalues" sakın parası olan daha küçük türü tamsayı (4 bayt). Ayrıca, birçok kişi dikkat çekti defterlerin en sistemlerdir muhtemelen olacak boyutu int her neyse, o zamandan beri bu kayıtları olacağız dolu olsun onlara 1, 2 veya 4 bayt değeri yoktur gerçek avantajı dönen daha küçük bir değer.

Hizalama, maskeleme, vb gibi küçük türleri kullanırken ekstra işlem yükü var gibi görünüyor aslında. EDİT 2: Genel kanı küçük veri türleri çok miktarda veri ile çalışırken bir dizi olduğu gibi bellek korumak için var.

Bugün bir şey öğrendim, tekrar teşekkürler çocuklar!

CEVAP
11 Mart 2013, PAZARTESİ


İlk teknik özellikleri de düşük değer döndürecektir. daha eşit ya da 0, ille -1 1daha büyük. İkinci olarak, dönüş değerleri rvalues, ayrılmaz tabi promosyon, çok küçük bir şey dönen bir anlamı yok.

DÜZENLEME:

Biraz daha bilgi rvalues ile ilgili istek başına ve integral promosyon.

C (C), her ifade ya da bir rvalue ya. lvalue. Tarihsel olarak, şartların lvalues gerçeğine bakın rvalues tek bir atama Sol tarafta görüldüğü sağda görünür. Bugün, basit bir yaklaşım için sınıfı olmayan türleri bir lvalue bellekte bir adresi vardır, bir rvalue yok. Böylece, eğer bir rvalue adresi,al ve cv-elemeleri (hangi durumu "erişim") geçerli değil. İçinde C açısından, sınıf türü yok olan bir rvalue bir saf. değer, bir nesne değil. Dönüş değeri olan bir fonksiyon. başvuru türü olmadığı sürece, rvalue,. (Non-sınıfı türleri olan kasanın içine sığacak neredeyse her zaman bir kayıt döndürülür bellek yerine, örneğin.)

Sınıf türleri için, sorunları biraz daha karmaşık, nedeniyle bunu aslındaolabilirbir rvalue üye işlevleri çağırmak. Bu rvalues aslında adresleri, thisiçin bilgi sahibi olmaları gerekir işaretçi ve cv nitelikli, cv-yeterlilik beri olabilir oynuyor aşırı çözünürlükte bir rol. Son olarak, C 11 tanıttı rvalue başvurular desteklemek amacıyla birçok yeni ayrımlar,; bu da, sınıf türleri esas olarak geçerlidir.

İntegral promosyon ayrılmaz yazdığında bu gerçeği ifade eder int bir ifadede rvalues olarak kullanılan daha küçük, en kapsamları int terfi olacak. Çok bile Bir değişken ifadesi short a, b;, a b, a b hem ayrıca daha önce int terfi ilan var oluşur. Eğer yazarsam aynı şekilde a < 0, karşılaştırma yapılır a, int dönüştürülmüş değer. Uygulamada, orada bu fark, en azından üzerinde yapan çok az vaka vardır 2. tamsayı aritmetik sarar makineleri tamamlar (yani ama çok az bir egzotik, Bugün-ben Çeşitli düşün anabilgisayar tek istisna sol). Hala, bile daha yaygın makineler:

short a = 1;
std::cout << sizeof( a ) << std::endl;
std::cout << sizeof( a   0 ) << std::endl;

farklı sonuçlar verecektir: ilk eşdeğerdir sizeof( short ) ikinci sizeof( int ) (nedeniyle integral promotion).

Bu iki konu resmen dik; rvalues ve lvalues vardır integral promosyon ile ilgisi var.Hariç... integral promosyon sadece rvalues için geçerlidir, ve çoğu (ama bütün bir rvalue neden olur kullanırsınız durumlardan integral promosyon. Bu nedenle, gerçekten bir sebep yok bir şey intdaha küçük sayısal bir değer döndürür. Hatta çok iyi olarak geri dönmek için bir sebep var bir karakter yazın. Aşırı yüklü operatörleri, <<, uslu genellikle gibi farklı karakter türleri için, bu yüzden sadece geri dönmek istiyorum karakter tip olarak karakter. (Karşılaştırma yapmalısınız fark:

char f() { return 'a'; }
std::cout << f() << std::endl;      //  displays "a"
std::cout << f()   0 << std::endl;  //  displays "97" on my machine

Fark ikinci durumda, ayrıca olmasıdır ayrılmaz bir tanıtım farklı sonuçlar ortaya çıkar, neden << aşırı seçilecek.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CMTelly

    CMTelly

    2 Mayıs 2007
  • erikbjgn's channel

    erikbjgn's c

    12 Mayıs 2008
  • NikkoNantone

    NikkoNantone

    21 Kasım 2011