[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 03/13 15:15 / Filesize : 207 KB / Number-of Response : 692
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Boost総合スレ part7



1 名前:デフォルトの名無しさん [2009/01/19(月) 21:22:22 ]
過去スレ
part 6 pc11.2ch.net/test/read.cgi/tech/1207749841/
part 5 pc11.2ch.net/test/read.cgi/tech/1192662575/
part 4 pc11.2ch.net/test/read.cgi/tech/1175663346/
part 3 pc11.2ch.net/test/read.cgi/tech/1158991211/
part 2 pc8.2ch.net/test/read.cgi/tech/1139313234/
part 1 pc8.2ch.net/test/read.cgi/tech/1091198276/

■関連サイト■
Boost C++ Libraries
www.boost.org/

Boost 翻訳プロジェクト
boost.cppll.jp/HEAD/

Let's Boost
www.kmonos.net/alang/boost/

boost info
shinh.skr.jp/boost/

256 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 16:52:31 ]
Spirit使っている人に聞きたいです。

eps_pを使うと括弧を減らせるみたいらしいですが、
俺的にはeps_pを使うよか括弧を使う方が分かりやすいと思うんです。
みさなんはどう思いますか?


257 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 19:26:02 ]
ウロ覚えだが括弧の中に括弧がネストしてる場合もちゃんと処理してくれるんじゃなかったっけ

258 名前:256 mailto:sage [2009/03/28(土) 19:31:45 ]
>>257
そー言われれば、括弧のネストを解消して括弧の数を減らせるな。
…あと、見やすいかどうかは主観に寄るよなやっぱ。


259 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 01:38:49 ]
Spiritに関して

パーザーPARがあったとして、PARにマッチしないって言うのを表すにはどう書けばいい?
具体的には
boost::spirit::sign_p
にマッチしないって言うのを表したかったのだが、
~boost::spirit::sign_p
とやったらoperator~はsign_pには定義されていないよっていうエラーがでるんだけど・・・。


260 名前:259 mailto:sage [2009/03/29(日) 01:54:34 ]
boost::spirit::anychar_p-boost::spirit::sign_p
で良かったか。
事故解決した気がするが、これで間違っていたら教えてくれ。

261 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 14:41:25 ]
>>260
手っ取り早い方法だとそれで良いと思う。
ただ、anychar_p sign_pの両方が評価されるので、
-を使った方法は多用しまくると効率悪いかもね。
<この例なら気にならないだろうけど

262 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 14:41:39 ]
Spiritにて
expr=
(
+(boost::spirit::digit_p)//[&the_func]
>>
*(
(boost::spirit::ch_p('!'))//[&the_func]
)
)//[&the_func]
この3カ所にセマンティックアクション
void the_func(const char* const, const char* const)
を入れたかった。しかし実際やってみると
3つ目のthe_funcの場所「以外」入れられずコンパイルエラーになる。
何で?


263 名前:=260=259 mailto:sage [2009/03/29(日) 14:42:35 ]
>>261
ありがとう。初めて使ってみて今3日目。感動を禁じ得ない。

264 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 14:54:09 ]
>>262
間違ってるかもしれないが、デフォルト定義パーサ(の一部?)には、
セマンティックアクションを組み込めなかったかも?
いったん別なルールに入れれば良かったんじゃなかったっけ?

rule a,b;
a = digit_p;
b = ch_p;
expr = +a[&fnc] >> *b[&fnc] 〜

みたいに。



265 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 14:55:22 ]
>>264
やってみる!

266 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 14:55:42 ]
あるいはこうだったかも

a = digit_p[&fnc];
b = ch_p[&fnc];

267 名前:262 mailto:sage [2009/03/29(日) 15:05:31 ]
boost::spirit::rule<scannerT> expr, num_p, exclamation_mark_p;

num_p=boost::spirit::digit_p;
exclamation_mark_p=boost::spirit::ch_p('!');
expr =
(
+num_p[&the_func]
>>
*(
exclamation_mark_p[&the_func]
)
)
;

これで出来た!動作も今のところ大丈夫っぽい。
ありがとう。

ちなみに
a = digit_p[&fnc];
b = ch_p[&fnc];
は死にました。
やっぱりおっしゃるとおり、プリミティブパーサには直接セマンティックアクションを入れられない場合があるみたい。

268 名前:262 mailto:sage [2009/03/29(日) 15:08:45 ]
ただし
int_p[&PUSH]
とかやる時は直接プリミティブパーサにセマンティックアクションを付けてもおkなのか。
むむぅ。
初めて知った。

269 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 15:09:18 ]
アクション関数のシグネチャが違うんじゃないの。

270 名前:268 mailto:sage [2009/03/29(日) 16:55:52 ]
>>269
ぽいね。
int1つを受け取るセマンティックアクション用の関数とint_pならおkなのか。
どうも。

271 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:11:05 ]
文字列の前後の空白を除去する関数が欲しくてBoost.Xpressiveを使って自作しようと思った。
ところがよく見ると<boost/algorithm/string>にtrimという目当ての関数(?)があるようで、
それを使おうかなとも思っている。

でも<boost/algorithm/string>をインクルードするとそれ全体の分で結構バイナリってでかくなっちゃう?
それともtrimしか使わないならtrimに相当する分だけがバイナリになって
他の<boost/algorithm/string>の部分は付いてこない?

Boost.Xpressiveは別の用件で使っているから抵抗ないんだが、
<boost/algorithm/string>はこのtrim以外で使う予定がないもんだから、
ちょっと心配なんだけど、教えてくださいませんか?


272 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:12:54 ]
マップファイル出力付きでコンパイルして確認してみればよいじゃまいか

273 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:28:54 ]
悩まず即自作してたら、30分で解決したんじゃないか?w

274 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:35:53 ]
じゃ<boost/algorithm/string/trim.hpp>



275 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 16:53:41 ]
みんなありがとう。
やってみる。

276 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 22:43:22 ]
boost/algorithm/string/trim.hpp
だけincludeすれば、少しはマシかも

277 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 15:08:33 ]
>>276
>>274


278 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 19:33:45 ]
Boost.Spiritを使った適当なプログラムを書いてみた。
そのプログラムは
#include <boost/spirit/core.hpp>
となっているのだが、これをより広く
#include <boost/spirit.hpp>
にしたプログラムを作ってみると、
(他は全く変更していないのに)ファイルサイズが違うのだが、なんで?

環境は
Windows XP, g++でコンパイルオプションは-O2
なんだが、実際に使われていない関数やクラスもリンクされてバイナリになっているってこと?


279 名前:デフォルトの名無しさん mailto:sage [2009/04/03(金) 20:43:32 ]
グローバル変数の初期化関連じゃないか。

280 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 01:21:35 ]
更新しました。 今週の更新の大半はドキュメントとGraphのアップデートでした。
ttp://booster.x0.to/
以下更新内容の一部
[Flyweight]
made Boost.Interprocess names shorter to accommodate some filesystems
[Type_traits]
Add missing #includes.
[Graph]
Renamed some functions to work better on some compilers
First batch of merges from Parallel BGL
Merged more changes from Parallel BGL
[Spirit]
Fixes to exception messages.
Fixes to some exception messages.
[Numeric]
storage.hpp: fix #2891, now check new size instead of old one
[Proto]
fix proto::lazy

281 名前:278 mailto:sage [2009/04/04(土) 11:12:22 ]
>>279
あーなるほど。

282 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:15:31 ]
>>280
利用させてもらっています
いつも乙です

283 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 11:42:04 ]
>>280
お疲れ様です。

284 名前:デフォルトの名無しさん mailto:sage [2009/04/04(土) 12:46:44 ]
Boost.Spiritの構文木作成について学べるサイトがあったら教えてください。
日本語がいいです。



