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


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

Boostを語れゴラァ part3



1 名前:デフォルトの名無しさん [2006/09/23(土) 15:00:11 ]
語って.はぁと part boost::mpl::int_<3> 

前スレ
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/ 

492 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 16:05:56 ]
boost開発者向けMLに、自分用に作った
プログラム(boostの既存libの部品の追加してるだけだけど)、
死蔵するのもったいないから
ときどき投稿してたんだけど、
最近、無視されてるっぽい。

493 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 17:41:27 ]
boost使いはVS2005にSP1はあてるのかい?

494 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 17:56:40 ]
当たり前だ

495 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 21:36:36 ]
>>492
何か不満か? ML に晒したんなら勝手に使ってる奴もいるだろう。
使った人が必ずレスポンスを返すわけでもなし。
死蔵にはならずに済んだんだからいいだろ。

496 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 22:52:25 ]
boost.cppll.jp 落ちてる?

497 名前:デフォルトの名無しさん mailto:sage [2006/12/21(木) 23:29:55 ]
ぽいね。俺も繋げない

498 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 11:42:53 ]
ublasのatlasへのインターフェイスをbackendと表現してるのだが
backendってそういう意味なんだっけ?

499 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 12:01:23 ]
まあCORBAとDCOMではproxy/stubが逆転していることですし

500 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 15:15:00 ]
>>499
それは主体をどっちに置くかという話から帰着した結果だからあんまり関係ない気が。




501 名前:デフォルトの名無しさん mailto:sage [2006/12/22(金) 23:08:58 ]
atlasは下請けや補完をやるわけだから、
ublasから見ればたくさんあるbackendの一つってことでしょ。

502 名前:デフォルトの名無しさん [2006/12/24(日) 12:39:36 ]
boostの日本語ドキュメントプロジェクトって2003年で更新止まってるよね
サーバーも落ちてるみたいだけど、誰もメンテナンスしてないの?

503 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 17:51:43 ]
ublas今試してるんだけど、
VC++2005でboost1.33_1だとsparse_matrixとsparse_vectorは定義されていないと怒られてしまう。
matrix_sparse.hppとvector_sparse.hppはきちんとインクルードしているんだけど、なぜに?


504 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 18:41:52 ]
しかも、mat[i][j]とかで行列の要素にアクセスするとか、lu_factorizeもコンパイルエラー。なんでやろ・・・。

505 名前:デフォルトの名無しさん mailto:sage [2006/12/24(日) 18:49:16 ]
エラーメッセージも張らずに日記かよ。いい加減にしろ

506 名前:デフォルトの名無しさん mailto:sage [2006/12/25(月) 13:27:53 ]
>>504
mat[i][j]の書き方はできなくなった
今は
mat(i,j)


507 名前:デフォルトの名無しさん mailto:sage [2006/12/25(月) 13:47:21 ]
Boost.Python でPythonから呼ぶようにした関数って
Cとして呼ぶよりも処理が遅くなったりするの?


508 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 16:16:15 ]
すみませんが、質問です。
Debian Sarge(EUC-JP)上でBoostのsplitなどをを使いたいのですが、ソースコー
ドの文字列をEUC-JPにするとエラーになってしまいます。

#include <boost/algorithm/string.hpp> を含むソースで
g++-3.4 -finput-charset=EUC-JP -fexec-charset=EUC-JP test05.cpp -o test05
を実行すると、
/usr/include/boost/function/function_base.hpp:23:25: failure to convert EUC-JP to UTF-8
このようなエラーに。
なお、ソースではwchar_t, wstringを使っています。

ソースをUTF-8に、オプションを-finput-charset=UTF-8 にすると動くように
なりますが、やはりこれは不便です。

ソースをEUC-JPのままで使う方法はないでしょうか?


509 名前:デフォルトの名無しさん [2006/12/26(火) 18:55:42 ]
age

510 名前:508 mailto:sage [2006/12/26(火) 19:42:26 ]
追記です。
コンパイル時のエラーは、こんな単純なソースでも起こってしまいます。
エラー再現には、ソースにワイド文字リテラルが含まれる必要はありません。
------------------
#include <boost/algorithm/string.hpp>

int main(void)
{
return 0;
}
------------------
g++-3.4 -finput-charset=EUC-JP -fexec-charset=EUC-JP test06.cpp -o test06

/usr/include/boost/function/function_base.hpp:23:25: failure to convert EUC-JP \to UTF-8

