2016-06-29 6 views
-1

私たちは、たとえば、ベクトルの大きさを得るためにsize()機能を使用できることを理解する:std :: vectorの割り当てられたメモリサイズを知るには?

std::vector<in> abc; 
    abc.resize(3); 
    abc.size(); 

私の質問はどのように私は、ベクトルのメモリサイズを知ることができるのですか?例を見てみましょう:

std::vector<int> abc; 
abc.reserve(7); 
//the size of memory that has been allocated for abc 
+0

http://en.cppreference.com/w/cpp/container/vector – juanchopanza

答えて

3

あなたはあなたが行うことができますバイトで割り当てられたメモリを、取得するために割り当てられた容量

std::vector<int> abc; 
abc.reserve(7); 
std::cout << abc.capacity() << std::endl; 

を得るために、メンバ関数capacity()を使用します。

sizeof(int) * abc.capacity(); 

このvalue_typeintです。あなたは

sizeof(decltype(abc.back())) * abc.capacity(); 
+2

'capazcity'(および' size')によって返されるサイズは要素数であり、メモリの場合はバイト数ではありません。 – user2079303

+1

以上一般に 'sizeof(decltype(abc.front())* abc.capacity) ' – Curious

+0

オブジェクトのサイズには埋め込みが含まれていますか? – mksteve

0

あり、メモリが連続であることに強い文があり、その大きさは

sizeof(abc[0]) * abc.capacity(); 

または

( (char*)(&abc[1]) - (char*)(&abc[0])) * abc.capacity(); 
です
+0

なぜ2番目の方法を提案しますか?それはより複雑で、最初に利点がないし、配列に少なくとも2つの要素が含まれていなければ、技術的にUBだと思う。最初はいいです。 – user2079303

+0

sizeof(abc [0])== sizeof(T)に依存することはできません。 Operator []はプロキシオブジェクトを返すことができます。あなたは 'value_type'を使うほうが良いでしょう。 –

+1

@CrazyEddie:おそらく、ベクトル 'を考えている場合、割り当てられたメモリの実際の量である' sizeof(value_type)* capacity() 'を数えることはできません。 –

0

std :: vectorは複雑なオブジェクト(std :: stri ng)は、内部メモリ管理を持ち、追加のメモリを割り当てることができます。単純なオブジェクトを含むベクターについて

INTなど容量のsizeofにかかわらず動作するを使用して提案された解決策。

1

本当の答えはできないということです。他の人は、しばしばうまくいく方法を提案していますが、割り当てられた実際のメモリをどのように反映するかは、capacityに依存することはできません。

ヒープは、多くの場合、要求されたより多くのメモリを割り当てます。これは、断片化に対する最適化などと関係しています。vectorは、実際に割り当てられたメモリの量、要求したものだけを知る方法がありません。

したがってcapacityは、おおまかな概算値を示します。

関連する問題