285 名前:284 mailto:sage [2009/04/04(土) 12:51:11 ]
ちなみに俺がググったところ
パースツリーを作る
homepage3.nifty.com/kaku-chan/boost/spirit/chapter_005.html
がヒットしているんですが、もしみなさんのオススメがあれば是非知りたいです。

286 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:00:21 ]
Windows XP SP2, MinGW(g++ 3.4.5)をインストールして使っています。

コマンドプロンプトで
g++ something.cpp -I "C:\BoostC++Libraries"
として使っていますが、毎回インクルードパスを入力するのが面倒で、
環境変数で省略出来るのではないかと思い調べてみました。

その結果、
CPLUS_INCLUDE_PATHにboostのパス(私の場合C:\BoostC++Libraries)
を設定すれば大丈夫という記述を見つけたのですが、
実際に設定してみてもうまくいきません。
(インクルードパスを省略してg++ something.cppだけでコンパイルできません。)

近い環境の方で、出来ている方はいらっしゃいませんか?

287 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:04:10 ]
つ[makefile]

288 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:07:27 ]
自分もその環境変数でうまくいかなかったから、.bashrcで
alias g++='g++ -I /cygrive/.../boost_1_38_0'
のようにしている。お察しの通り、Cygwinだけど。

289 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:16:54 ]
俺は>>286と同じ環境で、コマンドプロンプトでCPLUS_INCLUDE_PATHを設定すると
ちゃんと読みに行ってくれるよ。

まあ、普段はmsys使ってるけど。

290 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:20:09 ]
>>287-289
みんなありがとう。
やっぱみなさん色々やってんのね。

291 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 17:25:51 ]
結果、GUIでなく、
>>289さん方式(コマンドプロンプトからCPLUS_INCLUDE_PATHを設定)
でインクルードパスの指定が不要になりました。

愛してる。


292 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 18:37:11 ]
たぶんね、マイコンプータのプロパテから環境変数を設定したあと再起動してなかったでしょ

293 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 19:05:13 ]
>>292
それもしてなかったです。

設定→ダメじゃん→設定を削除して元に戻す

しかしてなかったです。
それも試してみます。


294 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 19:58:48 ]
大元の環境変数は再起動しないと反映されないよ
Windowsはね



295 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:03:06 ]
>>294
Linuxなら再起動しなくても反映されますか?


296 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:14:28 ]
環境変数を設定したシェルから起動したシェルでは大丈夫。

297 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:48:55 ]
環境変数で悩める286が羨ましいぜ
二日掛りでmingw + bjamの罠から未だ抜け出せない。

298 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 20:55:33 ]
bjamってmingwには未対応ってことになってるよね、確か。
俺はcmd.exeからbjamを使ってコンパイルして、使うときはmsysからmingwを使ってる。
これで Program Options と Thread を使ってるが、一応うまく動いてるぞ。

299 名前:デフォルトの名無しさん [2009/04/06(月) 15:19:32 ]
俺もmingwだけど、includeファイルは標準のところにぶち込んだ

300 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 13:48:14 ]
何かWikiに「gzipはGPL」って書いてるんだが、これは
・RFC1952で記述されてるアルゴリズムを元に作ったgzipという圧縮ツールがGPL
・boostに含まれているgzipライブラリはboostライセンス
って事だよな?

301 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 13:59:08 ]
どこのWikiの話だよ

302 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 14:03:15 ]
>>301
すまん、以下のところ。
ja.wikipedia.org/wiki/Gzip


303 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 17:55:46 ]
boostが使ってるのはgzipじゃなくてzlibだろ

304 名前:デフォルトの名無しさん mailto:sage [2009/04/07(火) 19:30:15 ]
boostのshared_ptrを使ってると
再帰関数内ですぐにスタックオーバーフローになる。