EUC-JPではマルチバイト文字を使えということなのかもしれませんが、せっかく
対応しているのだからワイド文字を使いたいのです。




511 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 19:56:55 ]
>>510
boost/ref.hppがLatin-1で書かれているのが問題っぽいな。
ASCIIに直すようにお願いする位しか解決策が思いつかないが。

512 名前:508 mailto:sage [2006/12/26(火) 20:20:55 ]
>>511
ありがとうございます。
ref.hppの17行目でしょうか?そこを削除しても、やはり同じエラーが出ます。

他に気づいたことは、-finput-charset=utf8 などと書いても、「UTF-8に変換
できない」というエラーになることです。大文字ハイフン入りの「UTF-8」以外
受け付けません。

もしかしたらGCC自体が、テンプレートライブラリがUTF-8以外であることに対応
していないのでしょうか?


513 名前:デフォルトの名無しさん mailto:sage [2006/12/26(火) 20:38:10 ]
>>508
この辺を参考に
search.gmane.org/?query=windows+unicode+gcc&group=gmane.comp.gcc.devel
permalink.gmane.org/gmane.comp.gcc.devel/78542

>>512
インクルードファイルの中に他にも含まれていないか
チェック。utility/enable_if.hpp とか

$ iconv -l

で使用できる文字コードは分かる

514 名前:508 mailto:sage [2006/12/26(火) 21:08:11 ]
>>513
ありがとうございます。よく読んでいませんが、結局コードの変換ルールが問
題ということでしょうか。

grep -r Jaakko /usr/include/boost/

これで検索したところ66件ありました。他にもlatin-1の名前はあるかもしれ
ません。さすがに直す気が失せました。

とりあえず、コンパイル前にiconvをかけることにします。いずれはUTF-8環境
に移行した方が良さそうです。


515 名前:508 mailto:sage [2006/12/27(水) 00:25:09 ]
permalink.gmane.org/gmane.comp.gcc.devel/78542
を読んで思ったのですが、どうやらUTF-8にすれば完全解決というわけではな
いようですね。

g++ -finput-charset=EUC-JP

こう書くと、GCCはソースファイルを、includeされるヘッダライブラリまです
べてEUC-JPだとみなします。そしてそれを libiconv で UTF-8 に変換しよう
とします。このとき(ヘッダファイルに)EUC-JPに含まれない文字コード
(Latin-1など)があったらエラーになってしまいます。

g++ -finput-charset=UTF-8 (または-finput_charsetの指定なし)

こう書くと、GCCはソースファイルを、includeされるヘッダライブラリまです
べてUTF-8だとみなします。しかし今度は変換の必要がないので、libiconv は
呼ばれません。ヘッダライブラリも変換されません。

これで通常は問題はなくなるわけです。しかし、

・ヘッダライブラリのエンコーディングがUTF-8でない。
・ヘッダライブラリに wcha_tのリテラルがある。

(あまりないでしょうが、)この2つが同時に起こると、ライブラリは正しく
動作しません。

結局、すべてのヘッダファイルがUTF-8で統一されるか、Pythonのように各ソー
スファイルにエンコーディングの宣言ができるようにしないと、完全解決とは
言えないようです。いずれも一ユーザにはどうしようもない話ですが。

Boostとあんまり関係なくてすみません。

516 名前:デフォルトの名無しさん [2006/12/27(水) 13:04:16 ]
初心者的質問で申し訳ありません。
>>391でインストールするとき、最初に
default variantsを選んでください
って言われて、
Multithred Debug, DLL
Multithred, DLL
Multithred
Multithred, static runtime
Multithred, Debug, static runtime
Single thred, static runtime
Single thred, Debug, static runtime
の中から選択させられるんですが、ノーパソ用ペンティアム3(1.13GHz)とノースウッドコアペンティアム4(3.2Ghz)
の場合、どれを選べばいいんでしょうか。
マルチスレッデッィングとシングルスレッディング用CPUの違いくらいしか分からないので・・・

517 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 14:35:53 ]
Multithred/Single thredはCPUの問題じゃない


518 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 14:36:53 ]
boostにはデバッグは特にいらないと思う。かなりでかくなるから。
DLLにするかどうかだけど、初心者ならスタティックでいいと思う。
あとはスレッドを利用するならマルチスレッド、しないならシングルスレッド。
シングルスレッドで速度を追求するならシングルスレッドだけど
通常はマルチスレッドでいいと思う。

