Setiap tipe data menempati sejumlah byte tertentu, dan jumlah itu tidak ditentukan secara penuh oleh standar C++ — standar menetapkan ukuran minimal, sedangkan platform dan compiler menentukan sisanya. Program yang menyimpan jutaan elemen sangat sensitif terhadap ukuran tipe: salah memilih long long untuk data yang cukup dengan short berarti menggandakan konsumsi memori tanpa manfaat. C++ menyediakan operator sizeof untuk menanyakan ukuran pada saat kompilasi, dan header <limits> untuk menanyakan batas nilai setiap tipe. Pada Chapter ini kita mengukur sendiri tipe-tipe yang sudah kita pelajari sepanjang Section ini.
Operator sizeof #
sizeof adalah operator (bukan fungsi) yang menghasilkan jumlah byte dari sebuah tipe atau ekspresi pada saat kompilasi. Hasilnya bertipe std::size_t, tipe unsigned yang cukup untuk menampung ukuran objek apa pun. Satu jaminan penting dari standar: sizeof(char) selalu 1, dan tipe lain diukur sebagai kelipatannya.
#include <iostream>
int main() {
std::cout << "sizeof(bool) = " << sizeof(bool) << " byte\n";
std::cout << "sizeof(char) = " << sizeof(char) << " byte\n";
std::cout << "sizeof(short) = " << sizeof(short) << " byte\n";
std::cout << "sizeof(int) = " << sizeof(int) << " byte\n";
std::cout << "sizeof(long) = " << sizeof(long) << " byte\n";
std::cout << "sizeof(long long) = " << sizeof(long long) << " byte\n";
std::cout << "sizeof(float) = " << sizeof(float) << " byte\n";
std::cout << "sizeof(double) = " << sizeof(double) << " byte\n";
int angka = 42;
std::cout << "sizeof(angka) = " << sizeof(angka) << " byte\n";
return 0;
}Output yang Dihasilkan:
sizeof(bool) = 1 byte
sizeof(char) = 1 byte
sizeof(short) = 2 byte
sizeof(int) = 4 byte
sizeof(long) = 8 byte
sizeof(long long) = 8 byte
sizeof(float) = 4 byte
sizeof(double) = 8 byte
sizeof(angka) = 4 byteMari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 5-12 (
sizeof(bool)dst.): setiap pemanggilansizeof(tipe)diganti compiler dengan konstanta angka pada saat kompilasi — tidak ada perhitungan yang terjadi saat program berjalan. - Baris 15 (
sizeof(angka)): bentuk dengan ekspresi menghasilkan ukuran tipe variabel tersebut, yaitusizeof(int)= 4 byte. Ekspresi di dalamsizeoftidak dievaluasi; angka42tidak dibaca, sehinggasizeof(angka = 99)pun tetap aman tanpa mengubahangka. - Angka pada output: hasil ini berasal dari platform x86-64 Linux dengan GCC 14.2. Standar hanya menjamin
char1 byte danlong longminimal 64 bit, sehinggasizeof(long)bisa berbeda di Windows (4 byte pada beberapa konfigurasi) — angka yang Anda lihat boleh berbeda, dan prosa program sebaiknya tidak bergantung pada ukuran absolut.
Perhatikan bahwa sizeof pada tipe yang sama selalu menghasilkan nilai konstan di seluruh program. Karena itu compiler dapat menggunakan hasilnya untuk menyusun ukuran array statis dan alokasi memori tanpa biaya tambahan.
Batas Nilai dengan numeric_limits #
Header <limits> menyediakan class template std::numeric_limits<T> yang menampung sifat-sifat numerik tipe T. Member yang paling sering dipakai: min(), max(), lowest(), dan digits10. Semuanya didefinisikan sebagai static constexpr, sehingga nilainya juga tersedia pada saat kompilasi.
#include <iostream>
#include <limits>
int main() {
std::cout << "int: min = " << std::numeric_limits<int>::min() << "\n";
std::cout << "int: max = " << std::numeric_limits<int>::max() << "\n";
std::cout << "long long: max = " << std::numeric_limits<long long>::max() << "\n";
std::cout << "double: max = " << std::numeric_limits<double>::max() << "\n";
std::cout << "double: min (terkecil positif normal) = "
<< std::numeric_limits<double>::min() << "\n";
std::cout << "double: digits10 = "
<< std::numeric_limits<double>::digits10 << "\n";
return 0;
}Output yang Dihasilkan:
int: min = -2147483648
int: max = 2147483647
long long: max = 9223372036854775807
double: max = 1.79769e+308
double: min (terkecil positif normal) = 2.22507e-308
double: digits10 = 15Mari kita telaah member-member yang dipakai:
min()danmax(): batas nilai terkecil dan terbesar yang dapat disimpan tipe tersebut. Untukintpada platform ini nilainya sesuai rentang 32 bit bertanda, yaitu sekitar ±2,1 miliar.long long: max: sekitar 9,2 kuintili (64 bit bertanda) — pilihan tepat ketika perhitungan berisiko melewati batasint.double: max: nilai berhingga terbesar (sekitar 1,8 × 10³⁰⁸). Nilai yang melewatinya menjadi infinit (inf), bukan wrap-around seperti integer.double: min(): untuk tipe floating-point,min()adalah nilai positif terkecil yang ternormalisasi — bukan angka paling negatif. Angka paling negatif diperoleh darilowest(), yaitu-max().digits10: jumlah digit desimal yang dapat dicetak dan dibaca kembali tanpa kehilangan presisi — untukdoubleangkanya 15. Konsep ini menjadi dasar pembahasan floating-point pada Section Pemrograman Numerik.
numeric_limits juga menjawab pertanyaan umum lain: is_signed, is_integer, dan has_infinity mengembalikan true/false pada saat kompilasi, sehingga cocok dipasangkan dengan static_assert untuk memastikan asumsi kode Anda sejak awal. Dengan sizeof dan numeric_limits, kita kini dapat menulis kode yang menyatakan asumsi ukuran dan batas secara eksplisit — kebiasaan yang akan terus dipakai pada Section Operator ketika mulai menghitung batas aritmetika.