305 名前:インドリ [2009/04/09(木) 10:05:55 ]
blogs.wankuma.com/episteme/archive/2009/04/08/171040.aspx
d.hatena.ne.jp/faith_and_brave/20090408

306 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 12:13:53 ]
不買活動?

307 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 13:48:24 ]
> 税込2,940円

高い!

308 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:14:12 ]
>>304
shared_ptrって8バイトしかないんだし、別の問題じゃね?

309 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:38:38 ]
>>305 欲しい

310 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 21:59:59 ]
>>305 欲しくない

311 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:17:12 ]
欲しいとか欲しくないじゃない。うざいから買いたくない。
本屋で平積みしてたら、上に萌々linux載せてあげてもいい。

312 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:25:32 ]
内容がまともなら、日本語でC++の本が増えて喜ばしいことだと思う。

313 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:51:32 ]
>>305
のインドリってヤツ、
> ・投稿者は、話題と無関係な広告の投稿に関して、相応の費用を支払うことを承諾します
広告費払ったのかな?

おまけにマルチ野郎か。
pc12.2ch.net/test/read.cgi/tech/1231640498/



314 名前:デフォルトの名無しさん mailto:sage [2009/04/09(木) 22:51:57 ]
>>308
デストラクタが再帰的に呼び出されることじゃねーの



315 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 00:47:52 ]
functionを配列にして、それにlambdaを入れて使っています。
第1引数に構造体へのポインタを取って、そのメンバを書き換えているのですが
加算代入をやると変な値になってしまいます。
回避方法はもう分かったのですが、値が壊れてしまう原因が知りたいです。

ttp://bucyou.mydns.jp/up_source2/codeview.php?fn=3

コンパイラはVC2008Express、boostのバージョンは1.38です。


316 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 11:25:38 ]
> ( (_1->*_x) += 0.5),

( (_1->*_x) += constant(0.5))
ってすればいいんでは?

317 名前:316 mailto:sage [2009/04/10(金) 11:31:06 ]
同じ環境動作確認済み

出力結果
1, 1
10, 1
10, 20
10.5, 20
10.5, 20.5

318 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 14:44:28 ]
それが
> 回避方法はもう分かったのですが
ってことだと思う。なんで0.5の場合はconstantつけないとおかしくなるの?って質問では。

319 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 16:11:25 ]
0.5がラムダ式として扱われず、すぐに評価されてしまうから
constantを付けることで、ラムダ式にして評価を遅延させる。
constantを付けないと(_1->*_x)なラムダ式に0.5を加算して
おかしなことになる。

320 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 17:51:10 ]
更新しました。今週はビルドシステムとドキュメントとGraphを中心にかなり大量の更新が為されています。
ttp://booster.x0.to/
以下更新内容の一部
[Graph]
Merged headers and source files (but not examples, tests, or docs) from Parallel BGL
[Spirit]
New lexer guts struct: note detail namespace!
[Wave]
Use data() accessor on state_machine.
[Mpl]
add mpl::char_ and mpl::string, fixes #2905
[Program_options]
Merge from release:
[Detail]
Avoid an unnecessary copy in 'operator[]'
[Exeption]
added functions: current_exception_diagnostic_information, current_exception_cast
[Graph,Mpi,Pending,Property_map,Python,Signals]
Moved property map library into property_map/ directory;
made old files into stubs with #warnings;
converted uses and docs of property map library to use new names
[Flyweight]
fixed a thread safety bug in refcounted
[Math]
signbit can return either zero or not, rather than true/false.
[Format]
Fixed unused parameter - bug #2455
[Config]
As of STLport 5.2, unordered_set and unordered_map have been moved
from the std:: namespace to the std::tr1:: namespace
[Asio]
Prevent locales from affecting the formatting of endpoints. Fixes #2682.