519 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 14:37:16 ]
thred?

520 名前:518 mailto:sage [2006/12/27(水) 14:37:42 ]
訂正
×特に ○別に



521 名前:516 [2006/12/27(水) 14:45:12 ]
ありがとうございます。
ではとりあえず
Multithred, static runtime
でインストールして使ってみます。
なお、参考までにお聞きしたいのですが、DLLにするとどういった使い方が可能になるのですか?

522 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 14:49:20 ]
templateなlibraryにDLLもくそもないから気にするな。

523 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 15:11:02 ]
>>521
DLLの特長はここに書いてある。
e-words.jp/w/DLL.html
必要ならDLLを選ぶといいと思う。

524 名前:デフォルトの名無しさん [2006/12/27(水) 16:19:19 ]
vc2005 sp1の現状

std;;wstring s = L"漢字";
// std::wcout << s << std::endl; //←ここをコメントアウトすると何もでなくなる
std::wcout.imbue(std::locale("japanese")
std::wcout << s << std::endl; //←出る
std::locale::global(std::locale("C"));
std::wcout << s << std::endl; //←出る

よくわかんないけどMSの開発担当者はもっとまともなロケール実装者が来るまで正座な。


525 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 16:22:23 ]
boostとは直接関係ないけど、これ直ってないのか。なんのためのSPなんだか('A`)

526 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 20:10:24 ]
>>524
とりあえずSTLport使っとくとlocale::globalの後に
それぞれimbueすればちゃんと動くらしいよ。
付属のだとそれすら効かない。

std::locale loc("japanese");
std::locale::global(loc);
std::wcout.imbue(loc);
std::wcout << L"ぶーすと" << std::endl;

527 名前:デフォルトの名無しさん mailto:sage [2006/12/27(水) 23:15:10 ]
ublasでrankは求められなかとですかい?
rank求めるのにlu分解は精度の問題で、一般には使われてないとか書いてるけど、
どの程度精度に問題でてくるんだろうね。

528 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 12:41:32 ]
ttp://www.page.sannet.ne.jp/d_takahashi/boost/ublas/index.htmlを参考にして
ublasで逆行列を求めようとしているのですが、lu_factorizeの呼び出しでコンパイルエラーになります。
エラーメッセージが大量なので、ソースと一緒にアップローダに上げておきます。
ttp://zetubou.mine.nu/itoshiki/nozomu/zetubou3677.zip

529 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 13:06:13 ]
実行時エラーなら出るがコンパイルエラーは出ないな。
VC8SP1 + Boostは11月の頭にCVSから

F:\>cl -nologo -EHsc -ID:\Boost inv.cpp
inv.cpp

F:\>inv.exe
Check failed in file D:\Boost\boost/numeric/ublas/triangular.hpp at line 2435:
e1 () (n, n) != value_type ()

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

F:\>


530 名前:デフォルトの名無しさん mailto:sage [2006/12/28(木) 15:50:10 ]
November 28, 2006 - Function Types Accepted



531 名前:デフォルトの名無しさん mailto:sage [2006/12/29(金) 19:50:03 ]
VC7 でserializationのlib出きへんのやけど
なんか必要?

532 名前:528 mailto:sage [2006/12/29(金) 20:29:50 ]
boostを1.32.0に入れ替えてみたところコンパイル出来ました。
実行時エラーは、おそらく係数行列を適当に設定したため発生したのだと思います。
係数行列を参考サイトと同じ行列にしたところ、同様の結果が得られました。
ublas使う時だけ1.32.0で行くことにします。ありがとうございました。

533 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 10:46:57 ]
>>3にリンクされてるPOCOって使ってる人いる?
今日落として試してみたんだけど、SampleについてるEchoServerの挙動が
微妙におかしくて……
原因は一応分かったのだが、英語力が無いからまっとうなバグレポ
送れにゃいよ。


