Uint_fast32_t nedir ve neden normal int ve uint32_t yerine kullanılmalıdır?


110

Öyleyse, typedefilkel veri türlerinin nedeni , düşük seviyeli gösterimi soyutlamak ve anlaşılmasını kolaylaştırmaktır ( 8 bayt olan tür uint64_tyerine long long).

Ancak, orada uint_fast32_taynı olan typedefşekilde uint32_t. "Hızlı" sürümü kullanmak programı daha hızlı hale getirir mi?


uzun uzun belki 8 bayt değildir, 1 baytlık (CHAR_BIT en az 64 olması durumunda) veya 3738383 baytlık uzun bir uzunluğa sahip olmak mümkündür. ayrıca uint64_t 1,2,4 veya 8 bayt olabilir, bunun için CHAR_BIT 64, 3, 16 veya 8 olmalıdır.
12431234123412341234123

Yanıtlar:


135
  • intbazı platformlarda 16 bit kadar küçük olabilir. Başvurunuz için yeterli olmayabilir.
  • uint32_tvarlığı garanti edilmez. typedefTam olarak 32 bitlik işaretsiz bir tam sayı türüne sahipse, uygulamanın sağlaması isteğe bağlı bir özelliktir. Örneğin bazılarının 9 bitlik baytları vardır, bu yüzden bir uint32_t.
  • uint_fast32_tniyetinizi açıkça belirtir: performans açısından en iyisi olan en az 32 bitlik bir türdür . uint_fast32_taslında 64 bit uzunluğunda olabilir. Uygulamaya kalmış.

... uint_fast32_tile aynı yazı tipine sahip olan var uint32_t...

Baktığınız şey standart değil. Bu belirli bir uygulamadır (BlackBerry). Yani oradan uint_fast32_ther zaman aynı olanı çıkaramazsınız uint32_t.

Ayrıca bakınız:


36
İyi cevap. Tamlık için, farkı da gösterebiliriz uint_least32_t, bu, uint_fast32_thızdan ziyade daha küçük mağazayı tercih etmesi dışında aynıdır .
Damon

2
Genişliği en az 32 bit olan en hızlı tam sayı neden 32 bitten büyük olsun? Her zaman daha az bit varsa, CPU'nun üzerinde çalışması gereken daha az bit olacağını ve dolayısıyla daha hızlı olacağını düşündüm. Burada neyi özlüyorum?
Shane Hsu

12
@ShaneHsu: 64 bitlik bir işlemcinin 64 bitlik bir yaza sahip olacağını söyleyin, bu da 64 bit sayıları bir döngüde toplar. Tek yapmak istediğinizin 32 bitlik sayılar üzerinde çalışmak olması önemli değil, bu bir döngüden daha hızlı olmayacak. Şimdi, x86 / amd64'te böyle olmasa da, 32 bitlik tamsayılar adreslenebilir bile olmayabilir. Böyle bir durumda, bunlar üzerinde çalışmak, 32 biti, örneğin 64 bit hizalanmış birimlerden çıkarmak için ek işlemler gerektirir. Bağlantılı soruya da bakın. C ++ standardı, 37 bitlik sözcüklere sahip bir makinede çalışabilmesi için yazılmıştır ... yani orada hiçbir 32 bit türü yoktur.
Yakov Galka

42

Aradaki fark, kesinlik ve kullanılabilirliğinde yatmaktadır.

Buradaki doktor diyor ki:

Sırasıyla tam olarak 8, 16, 32 ve 64 bit genişliğinde işaretsiz tamsayı türü ( yalnızca uygulama doğrudan türü destekliyorsa sağlanır ):

uint8_t
uint16_t
uint32_t
uint64_t

Ve

Sırasıyla en az 8, 16, 32 ve 64 bit genişliğinde en hızlı işaretsiz işaretsiz tamsayı türü

uint_fast8_t
uint_fast16_t
uint_fast32_t
uint_fast64_t    

Dolayısıyla, aradaki fark oldukça açıktır, uint32_tbu tam olarak 32 bitlere sahip bir türdür ve bir uygulama bunu yalnızca tam olarak 32 bitlik bir türe sahipse sağlamalıdır ve sonra bu türü uint32_t. Bu araçlar, uint32_tveya olabilir de olmayabilir de mevcut .

Öte yandan, uint_fast32_tsahip olan bir tip en az bir uygulama typedef eğer aynı zamanda aracı, 32 bit, uint32_tolarak uint_fast32_t ise bu içerir uint32_t. Bu sağlamıyorsa uint32_t, o zaman uint_fast32_ten azından sahip herhangi bir tür Typedef olabilir 32bit.