321 名前:315 mailto:sage [2009/04/10(金) 20:58:38 ]
>>319
ありがとうございます。
警告レベルを/W3から/W4へ引き上げたら、「代入演算子が生成できない」という警告が出ました。
警告の内容はよく分からないんですが、やっぱり型がおかしかったみたいです。


// Release設定でコンパイルしたら何故か正常に計算されて笑いましたけど。


322 名前:デフォルトの名無しさん mailto:sage [2009/04/10(金) 21:22:27 ]
>>321
ReleaseとDebugどちらか片方でのみ正常に動作する場合、
参照先が「初期化されていない」か「既に解体されている」ことが多い。

315は「+=」で生成されるオブジェクトが0.5をconst参照で保持しているのが問題。
0.5は一時変数なので、funcの初期化が完了した時点で解体される。
「=」が正常に動作するのは、10.0をコピーして保持しているため。
constant(0.5)も同様。

323 名前:デフォルトの名無しさん [2009/04/12(日) 16:25:57 ]
typedef boost::mpl::vector<int, char, std::string> vector;
typedef boost::mpl::if_c<boost::is_pod<boost::mpl::_1>::type::value,
boost::add_pointer<boost::mpl::_1>::type,
boost::mpl::_1,
> operate;
typedef boost::mpl::transform<vector, operate>::type result;

mpl::transform の Op に mpl::if_c は使えないの?

324 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 19:59:48 ]
そもそも使い方がめちゃくちゃなんだが何がしたいんだ。



325 名前:デフォルトの名無しさん [2009/04/12(日) 20:22:51 ]
typedef boost::mpl::vector<int, char, std::string> vector;
typedef boost::mpl::if_<boost::is_pod<boost::mpl::_>, boost::add_pointer<boost::mpl::_> ,boost::mpl::_> operate;
typedef boost::mpl::transform<vector, operate>::type result;
を、if_cに書き換えたんだけど・・・
typedef boost::mpl::vector<int, char, std::string> vector;
typedef boost::mpl::if_c<boost::is_pod<boost::mpl::_>::type::value, boost::add_pointer<boost::mpl::_>::type, boost::mpl::_> operate;
typedef boost::mpl::transform<vector, operate>::type result;

typedef boost::mpl::transform・・・の行をコメントアウトすればコンパイルは通る。

めちゃくちゃってどこが?



326 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 20:53:39 ]
using namespace boost::mpl::placeholders ;
typedef boost::mpl::if_< boost::is_pod< _1 >, boost::add_pointer< _1 >, _1 > operate ;

これで通るはず。
そもそもな、lambda expressionは、その時に評価してもしょうがないだろ。
add_pointer<_1>::type とした時点で、メタ関数は評価されているんだ。
transformの中で評価させたいんだから、早漏はコンパイラに嫌われるぞ。

>>325
そりゃ当たり前だ。transformに通さなきゃコンパイルは通るだろ。
こんどはunaryですらなくなってるぞ。



327 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 20:56:32 ]
struct print_type
{
template < typename T >
void operator () (T) const
{
std::cout << typeid(T).name() << std::endl ;
}
} ;


int main()
{
using namespace boost::mpl::placeholders ;

typedef boost::mpl::vector< int, char, std::string > vector;
typedef boost::mpl::if_< boost::is_pod< _1 >, boost::add_pointer< _1 >, _1 > operate ;
typedef boost::mpl::transform< vector, operate >::type result ;

boost::mpl::for_each< result >( print_type() ) ;
}

動いてるみたいだな。

328 名前:325 [2009/04/12(日) 21:11:53 ]
>>326
>typedef boost::mpl::if_< boost::is_pod< _1 >, boost::add_pointer< _1 >, _1 > operate ;

なら期待した動作することは確認済みです。
if_c でやりたい。

329 名前:325 [2009/04/12(日) 21:12:37 ]
>>327
>>328


