vector<string> が保持するメモリについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic

vector<string> が保持するメモリについて

#1

投稿記事 by dic » 15年前

プログラムとしては前回の「ファイル出力がうまくいかない」と連結させるのですが、
話としては別になるので、新たに質問します

下のコードを実行すると
#include	<iostream>
#pragma	warning( disable: 4786 )
#include	<string>
#include	<vector>
using namespace std;


void	hoge2()
{
	printf( "-hoge 2 -\n" );

	vector<string>	v;
	char	buf[200002];

	int	i, r, l, s;
	for( s=0; s<10000; s++ )
	{
		l = rand()%10000;
		for( i=0; i<l; i++ )
			buf = rand()%10;
		strcat( buf, "\n" );
		v.push_back( buf );
	}
	printf( "size:%d\n", v.begin()-v.end() );
}


void	hoge1()
{
	printf( "-hoge 1 -\n" );

	vector<string>	v;
	char	buf[102];

	int	i, r, l, s;
	for( s=0; s<100; s++ )
	{
		l = rand()%100;
		for( i=0; i<l; i++ )
			buf = rand()%10;
		strcat( buf, "\n" );
		v.push_back( buf );
	}
	printf( "size:%d\n", v.begin()-v.end() );
}

int	main()
{
	hoge1();
	hoge2();

	return 0;
}


関数hoge1 hoge2 での v が使用しているメモリの量を知りたいのです
v.begin() - v.end() で使用しているメモリアドレスからサイズを計算するのですが、
ランダムな数をpush_backしてるので、ランダムなメモリの量を使用すると思いました

しかし、画像のように結果がでて、先頭のアドレスだけを保持しているのでしょうか
どうやったら vector<string> v; が使用しているメモリの量をはかれるのでしょうか?

たいちう

Re:vector<string> が保持するメモリについて

#2

投稿記事 by たいちう » 15年前

> しかし、画像のように結果がでて、先頭のアドレスだけを保持しているのでしょうか

少なくともdicさんの環境ではそのようです。
環境を書きましょうよ。

> どうやったら vector<string> v; が使用しているメモリの量をはかれるのでしょうか?

その方法は用意されていません。実装に依存しますし。
何の為にメモリ使用量が必要なのかによって代替案は変わってきます。
文字列の分のデータをバイト単位で知りたいならば、全要素の長さを合計するとかですし、
vectorの仕組みが知りたいならば、公開されているソースコードを解析すればよいでしょう。

大雑把な理解で良いならば、仮説を立てて検証すれば、検証できた範囲で
正しいと仮定することができます。
dicさんがやったのが、ちょうどこれですね。最初の仮説が反証されて、
新しい仮説を手にしたところですね。

たかぎ

Re:vector<string> が保持するメモリについて

#3

投稿記事 by たかぎ » 15年前

std::vector<std::string>::capacityを使えばよいのでは?

dic

Re:vector<string> が保持するメモリについて

#4

投稿記事 by dic » 15年前

>たいちう さん
正確に把握しようとするとそうなりますね

>たかぎ さん
今回はおおまかでいいので、使用しているメモリ量が分かればよいので
std::vector<std::string>::capacity() を使うことにします

たいちう

Re:vector<string> が保持するメモリについて

#5

投稿記事 by たいちう » 15年前

void	hoge2()
{
	printf( "-hoge 2 -\n" );

	vector<string>	v;
	char	buf[200002];

	int	i, r, l, s;
	int total = 0;
	for( s=0; s<10000; s++ )
	{
		l = rand()%10000;
		for( i=0; i<l; i++ )
			buf = rand()%10;
		strcat( buf, "\n" );
		v.push_back( buf );
		total += l + 1;
	}
	printf( "size:%d\n", v.begin()-v.end() );
	cout << "capacity : " << v.capacity() << endl;
	cout << "total : " << total << endl;
}

私がdicさんの意図を誤解してましたか?
上述のtotalが意図するものに近く、capacityで得られる値とは、かけ離れると思っていたのですが。
もちろんcapacityが目的に適うならそれで結構です。

dic

Re:vector<string> が保持するメモリについて

#6

投稿記事 by dic » 15年前

>たいちうさん
すいません 色々考えた結果 私のミスでループ文がおかしかったです

>for( s=0; s<10000; s++ )
ここが変で、結果がかけ離れていたものが結果として出てました

書き直したものを残しておきます
#include	<iostream>
#include	<stdio.h>
#include	<string>
#include	<vector>
using namespace std;


void	hoge4()
{
	vector<string>	v;
	int	i, l, t;
	t = 0;
	for( i=0; i<10; i++ )
	{
		l = rand()%10;
		int	a;
		for( a=0; a<l; a++ )
		{
			v.push_back( "hoge" );
		}
		t += l;
	}

	 printf( "size:%d\n", v.size() );
	 printf( "capa:%d\n", v.capacity() );
	 printf( "tota:%d\n", t );
	 printf( "addr:%d\n", v.end() - v.begin() );
}

 void	hoge3()
{
	 vector<char>	v;
	 int	i;
	 int	total = 0;
	 for( i=0; i<10; i++ ){
		 v.push_back( (char)i );
		 total += 1;
	 }
	 printf( "size:%d\n", v.size() );
	 printf( "capa:%d\n", v.capacity() );
	 printf( "tota:%d\n", total );
	 printf( "addr:%d\n", v.end() - v.begin() );
}
 

void	main()
{
	hoge3();
	hoge4();
}

閉鎖

“C言語何でも質問掲示板” へ戻る