534 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 14:13:46 ]
>>533
英語力ないからって言ってると永遠に身につかないよ。
バグレポなら状況を箇条書きにして送るだけでも大丈夫、ただし返信が来たらしらない(w


535 名前:デフォルトの名無しさん mailto:sage [2007/01/03(水) 14:59:14 ]
>>534
そうだよなあ。
とりあえず、がんがって次のようなバグレポを書き込んだ。
意味が通るかどうかは全く自信が無いw


Hello.
I'm a Japanse, so please forgive my poor English.

When I tested "EchoServer" sample, I found that it doesn't send back FIN to the client when the client sends FIN to the "EchoServer", by calling shutdown().

This is because "EchoServer" doesn't call close() function for this socket.

Why is that?

Poco::Net::StreamSocketImpl is refcounted, and close() is called when it is really destructed.

I found that Poco::Net::SocketReactor's member, _pReadableNotification, _pWritableNotification, etc. holds Poco::Net::Socket instance, until next socket event arises.
So, until then, refcount remains 1, and close() is never called.

In Poco::Net::SocketReactor::run(),
member function dispatch() is called for each socket.
I think, after that, the socket which is held by _pReadableNotification, etc. must be immediately cleared, so Poco::Net::StreamSocketImpl's refcount will be 0, and close() will be called.

536 名前:デフォルトの名無しさん [2007/01/04(木) 13:26:47 ]
boost の program_options で言及されているレスポンスファイル
に関する機能って、以前は configuration file って呼ばれていた
ものですか?単に呼び方が変わっただけですか?
www.boost.org/doc/html/program_options/howto.html#id2715898

537 名前:536 [2007/01/04(木) 13:32:57 ]
1.33.1 のソースを見てみると、
// Additional command line parser which interprets '@something' as a
// option "config-file" with the value "something"
なんて書いてあるなぁ、前からあった機能なのか。
なんか俺が勘違いしていたみたいです。

538 名前:536 [2007/01/04(木) 13:42:23 ]
追加のオプションをファイルで与えることが出来る
multiple source の機能と、コマンドラインそのものを
ファイルの形で与える response file の機能を
混同していたようです。

539 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 14:35:43 ]
ある大学でresearch programerっていう仕事の公募が出てる
research programerていうのはboostの開発してるような人達なのかな

540 名前:536 [2007/01/04(木) 14:42:44 ]
>>539
頼まれてシミュレータなどのコードを書く人のことじゃないかなぁ。



541 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 16:05:49 ]
>programer
programmer

542 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 17:55:53 ]
>programmer
programer

543 名前:デフォルトの名無しさん mailto:sage [2007/01/04(木) 19:01:27 ]
pugeramer

544 名前:535 mailto:sage [2007/01/05(金) 04:25:51 ]
POCOにバグレポ書いたと思ったら、もうFixされたバージョンリリースされてた。
はえー。
拙い英文でもバグレポ書いた甲斐があったわ。
勇気付けてくれた >>534 あんがと。

545 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 11:12:28 ]
英語力がないから>535の意味を掴み切れない_/ ̄|○
#今年は真面目に(系統立てて)勉強するかな……

546 名前:535 mailto:sage [2007/01/05(金) 12:11:30 ]
>>545
俺のアホな英文が分からないのは、多分君のせいじゃない。
相手はプログラムを良く理解してるから、クラスやメソッド名などのキーワードを
見て、問題を理解してくれたんだと思う。

今日も POCO を眺めてみたが、std::string ベースなので Path クラスが
日本語名を上手く扱えないという実にありがちな問題が……。
一見すると POCO_WIN32_UTF8 を定義して utf-8 ベースでやってれば
上手く機能しそうにも見えたが、たまにそのまんま std::fstream とかに
渡してるから、やっぱダメだな。

つうかいつになったらWindowsはja_JP.UTF8風なコードページをサポートして
くれるんだ。OS内部だけUTF-16化されてたってしょうがないだろうに。

547 名前:デフォルトの名無しさん mailto:sage [2007/01/05(金) 12:41:48 ]
>>546
無理
ttp://blogs.msdn.com/michkap/archive/2007/01/03/1392379.aspx

まあ、ここでも言われているけど、
98がラッパでUnicodeをサポートできるように、
UTF-8のラッパをかぶせられないこともない。
どれほどの需要があるのか分からないけど。

548 名前:デフォルトの名無しさん [2007/01/06(土) 09:17:55 ]
shared_ptrやweak_ptrのソースを調べてるんだけど、
shared_ptrは内部でweak_ptrを使ってるようだけど、これは何のため
なんだろうか。weak_ptrはshared_ptrの循環参照の欠点を克服できる
という話を聞いてるんだけど、shared_ptrのなかにすでにweak_ptrが使われてる
ということは、もうshared_ptrは循環参照を克服したってことでいいんですか?

