Rumah >pembangunan bahagian belakang >C++ >Adakah `std::vector::resize()` C 11 dan Boost.Container's `boost::container::vector::resize()` Sentiasa Dimulakan Nilai seperti yang Dijangkakan?

Adakah `std::vector::resize()` C 11 dan Boost.Container's `boost::container::vector::resize()` Sentiasa Dimulakan Nilai seperti yang Dijangkakan?

DDD
DDDasal
2024-12-09 08:07:06685semak imbas

Does C  11's `std::vector::resize()` and Boost.Container's `boost::container::vector::resize()` Always Value-Initialize as Expected?

Adakah Vector::resize() dalam C 11 dan Boost.Container Berkelakuan Seperti Yang Dijangkakan?

Dalam C 03, std:: fungsi vector::resize() hanya mempunyai satu beban yang boleh memulakan elemen baharu dengan nilai tertentu. C 11 memperkenalkan dua lebihan beban: ubah saiz(saiz_jenis n) untuk pemulaan nilai dan ubah saiz(saiz_jenis n, const value_type &val) untuk pemulaan salinan.

Boost.Container's boost::container::vector also supports value initialization dalam kaedah resize()nya. Walau bagaimanapun, selepas menguji kelakuan kedua-dua std::vector C 11 dan Boost.Container's boost::container::vector, diperhatikan bahawa elemen akhir yang ditambahkan pada vektor masih dimulakan dengan sifar, walaupun niatnya adalah untuk menggunakan permulaan nilai.

Memahami Yang Dijangka Gelagat:

Pengamatan nilai bermaksud elemen baharu harus dimulakan dengan nilai lalainya (cth., 0 untuk integer), manakala pemulaan salinan bermakna elemen baharu harus dimulakan dengan salinan nilai yang disediakan.

Keputusan Ujian:

Kod berikut telah digunakan untuk menguji tingkah laku:

int main()
{
    // Initialize vectors
    std::vector<int> std_vec;
    bc::vector<int> boost_vec;
    bc::vector<int> boost_vec_default;
    // Fill and resize vectors
    init_vec(std_vec);
    init_vec(boost_vec);
    init_vec(boost_vec_default);
    // Resize vectors to 10 elements using different techniques
    std_vec.resize(10);
    boost_vec.resize(10);
    boost_vec_default.resize(10, bc::default_init);
    // Print results
    print_vec("std", std_vec);
    print_vec("boost", boost_vec);
    print_vec("boost w/default", boost_vec_default);
}

Menyusun dalam Mod C 03:

Output dalam mod C 03 adalah seperti yang dijangkakan. Elemen baharu dalam std_vec dan boost_vec dimulakan dengan sifar, manakala elemen dalam boost_vec_default dimulakan secara lalai.

Menyusun dalam Mod C 11:

Walau bagaimanapun, output dalam C Mod 11 menunjukkan bahawa elemen baharu dalam kedua-dua std_vec dan boost_vec masih dimulakan dengan sifar. Ini menunjukkan bahawa kelakuan yang dijangkakan bagi ubah saiz(jenis_saiz n) tidak dipenuhi.

Penjelasan:

Sebab bagi kelakuan yang tidak dijangka ini ialah pengkompil mungkin sedang mengoptimumkan keluar panggilan ke beban nilai-inisialisasi resize(). Untuk menguatkuasakan pemulaan nilai, pengalokasi boleh digunakan yang mengatasi kaedah construct() untuk melaksanakan pemulaan nilai secara eksplisit.

Atas ialah kandungan terperinci Adakah `std::vector::resize()` C 11 dan Boost.Container's `boost::container::vector::resize()` Sentiasa Dimulakan Nilai seperti yang Dijangkakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn