私が読んだことからstd::vector
、連続したメモリバイト配列を必要とするc関数とインターフェースするときに使用する適切な構造です。ただし、場合によっては配列のサイズをどのように決定できるのか疑問に思っていました
私が言いたいことを説明するために、小さなサンプル プログラムを作成しました。
int main(int argc, char *argv[])
{
std::vector<unsigned char>v;
unsigned char p[1024];
sprintf((char*)&p[0], "%10d", 10);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(30);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
memcpy(&v[0], &p[0], 20);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(50);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.reserve(0);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.resize(20);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
v.resize(0);
cout << "Size: " << v.size() << " Length: " << v.capacity() << endl;
return 0;
}
出力は次のとおりです (あまり驚くべきことではありません)。
Size: 0 Length: 0
Size: 0 Length: 30
Size: 0 Length: 30
Size: 0 Length: 50
Size: 0 Length: 50
Size: 20 Length: 50
Size: 0 Length: 50
これを行った理由は、特定のサイズのバッファーを予約してから、このメモリを を介してソケットに渡すためrecv()
です。recv
メモリをポインタとして渡す必要があるため、返されるものに応じてベクトル サイズが調整される方法はありません。受信したバイト数がバッファよりも小さい場合、ベクトルのサイズを何らかの方法で調整できると考えていたので、それを返すと、呼び出し元が実行できv.size()
、要素の数が受信によって返されます。
上記の例のデータを見ると、使用時resize()
にバッファのサイズが正しく調整されていますが、データがなくなっています。では、正しいサイズを取得するためだけに、メモリを個別に新しいベクトルにコピーする必要がありますか? これは私にとって本当に不必要なオーバーヘッドのように思えます。または、現在保持する必要がある要素の数をベクトルに伝える方法はありますか?