違うとしたら、weak_ptrをどう使ってshared_ptrの循環参照を克服できるのか
教えてください。weak_ptrのソースみてみると、なんだかweak_countという
別のカウンタを使っているだけで中身はほとんどshared_ptrと同じように参照カウンタ方式
にみえるんだけど、これで本当に循環参照、解決するんだろうか…?


549 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 10:05:47 ]
ttp://www.kmonos.net/alang/boost/
ここのスマートポインタってところ読んでから来いや。

550 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 10:12:40 ]
>もうshared_ptrは循環参照を克服したってことでいいんですか?
よくない。
weak_countは参照カウンタの参照カウンタとでも言えばいいんだろうか。

struct A { shared_ptr<A> a; }
shared_ptr<A> hoge(new A);
hoge.a = hoge;

struct A { weak_ptr<A> a; }
shared_ptr<A> hoge(new A);
hoge.a = hoge;

この二つでどのように参照カウンタが変化するのか、調べてみるといいよ。



551 名前:デフォルトの名無しさん [2007/01/06(土) 11:16:45 ]
>550

shared_ptrはカウンタ増えるけど、
weak_ptrはカウンタ増えないね。weak_ptrのカウンタはなぜ増えない??
代入で増えるように定義されてるように見えたんだけど

>549

いちおう読みました

552 名前:デフォルトの名無しさん [2007/01/06(土) 13:50:29 ]
循環参照が置きるshared_ptrの相互参照がある場合、
相互参照の片方をweak_ptrに置き換えて循環参照が解決できる、
という理解でよろしいんでしょうか、ご教授ください

553 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 13:51:53 ]
そんな事、人に訊かんとわかんないもんかね。

554 名前:デフォルトの名無しさん [2007/01/06(土) 14:34:16 ]
>553

これって実は誰でも知ってること??

555 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 14:36:23 ]
>相互参照の片方をweak_ptrに置き換えて循環参照が解決できる
この説明だと片方を単にポインタに置き換えるだけで良いじゃないか,という反論が
想定され, weak_ptr の本質的な利点と特徴を説明できていないような?

556 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 15:22:57 ]
>>554
皆知ってるかは知らんが、自分で結論出せないのなら
完全に理解できてないってことだ。

557 名前:デフォルトの名無しさん mailto:sage [2007/01/06(土) 15:45:06 ]
そりゃ完全に理解できてないから訊いてるんだろ。

558 名前:デフォルトの名無しさん [2007/01/06(土) 15:48:06 ]
>555

単にポインタに置き換えるだけだと、自動で消えないからマズいんですよね??
weak_ptrなら、相互参照の片方が消えたら自分も消えるんでウマいこと
いくってことでOK?

>556

結論を出してみたけど間違ってたまま覚えてたらまずいんで
合ってるのかどうかだけでも教えてください

559 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 03:14:24 ]
boostのUnitTestってCppUnitと比べてどんな感じですか?

560 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 03:26:17 ]
マグロとイカフライみたいな感じかな



561 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 03:32:22 ]
>>560 ありがとうございました

562 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 05:51:31 ]
ちょww

563 名前:デフォルトの名無しさん [2007/01/07(日) 13:58:09 ]
weak_ptrにいれたshared_ptrのカウントと、weak_ptrのカウントが
同じカウントになるような気がする。
つまりshared_ptrが消えるときにweak_ptrのカウントもゼロになって
同時に消える仕掛けになってると考えていいんでしょうか先生?

564 名前:デフォルトの名無しさん [2007/01/07(日) 15:19:12 ]
ちがった・・・入ってるshared_ptrが消えてもweak_ptrのカウントは1残った…
それまではカウント同じなのになぜ??

565 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 20:29:47 ]
>>558
>単にポインタに置き換えるだけだと、自動で消えないからマズいんですよね??
いや, weak_ptr の機能は参照先のオブジェクトの生存管理と直接は無関係です.
普通のポインタで参照していようが, weak_ptr で参照していようが,
shared_ptr による参照カウントが0になればそのオブジェクトは消えます.

単なるポインタと比較した場合の weak_ptr の利点は,

 -参照先のオブジェクトが生存しているかどうかを調べることができて,かつ
 -shared_ptr に格上げできる

ことです.

いずれにせよ, shared_ptr による循環参照の問題の解決するにあたって,
必ず weak_ptr の機能が必要になるわけではないです.
単に weak_ptr の機能を理解しようとするだけなら,
循環参照の問題はとりあえず脇に置いておいた方が良いような気がします.

