2017-03-12 55 views
3

爲什麼在我們有向量時使用這樣的新內存位置?
有沒有優勢?使用new分配連續空間與使用矢量?

bool* arr = new bool(size); 

我不清楚這條線做什麼,但我的感覺是 這std::memset套無論param2給出了從地址開始的所有 位置在param1,並在給定的大小

std::memset(arr, 0, sizeof(bool) * (num+1)); 
+1

您的標題和內容不符,請說明您要做什麼。 –

+4

bool * arr = new bool(size);不是一個數組。 – basslo

+0

真的很抱歉我是新來的C++編程,是bool * arr = new bool(size);不創建contiguos空間? –

回答

3

什麼這行bool* arr = new bool(size);做ES?

此行分配在堆的布爾和它其初始化爲true如果size != 0false如果size == 0。然後它將新分配的布爾值的地址分配給布爾指針arr。所以沒有陣列在這裏玩。

我怎麼能分配一個布爾型數組new

在堆中分配數組的正確方法是使用運算符new[]。這是你的情況:

bool* arr = new bool[size]; 

隨着智能指針的出現,你也可以使用std::unique_ptr

std::unique_ptr<bool[]> arr(new bool[size]); 

這樣,你就不必delete []之後。

爲什麼在我們有向量時使用這種新的內存分配?

好與任何其他類型的除了bool我會同意,但事情是,有與std::vector<bool>某些問題。

std::vector<bool>是專門爲std::vector<T>,這主要是爲了空間效率(可辯論)完成。

但是,它的行爲類似但不同於普通的std::vector<T>。這主要歸因於以下事實:std::vector<bool>不是通常STL意義上的容器,而是一組位。 Generaly,使用std::vector<bool>可引起許多havocs它被認爲是一個不成熟的優化,它甚至可以pessimize你的表現(查看更多詳情here)。

另一件事是,在嵌入式系統,其空間是crusial,使用原始陣列,而不是一個矢量在空間效率方面更好的選擇。

std::memset(arr, 0, sizeof(bool) * (size));怎麼樣?

std::memset初始化一定數量在存儲器與給定的值(即,第二輸入參數)從地址arr(即,第一個輸入參數)開始的字節(即,第三輸入參數)的。在上面的示例中,它將填充arr0 s,最大爲size字節數。也就是說,如果arr是一個大小爲size的數組,它將初始化此布爾數組的所有元素爲false

但是alternatevely,您可以使用以下方案:

bool* arr = new bool[size](); 
          ^^ 

std::unique_ptr<bool[]> arr(new bool[size]()); 

,從而避免給原始內存操縱通話落在慎用類使用std::memset

+0

哇,您的回答很酷,但不能upvote:p我沒有足夠的積分。採取的要點:1.新的布爾(大小)< - 大小變量這裏是誤導,這只是用來創建一個單一的內存實例t/f。 2.這個alg的作者直接通過分配零的做事來清除以下內存空間,但是我認爲它是堆的剩餘內存,他/她沒有打擾,堆棧內存將會是災難。 3.必須使用智能指針來創建這樣的東西。 –

+0

upvoted,剛剛收到upvoting的能力! –

4
的 結束

爲什麼當我們有向量時使用這樣的新內存位置?

我們不能讚揚作者在這裏使用新的原因。慣用的方法是使用一個std::vector<bool>

有沒有什麼優勢?

通常不是,但特別是std::vector<bool>是有問題的,因爲有一個專門化,不像其他類型一樣工作。

有很多這樣的問題,在這樣:

我不明白這行做,但我的感覺...

你膽量是對的。


注:與new分配的bool個連續的數組中的代碼將

bool* arr = new bool[size]; 

代替原始指針,你可以使用智能指針來分配數組,不需要關心delete []

std::unique_ptr<bool[]> arr{new bool[size]}; 
+0

如果size是已知的,'std :: array'會更好嗎? –

+0

@EdHeal很可能是的。 –

+0

是完全正確author'd使用數組如果大小已知,但在我正在研究的算法https://gist.github.com/anonymous/524357a70fc95b537f31f5d7ec3e8bb8#file-sieve-cpp-L12數組的大小由用戶的輸入決定。僅供參考,鏈接是我輸入的整個實際文件的一部分 –