3
Peki, örneğin uint_fast32_t'yi uint32_t'den daha hızlı yapan sebep nedir? Neden daha hızlı?
Destructor

2
@PravasiMeet: Tüm tamsayılara aynı şekilde erişilmez. Bazılarına erişmek diğerlerinden daha kolaydır. Daha kolay, daha az hesaplama, daha doğrudan ve daha hızlı erişim anlamına gelir. Şimdi uint32_ttüm sistemlerde (eğer varsa) tam olarak 32 bittir, bu, 64 bit olana kıyasla daha hızlı olmayabilir. uint_fast32_töte yandan en az 32 bit, hatta 64 bit olabilir.
Nawaz

10
@Destructor: Bazı işlemcilerde, bir değişken daha uzun bir kayıtta saklanırsa, derleyicinin fazladan bitleri kesmek için fazladan kod eklemesi gerekebilir. Örneğin, uint16_t x;ARM7-TDMI bir 32-bit kayıt depolanır, kod x++;olarak değerlendirilebilir gerekebilir x=((x+1)<<16)>>16);. Bu platform için derleyicilerde, uint_fast16_tbundan uint32_tkaçınmak için büyük olasılıkla ile eşanlamlı olarak tanımlanacaktır .
supercat

neden [u]int_(fast|least)N_tisteğe bağlı değiller? Kuşkusuz, tüm mimariler Standart tarafından en az 64 bitlik ilkel türleri desteklemek zorunda değildir? Yine de ifadesi mecbur stdint.holduklarını ima ediyor. 1999'dan beri 64-bit bilgi işlemin ana akım haline gelmesinden birkaç yıl önce - gömülü mimarilerin (çoğu durumda hala geçerli) gerisindeki gecikme hakkında hiçbir şey söylememek için - bunu zorunlu kılıyor olmamız bana garip geliyor. Bu bana büyük bir gözardı etme gibi görünüyor.
underscore_d

1
@underscore_d: Örneğin, Standardın 16 bayt veri RAM'i ve 256 talimat için boşluğu olan bir PIC12 uygulamasına uygulanamayacağının belirli bir nedeni yoktur. Böyle bir uygulamanın birçok programı reddetmesi gerekecektir, ancak bu, ihtiyaçlarını karşılayabileceği programlar için tanımlanmış şekilde davranmasını engellememelidir.
supercat

4

Ne zaman #include inttypes.hprogramınızda, sen tamsayılar gösteren farklı şekillerde bir demet erişebilirsiniz.

Uint_fast * _t türü, belirli bir bit sayısını temsil etmek için en hızlı türü tanımlar.

Bunu şu şekilde düşünün: bir tür değişkeni tanımlarsınız shortve onu programda birkaç kez kullanırsınız, bu tamamen geçerlidir. Ancak üzerinde çalıştığınız sistem, türdeki değerlerle daha hızlı çalışabilir int. Bir değişkeni tür olarak tanımlayarak uint_fast*t, bilgisayar basitçe çalışabileceği en verimli gösterimi seçer.

Bu temsiller arasında bir fark yoksa, sistem hangisini isterse onu seçer ve onu tutarlı bir şekilde kullanır.


9
Neden stdint.h değil inttypes.h? Görünüşe göre inttypes.h yalnızca çeşitli hafif yararlı tüyler, artı stdint.h?
Lundin

@underscore_d Farkı biliyorum. Peki uygulama alanı ne olursa olsun, stdio.h'yi profesyonel programlarda kim kullanır?
Lundin

@Lundin Kim oldukları veya var olup olmadıkları hakkında hiçbir fikrim yok! Bu "hafif kullanışlı tüy" ün ne olduğunu açıklayan bir bağlantı sağlamanın yararlı olabileceğini düşündüm ;-) Belki de insanların haklı olduğunuzu ve buna ihtiyaç duymadıklarını anlamalarına yardımcı olur.
underscore_d

-1

Hızlı sürümün 32 bitten daha büyük olabileceğini unutmayın. Hızlı int, bir register'a güzelce sığacak ve hizalanacaktır ve benzerleri: ancak daha fazla bellek kullanacaktır. Bunların büyük dizilerine sahipseniz, daha fazla bellek önbellek isabeti ve bant genişliği nedeniyle programınız daha yavaş olacaktır.

Modern CPUS'un fast_int32'den fayda sağlayacağını sanmıyorum, çünkü genellikle 32'den 64 bit'e uzanan işaret yükleme talimatı sırasında gerçekleşebilir ve daha hızlı olan 'yerel' bir tamsayı formatı olduğu fikri eski moda.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.