566 名前:デフォルトの名無しさん mailto:sage [2007/01/07(日) 20:46:53 ]
>>563
shared_ptr の実装は,参照カウントによって管理されるオブジェクト
(A とします) と独立して,新たにフリーストア (ヒープ) 上に
参照カウント用のオブジェクト (X とします) を生成します.

X は, A の参照カウントと独立して自分自身の参照カウントも持っていて,
独立した2つの参照カウントを持っているイメージになります.

shared_ptr が1つ作られるごとに A の参照カウントと X の参照カウント両方が
1つ増やされ, shared_ptr が1つ破壊されるごとに
A の参照カウントと X の参照カウント両方が1つ減らされます.

weak_ptr が1つ作られるごとに X の参照カウントのみが増やされ,
weak_ptr が1つ破壊されるごとに X の参照カウントのみが減らされます.

A の参照カウントが0になれば A を delete します.
しかし, X の参照カウントが0になっていなければ X は破壊されません.

最終的に全ての shared_ptr と weak_ptr が存在しなくなった時点で,
X の参照カウントは0になります.この時点で X は delete されます (自殺します).

以上が, shared_ptr と weak_ptr の実装面での動作です.

567 名前:デフォルトの名無しさん [2007/01/08(月) 03:42:00 ]
>>566

うそ〜ん??shared_ptrはカウントを二種類持ってるってこと?
あ、sp_countと内部のweak_ptrの二種類のことを言ってる??

568 名前:デフォルトの名無しさん [2007/01/08(月) 04:04:00 ]
>weak_ptr が1つ作られるごとに X の参照カウントのみが増やされ,
>weak_ptr が1つ破壊されるごとに X の参照カウントのみが減らされます.

shared_ptr<A> hoge(new A);

cout << hoge.use_count() << endl;

weak_ptr<A> hogehoge(hoge);

cout << hoge.use_count() << endl;
cout << hogehoge.use_count() << endl;

試してみたらどっちも増えなかったよ

569 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 10:57:47 ]
>>568
weak_ptrのuse_countはweak_countを返すわけじゃないよ。
ドキュメント読め。

570 名前:デフォルトの名無しさん mailto:sage [2007/01/08(月) 18:09:37 ]
Boost.Timeseries
Boost.Accumrator
は結局アクセプトされたの?





571 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 13:46:37 ]

オブジェクトを参照している最後の shared_ptr が破棄されるとき、
weak_ptr の有無にかかわらず、そのオブジェクトは削除される。
ただし、オブジェクトを参照する weak_ptr が存在していた場合、
参照カウントを保持する sp_counted_impl_pd は削除されない。
(weak_ptr と shared_ptr すべてが破棄されないと削除されない為)

weak_ptr からポインタ参照を行いたい場合、
必ずロックして shared_ptr を取得するような設計になってるけど、
上記仕組みのおかげで、たとえ shared_ptr が存在しない状態でも
オブジェクトが破棄されていることが分かり、エラーを返すことが出来る。




572 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 16:13:31 ]
Statistical Distributions and Mathematical Special Functions
のレビューコメントが厳しいのばっかりなのはなんで?
最初 Boost.Mathとか名前ついてたときは、
ちょっと広すぎな名前だとは思ったけど

573 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 16:49:03 ]
>>572
>Statistical Distributions and Mathematical Special Functions
興味あるんだけどどのへん見ればいいの?
ポインティングよろしく


574 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 17:14:44 ]
boost-consulting.com/vault/index.php?PHPSESSID=bq352onkg7ogdbu4lundegolg1&direction=0&order=&directory=Math%20-%20Numerics

math-toolkit-code.tar.bz2


575 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 17:25:00 ]
>>574
Thanks!


576 名前:デフォルトの名無しさん mailto:sage [2007/01/09(火) 18:12:22 ]
>>548-571
通りすがりだけど、このやり取りで、weak_ptrがすっごくよく分かった!
日本語でこれだけちゃんとした説明はどこにもないと思う。ありがとう!

577 名前:デフォルトの名無しさん [2007/01/10(水) 21:17:34 ]
shared_ptrなんだけど、中にいれるオブジェクトが消えると
カウントが減りますよね。
でも、中のオブジェクトが消えたということを、shared_ptrはどうやって知るんですか?
代入演算子で上書きされたときについては、代入演算子の多重定義で
上書きされたほうをデクリメントしてるのは分かるんだけど、
スコープを抜けたときとかはshared_ptrには分からんのでは?
リアルタイムにオブジェクトが生きてるかどうかを監視してるわけでもないのに、
スコープ抜けてオブジェクトが自然消滅したときにもちゃんとカウントが
減ってるのって不思議すぎる。これ分かる人いる?

