C99 standar memperkenalkan tipe data berikut. Dokumentasi dapat ditemukan di sini untuk AVR stdint perpustakaan.
uint8_t
berarti's 8-bit unsigned jenis.uint_fast8_t
berarti's tercepat unsigned int dengan setidaknya 8
bit.uint_least8_t
berarti's unsigned int dengan setidaknya 8 bit.Saya memahami uint8_t
dan apa yang uint_fast8_t
( I don't tahu bagaimana itu's dilaksanakan di daftarkan tingkat).
1.Bisa anda jelaskan apa arti dari "'s unsigned int
dengan setidaknya 8 bit"?
2.Bagaimana uint_fast8_t
dan uint_least8_t
membantu meningkatkan efisiensi/kode ruang dibandingkan dengan uint8_t
?
uint_least8_t
ini merupakan type terkecil yang memiliki setidaknya 8 bit.
uint_fast8_t
adalah yang tercepat tipe yang memiliki setidaknya 8 bit.
Anda dapat melihat perbedaan dengan membayangkan eksotis arsitektur. Bayangkan 20-bit arsitektur. Yang unsigned int
memiliki 20 bit (satu register), dan unsigned char
memiliki 10 bit. Jadi sizeof(int) == 2
, tetapi menggunakan char
jenis membutuhkan tambahan instruksi untuk memotong register di setengah. Maka:
uint8_t
: tidak terdefinisi (ada 8 jenis bit).uint_least8_t
: adalah unsigned char
, type terkecil yang setidaknya 8 bit.uint_fast8_t
: adalah unsigned int
, karena dalam khayalan saya arsitektur, setengah-variabel register lebih lambat dari yang penuh mendaftarkan satu.uint8_t
berarti: memberikan saya sebuah unsigned int persis 8 bit.
uint_least8_t
berarti: berikan terkecil tipe unsigned int yang memiliki setidaknya 8 bit. Mengoptimalkan penggunaan memori.
uint_fast8_t
berarti: memberikan saya sebuah unsigned int setidaknya 8 bit. Memilih jenis yang lebih besar jika akan membuat program lebih cepat, karena keselarasan pertimbangan. Mengoptimalkan kecepatan.
Juga, tidak seperti biasa int
jenis, versi yang ditandatangani di atas stdint.jam jenis ini dijamin akan 2's melengkapi format.
Teori yang pergi sesuatu seperti:
uint8_t
diperlukan untuk menjadi persis 8 bit tapi itu's tidak diperlukan untuk ada. Jadi anda harus menggunakannya di mana anda bergantung pada modulus-256 tugas perilaku* 8 bit integer dan di mana anda akan memilih sebuah kompilasi kegagalan untuk perilaku pada mengaburkan arsitektur.
uint_least8_t
diperlukan untuk menjadi yang terkecil yang tersedia unsigned integer tipe yang dapat menyimpan setidaknya 8 bit. Anda akan menggunakan ini ketika anda ingin meminimalkan penggunaan memori dari hal-hal seperti array besar.
uint_fast8_t
seharusnya "tercepat" unsigned jenis yang dapat menyimpan setidaknya 8 bit; namun, itu's tidak benar-benar dijamin untuk menjadi yang tercepat untuk suatu operasi pada setiap prosesor. Anda akan menggunakannya dalam pengolahan kode yang melakukan banyak operasi pada nilai.
Praktek adalah bahwa "cepat" dan "paling" jenis aren't banyak digunakan.
"paling" jenis yang hanya benar-benar berguna jika anda peduli tentang portabilitas untuk mengaburkan arsitektur dengan CHAR_BIT != 8 yang sebagian besar orang-orang yang don't.
Masalah dengan "cepat" jenis adalah bahwa "tercepat" adalah sulit untuk dijabarkan. Sebuah jenis yang lebih kecil mungkin berarti lebih sedikit beban pada memori/cache sistem, tetapi menggunakan jenis yang lebih kecil daripada yang asli mungkin memerlukan instruksi tambahan. Selain itu yang terbaik adalah mungkin berubah antara arsitektur versi tapi pelaksana sering ingin menghindari melanggar ABI dalam kasus tersebut.
Dari mencari di beberapa tempat implementasi tampaknya bahwa definisi uint_fastn_t cukup sewenang-wenang. glibc tampaknya untuk mendefinisikan mereka sebagai hal yang paling "kata asli ukuran" sistem dalam pertanyaan yang tidak mengambil mempertimbangkan fakta bahwa banyak prosesor modern (terutama 64-bit yang) memiliki dukungan khusus untuk operasi cepat pada item yang lebih kecil dari mereka kata asli ukuran. IOS rupanya mendefinisikan mereka sebagai setara dengan fixed-jenis ukuran. Platform lainnya mungkin berbeda.
Semua dalam semua jika kinerja ketat dengan kode kecil bilangan bulat adalah tujuan anda, anda harus bench-marking anda kode pada platform anda peduli dengan ukuran yang berbeda jenis untuk melihat apa yang bekerja terbaik.
* Perhatikan bahwa sayangnya modulo-256 tugas perilaku tidak selalu berarti modulo-256 aritmatika, terima kasih untuk C's integer promosi misfeature.
Beberapa prosesor tidak dapat beroperasi secara efisien pada data yang lebih kecil jenis seperti pada yang besar. Misalnya, diberikan:
uint32_t foo(uint32_t x, uint8_t y)
{
x+=y;
y+=2;
x+=y;
y+=4;
x+=y;
y+=6;
x+=y;
return x;
}
jika y
itu uint32_t
compiler untuk ARM Cortex-M3 hanya bisa menghasilkan
add r0,r0,r1,asl #2 ; x+=(y<<2)
add r0,r0,#12 ; x+=12
bx lr ; return x
tapi sejak y
adalah uint8_t
compiler akan sebaliknya menghasilkan:
add r0,r0,r1 ; x+=y
add r1,r1,#2 ; Compute y+2
and r1,r1,#255 ; y=(y+2) & 255
add r0,r0,r1 ; x+=y
add r1,r1,#4 ; Compute y+4
and r1,r1,#255 ; y=(y+4) & 255
add r0,r0,r1 ; x+=y
add r1,r1,#6 ; Compute y+6
and r1,r1,#255 ; y=(y+6) & 255
add r0,r0,r1 ; x+=y
bx lr ; return x
Tujuan dari "cepat" jenis adalah untuk memungkinkan compiler untuk menggantikan yang lebih kecil jenis yang tidak't diproses secara efisien dengan lebih cepat. Sayangnya, semantik "cepat" jenis yang agak sulit ditentukan, yang pada gilirannya daun keruh pertanyaan apakah ekspresi akan dievaluasi menggunakan signed atau unsigned matematika.
1.Bisa anda jelaskan apa arti dari "'s unsigned int dengan setidaknya 8 bit"?
Yang harus jelas. Itu berarti bahwa itu's unsigned integer tipe, dan bahwa hal itu's lebar minimal 8 bit. Pada dasarnya ini berarti bahwa hal itu setidaknya dapat tahan angka 0 sampai 255, dan itu pasti tidak tahan angka negatif, tapi ini mungkin dapat memegang angka lebih tinggi dari 255.
Jelas anda tidak harus menggunakan salah satu dari jenis ini jika anda berencana untuk menyimpan setiap jumlah di luar jangkauan 0 sampai 255 (dan anda ingin menjadi portable).
2.Bagaimana uint_fast8_t dan uint_least8_t membantu meningkatkan efisiensi/kode ruang dibandingkan dengan uint8_t?
uint_fast8_t
diperlukan untuk menjadi lebih cepat sehingga anda harus menggunakannya jika kebutuhan anda adalah bahwa kode akan cepat. uint_least8_t
di sisi lain mensyaratkan bahwa tidak ada calon yang lebih rendah size - jadi anda akan menggunakan bahwa jika ukuran perhatian.
Dan tentu saja anda hanya menggunakan uint8_t
ketika anda benar-benar membutuhkan itu untuk menjadi persis 8 bit. Menggunakan uint8_t
dapat membuat kode non-portabel sebagai uint8_t
tidak diperlukan untuk ada (karena kecil seperti tipe integer tidak ada pada platform tertentu).
"cepat" tipe integer didefinisikan untuk menjadi yang tercepat integer tersedia dengan sedikitnya jumlah bit yang dibutuhkan (dalam kasus anda 8).
Platform dapat menentukan uint_fast8_t
sebagai uint8_t
maka akan ada benar-benar tidak ada perbedaan kecepatan.
Alasannya adalah bahwa ada platform yang lebih lambat ketika tidak menggunakan kata asli yang panjang.