330 名前:デフォルトの名無しさん mailto:sage [2009/04/12(日) 21:19:32 ]
それは無理というものだ。
なぜなら、if_cは、メタ関数ではなく、boolを要求するんだから。
lambda expressionにしようがない。すぐに評価されては困るんだよ。
boost::is_pod< _1 >::type:value と、ネストされた型や定数を見た時点で、すでにinstantiateされる、つまり評価されているんだ。

331 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 15:21:46 ]
javaの拡張scalaの上をいくものはできないものかなあ

332 名前:デフォルトの名無しさん mailto:sage [2009/04/15(水) 16:57:44 ]
>>331
Scalaのどの機能が欲しいの?おせーてプリーズ。

333 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 17:57:49 ]
boost::unit_test_frameworkについて質問です。

今、std::wstring ToWide(std::string& rhs) という関数があり
この関数をテストするために
  std::wstring ans = L"テスト";
  std::string str = "テスト";
  BOOST_CHECK_EQUAL( ToWide(str), ans );
というケースを書きましたが、コンパイルエラーになってしまいます。
  BOOST_CHECK( ToWide(str) == ans );
とは書けましたのでwchar_tが出力されるときはこっちにすればいいのですが
wstringを出力できるようにするにはどうすればいいのでしょうか。

最近boostを使い始めたので変なこといってたらごめんなさい。

334 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 18:53:18 ]
boost.lambdaから関数オブジェクト作ろうとすると
とんでもないタイプ量必要なのなんとかなんないの



335 名前:デフォルトの名無しさん mailto:sage [2009/04/16(木) 18:54:32 ]
C++03の限界です。あきらめてください。

336 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 22:17:38 ]
更新しました。今週もドキュメントとビルドシステムの整備が多いです。
亦、boost_pythonのビルドをPython2.6.2ベースに移行しました。
ttp://booster.x0.to/
以下更新内容の一部
[Graph]
Merged in changes from Nick to distributed betweenness centrality
Merged in code and docs from Parallel BGL; CMake-based build system for tests and examples and docs is not working; src and doc can be built with bjam


[Mpl]
mpl::string is a bidirectional sequence, not random access; c_str is a separate metafunction, not a class static
fix off-by-1 errors
add and document BOOST_MPL_LIMIT_STRING_SIZE and mpl/limits/string.hpp
saving some additional template instantiations
[Math]
Add more instrumentation code, along with some AMD64/Linux fixes.
[Exeption]
fixing an error that caused warnings in diagnostic_information.hpp
[Signals2]
signals2/signal.hpp does not need to include signals2/shared_connection_block.hpp.
Fixed compile errors in c++0x mode.
[Interprocess]
Modified examples so that they can be run in parallel.
[Unordered]
Add stream output to the count test helper for unordered.
[Filesystem]
Fix #2948 - Path typedef moved to namespace boost::filesystem
Fix incompatibility between asio and ncurses.h due to the latter defining
a macro called "timeout". Fixes #2156.
[Program_options]
Sync trunk&release branches

337 名前:デフォルトの名無しさん mailto:sage [2009/04/17(金) 22:41:50 ]
>>336
乙!

338 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 15:35:43 ]
配列の要素数を変更する予定がなく、
しかしコンテナとしての扱いをしたい。

こんな場合にはboost::arrayがあるらしいですが、
これはstd::vectorよりも効率(速度やバイナリのサイズなど)
が良いのでしょうか?
std::vectorは標準ですからboost::arrayよりも
最適化の研究が(VC++やg++など有名どころで)なされているとか
そういったことは普通ないですよね?




339 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 15:41:09 ]
以前実測したときはvectorよりは多少効率が良い程度だったよ。
当然ながらarrayでも生配列に比べるとかなり効率悪かった。

340 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 15:46:08 ]
自分の環境で実測するしかないんじゃない

341 名前:338 mailto:sage [2009/04/18(土) 15:55:59 ]
>>339
ありがとうございます。
ご教示に従い、コンパイル時に数が決まっている状況では
生配列にすることも考えてみます。