578 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 21:25:23 ]
>中にいれるオブジェクトが消える

>代入演算子で上書きされたとき

>オブジェクトが生きてるかどうか

この辺が果てしなく意味不明。
>>577はshared_ptrを全く理解していないようだ。

579 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 21:55:07 ]
ソース読めばわかるよ

580 名前:デフォルトの名無しさん mailto:sage [2007/01/10(水) 21:57:28 ]
>577
デストラクタ



581 名前:デフォルトの名無しさん [2007/01/11(木) 07:38:26 ]
shared_ptr<A> hoge(new A);
int i = 1;
while(i--){
shared_ptr<A> hogehoge(new A);
hoge = hogehoge;
cout << hoge.use_count() << endl;
}
cout << hoge.use_count() << endl;

こういう状態のとき、二番目のhoge.use_count()のときにはカウントが
一番目より一つ減るでしょ。それをhogeのカウンタはどうやって把握したの?
ってことを聞きたかったんです。
カウンタのデクリメントについては、ソースを読めば代入演算子の
部分で、代入元をインクリメントして代入先をデクリメントするってことが
書いてあるけど、代入したオブジェクトそのものが上のコードみたいに
スコープはずれて消えたときにデクリメントする処理なんて書いてないな、
と思ったんです。


>>580

代入元のデストラクタですか?
どうやって代入元のデストラクタで、shared_ptrのカウントを下げてるか分かりますか??


582 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 08:09:28 ]
>>581
カウンタもshared_ptrが保持するポインタと同じく共有されるよ。
shared_ptr<A> hogehoge(new A); //カウント1
hoge = hogehoge; //カウント2
} //hogehogeの破棄によってカウント1
その後hogeの破棄時にカウントが0になるのでdeleteが呼ばれる。

583 名前:デフォルトの名無しさん [2007/01/11(木) 09:19:43 ]
初歩的な質問で申し訳ないけれど、
shared_ptrはコンストラクタではいろんなオブジェクトを受け付けるけど
代入はスマートポインタしか受け付けないってのは正しい?
いちど初期化してしまうと、
あとから別のオブジェクトを入れるには他のshared_ptrにいれてから
本当に入れたいshared_ptrにそのshared_ptrを代入するしかありませんか?

584 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 09:41:04 ]
>>581
もうね、
> int i = 1
> while(i--){
の時点でC++理解してなさすぎ。

{
  shared_ptr<A> hogehoge(new A);
  hoge = hogehoge;
  cout << hoge.use_count() << endl;
}

これだけでスコープ限定できるの。
boostを理解しようなんて百年早い。
基礎からやり直しな。

585 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 09:55:44 ]
C++っていうかC

586 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:01:40 ]
>>584

んなどうでもいいことよりも少しは本質的な話をしたらどう

587 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:03:37 ]
do{
hogehoge();
}while(0);


hogehoge()は実行されますか?


588 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:28:53 ]
>>587

それは別のスレで質問したらいいと思う

589 名前:デフォルトの名無しさん mailto:sage [2007/01/11(木) 10:45:07 ]
>>583
reset すれば?

590 名前:デフォルトの名無しさん [2007/01/11(木) 10:47:47 ]
お前らと仲良くなりたくて、もっと weak_ptr について理解を
深めようと思ったが、頭が悪すぎて理解できなかった。

なんかやばそうだから循環参照が起きないように気をつけよう、
その程度の理解な俺が作っているプログラムを使わされている
やつカワイソス。



591 名前:デフォルトの名無しさん [2007/01/11(木) 10:49:54 ]
ちなみに俺の理解では weak_ptr は参照カウントを増減させないので
たとえ weak_ptr で参照されていたとしても実体が delete されて
いるかもしれん。だから weak_ptr の参照先が生きてるかどうか
ちゃんとチェックしてから使おうね、ってことなんだが。

592 名前:デフォルトの名無しさん [2007/01/11(木) 10:51:18 ]
生のポインタじゃなくて weak_ptr を使う理由は、
参照先のオブジェクトの生死を追跡することが出来るから。

えっと、ほかにうれしさある?






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

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

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