Pertanyaan Mengapa ukuran "std :: vector " 16 Byte?


Saya menggunakan memcpy untuk menyalin konten std: vektor <> ke Array primitif. Untuk tipe data seperti int, float, dobel dsb, ini bekerja dengan baik. Ketika saya mulai menyalin boolvector saya mengalami masalah yaitu saya mendapat nilai-nilai aneh.

Pertama saya mulai membuat output uji untuk vektor float:

std::vector<float> test1 (3,0);

cout << "Sizeof test1[0] : " << sizeof(test1[0]) << endl
     << "Memoryaddress 0: " << &test1[0] << endl
     << "Memoryaddress 1: " << &test1[1] << endl
     << "Memoryaddress 2: " << &test1[2] << endl;

Outputnya adalah:

Sizeof test1[0]: 4
Memoryaddress 0: 02793820
Memoryaddress 1: 02793824
Memoryaddress 2: 02793828

Dan inilah yang saya harapkan. Ukuran float adalah 4 Byte dan jarak ke nilai float berikutnya adalah 4 Byte. Ketika saya melakukan ini untuk bool output terlihat seperti ini:

std::vector<bool> test (3,0);

cout << "Sizeof test[0]: " << sizeof(test[0]) << endl
     << "Memoryaddress 0: " << &test[0] << endl
     << "Memoryaddress 1: " << &test[1] << endl
     << "Memoryaddress 2: " << &test[2] << endl;

Outputnya adalah:

Sizeof test[0]: 16
Memoryaddress 0: 011EF94C
Memoryaddress 1: 011EF93C
Memoryaddress 2: 011EF92C

Mengapa ukuran bool 16 Byte? Sepertinya total berlebihan untukku. Apakah ada penjelasan untuk ini?


8
2018-04-04 10:53


asal


Jawaban:


Tidak seperti spesialisasi lainnya vector, vector<bool> tidak mengelola array dinamis bool objek. Sebaliknya, itu seharusnya mengemas nilai boolean menjadi satu bit masing-masing.

Karena bit individual tidak dapat dialamatkan, test[0] tidak bisa hanya menjadi referensi bool. Sebaliknya, ini adalah tipe kelas vector<bool>::reference yang dapat dikonversi menjadi bool (untuk mendapatkan nilai), dan ditugaskan dari bool (untuk memodifikasi elemen vektor).

Ini artinya itu vector<bool> tidak sepenuhnya memenuhi persyaratan kontainer standar, dan tidak dapat digunakan jika Anda memerlukan referensi atau penunjuk ke elemennya. Jika Anda memang membutuhkan wadah "nyata" dengan elemen yang dapat dialamatkan, pertimbangkan vector<char> atau deque<bool> sebagai gantinya.


21
2018-04-04 11:01



std::vector<bool> adalah versi khusus vektor, yang mengoptimalkan ruang.

  • Penyimpanan tidak harus berupa array nilai bool, tetapi implementasi perpustakaan dapat mengoptimalkan penyimpanan sehingga setiap nilai disimpan dalam satu bit.
  • Elemen tidak dibangun menggunakan objek alokator, tetapi nilainya langsung diatur pada bit yang tepat di penyimpanan internal.

Informasi lebih lanjut: http://www.cplusplus.com/reference/vector/vector-bool/


4
2018-04-04 10:58