2013-04-04 136 views
8

我正在使用memcpy將std:vectors <>的內容複製到primitve Arrays。對於像int,float,double等數據類型,它運行良好。當我開始複製一個boolvector時,我遇到了一個問題,即我得到了奇怪的值。爲什麼「std :: vector <bool>」16字節的大小?

首先,我開始做一個矢量浮點的測試輸出:

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; 

輸出是:

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

這是我所期望的。浮點大小爲4字節,到下一個浮點值的距離爲4字節。當我這樣做對布爾輸出看起來是這樣的:

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; 

輸出是:

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

爲什麼是布爾16字節的大小?這對我來說似乎是一種矯枉過正。有解釋嗎?

+1

'&test [0]'不是你認爲的那樣。檢查它的類型! – 2013-04-04 10:57:16

+2

您的標題有誤導性,您從未真正檢查過'std :: vector '的尺寸。 – jrok 2013-04-04 10:58:04

+0

你不能把'sizeof'的東西比一個字符小。 'sizeof'運算符以字符大小的整數倍返回大小。 – 2013-04-04 10:59:59

回答

18

不像vector其他特,vector<bool>不管理bool對象的動態數組。相反,它應該將布爾值分別打包到一個位中。

由於各個位不可尋址,因此test[0]不能簡單地作爲對bool的引用。相反,它是一個類型vector<bool>::reference,可以轉換爲bool(以獲取值),並從bool(要修改向量元素)分配。

這意味着vector<bool>不完全符合標準容器的要求,並且如果您需要對其元素的引用或指針,則不能使用。如果您確實需要帶有可尋址元件的「真實」容器,請考慮使用vector<char>deque<bool>

+0

謝謝。你的接受者清晰易懂! – akristmann 2013-04-04 11:13:14

+1

@akristmann你也可以看一下http://en.cppreference.com/w/cpp/utility/bitset,它可能適合你。 – 2013-04-04 15:02:58

4

std::vector<bool>是矢量的專門版本,它對空間進行了優化。

  • 存儲不一定是一個bool值的數組,但庫實現可能會優化存儲,以便每個值都存儲在一個位中。
  • 元素不是使用分配器對象構造的,但它們的值直接設置在內部存儲器的適當位上。

的更多信息:http://www.cplusplus.com/reference/vector/vector-bool/

相關問題