>>340
やっぱそうですよね。
そもそも本当にそれがボトルネックになっているのかから考えないといけませんしね。。。


342 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 17:03:54 ]
>>339
最適化したのか?
vectorをreserveせずに増やしまくりとかじゃなければ、
配列だろうとarrayだろうと大した差はないと思うけど

343 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 19:25:06 ]
>>342
たしかに大差ないんだが、indexでのアクセスはやっぱ生より遅い。

344 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 19:42:39 ]
>>343
つまりは
実行スピードは
std::vector > boost::array >> 生の配列
か。



345 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 19:44:31 ]
それ実行時間w

346 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 19:54:37 ]
>>345
アウチ!
間違ったw

347 名前:デフォルトの名無しさん [2009/04/18(土) 21:29:19 ]
vectorと、固定長配列の違いは、動的かそうでないかだけでは。
vectorだと多く確保できるけど、HDDに移される可能性がありそれが速度低下の原因では

348 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 21:37:16 ]
環境依存の原因なんか挙げ始めればきりがない。
理論的には O(1) で同じと考えられる。

349 名前:338 mailto:sage [2009/04/18(土) 21:43:22 ]
>>342-348
なるほど。
みなさま貴重なご意見ありがとうございます。

350 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 21:44:05 ]
オーダーの話されてもなぁ。
ハッシュだって理屈の上ではO(1)だぜ?


351 名前:デフォルトの名無しさん mailto:sage [2009/04/18(土) 21:51:09 ]
>>350 で、何の話がしたいの?

352 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 01:58:00 ]
>>347
固定長配列は、(自動変数なら)スタックポインタを減算するだけで確保できる。
それと比べれば、ヒープから空きメモリを探してくるvectorというかnew[]は確保に時間がかかる。

その点ではboost::arrayが組込の配列と比べて遅くなる要素は無いはずなんだけど。
(もちろん最適化がしっかりしていて、アサート全OFFという前提のもと)

353 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 03:27:48 ]
> std::vector > boost::array >> 生の配列
なんか激しく疑わしいので比べてみた。@i386 gcc 4.1.2 -O2

for (size_t i = 0; i < size; ++i) cout << v[i] << endl;

生配列
.L21:
movl (%edi,%ebx,4), %eax
addl $1, %ebx
movl $_ZSt4cout, (%esp)
movl %eax, 4(%esp)
call _ZNSolsEi
movl %eax, (%esp)
call _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
cmpl %esi, %ebx
jne .L21
vector
.L15:
movl (%edi), %eax
movl (%eax,%ebx,4), %eax
addl $1, %ebx
movl $_ZSt4cout, (%esp)
movl %eax, 4(%esp)
call _ZNSolsEi
movl %eax, (%esp)
call _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
cmpl %esi, %ebx
jne .L15

まあ、確かに遅くはなると思うが・・・

354 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 12:48:08 ]
movl 2回で済むところが3回になるのだから、そこだけみると結構遅いだろ?



355 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 13:06:42 ]
movl (%edi), %eax
movl (%eax,%ebx,4), %eax

すごく無意味なことしてる気がするんだけど気のせい?
なんでこんなことしてるんだろ?


356 名前:デフォルトの名無しさん mailto:sage [2009/04/19(日) 13:25:25 ]
たまたま反復文の中が1行だったから比較的コストが高そうに見えるけど、
普通はそうじゃないよな。
うちのPCで国家予算分のジャリ銭を数え上げたら数分差が出るかもしれないけどさ。
(それでも分岐予測ミスによる揺らぎよりは小さそう・・・)

結局ありきたりの結論だけど
vectorが遅いかもしれないから生配列を使うことを検討するのに時間を使う方が
よっぽどコスト高だな。
int* vv = &v[0];
for (size_t i = 0; i < size; ++i) { cout << vv[i] << endl; }
とかすれば生配列と全く同じ速度になるわけだし。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<207KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef