- 1 名前:デフォルトの名無しさん mailto:sage [2009/05/04(月) 21:04:54 ]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part66 pc12.2ch.net/test/read.cgi/tech/1231640498/ ※part63, part66 が重複していたようですので part69 としました。
- 910 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:01:04 ]
- >>909
pimpl版と非pimpl版の2つがあるわけではないです。 pimplイディオムで実装することによって、注意しなければいけない事を増やしたくないという意味です。 MyClassのコピーコンストラクタやoperator=を書き忘れて(pimplじゃなければ書かなくてもOKだから忘れやすい) バグが発生したりしないために自動でディープコピーになってくれた方が便利だと思います。
- 911 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:14:55 ]
- >910
boost::any使いなされ。あれは値のセマンティクスになってるよ。 >774みたいに突っ込むコンテナによってセマンティクスを変える手もあるけど。
- 912 名前:907 mailto:sage [2009/06/11(木) 22:17:10 ]
- >>910
あー、言いたいこと分かった。 要は君自身、今のところは問題無くpimplイディオムを使えてはいるけど、 いつかうっかりしそうだからディープコピーなshared_ptrがあったら いいなぁ ってことだよね? でも >自動でディープコピーになってくれた方が便利だと思います。 いやいやそりゃ困るよ。 浅いコピーだからこそ生きるpimplイディオムの状況ってかなりあるのだよ。 例えばoperator=で浅いコピーにすることにより超高速なコピーが出来るわけ。
- 913 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:29:39 ]
- デフォでshallow copyで
deep copyは明示的にclone()を使うっていう決まりを作るとか
- 914 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:38:07 ]
- デフォはdeep copyで
shallow copyは明示的にdangerous_clone()を使う決まりの方がいいです
- 915 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 22:57:35 ]
- >>911
pimplにboost::anyを使うというのは初めて知りました。 確かに便利ですね。 弱点をあげるなら、速度が若干遅くなりそうなところでしょうか。 >>912,913 >>914の方が私は直感的にわかりやすく感じます。 ありがとうございました。
- 916 名前:デフォルトの名無しさん mailto:sage [2009/06/11(木) 23:07:55 ]
- 直感的にわかりやすいかどうかよりも、間違いが起こりにくいという点で>>914の方がいいなあ。
間違えてデータ壊れるか、間違えて処理が遅いか、なら後者の方がいい
- 917 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 00:48:51 ]
- C++はヒープの無い環境でも使えるようになっていて、
組み込みでも実際使われている。 それをデフォでdeep copyなんかにされたらたまったものじゃない。
- 918 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:09:30 ]
- deep copyだとまずい理由がある時は明示的にshallowにすればいいじゃん。
deepで困るケースは少ないんだからデフォはdeepでOK。 つーかshallow copyによる高速化とpimpl関係なくない?たまたま一石二鳥になっているだけで。
- 919 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:19:44 ]
- そもそも、pimplで深いコピーにするのが不可能でも特別面倒でもないでしょ。
ほかのメンバ関数と同じ調子で、コピーコンストラクタとoperator =を定義するだけのはず。
- 920 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 01:25:56 ]
- だからコピーコンストラクタと代入演算子を定義し忘れるから
Pimplはdeep copyをデフォにして欲しいと言ってんの もしかしてアフォ?
- 921 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 02:22:00 ]
- shallow copyをする気がないなら、そもそもshared_ptrにしなくていいのでは。
auto_ptrやscoped_ptrにすれば、コピーコンストラクタと代入演算子を定義し忘れることはない (定義し忘れるとコピーがコンパイルエラー)。
- 922 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 03:05:27 ]
- >>921
auto_ptrもscoped_ptrも不完全型には使えない。 ttp://d.hatena.ne.jp/Cryolite/20060108 (不完全型によるコンパイラファイアウォールとスマートポインタの両立(その1)以降を参照) 空のデストラクタを書くのも手間だし、コピーコンストラクタと代入演算子を書くのも手間。 deep copyにしたくてshared_ptrを使いたいなんて言ってるやつはいない。pimplにぴったりのスマートポインタないっていう話。
- 923 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 04:03:21 ]
- うーん。明示的にデストラクタ書かなきゃいけないのがそんなにデメリットだとは思ってなかったんだが
まあ、気にする人も結構いるのか。
- 924 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 04:13:30 ]
- unique_ptrがoperator=でdeep copyしてくれればいいのに。
- 925 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 06:54:12 ]
- 当然じゃねーの?てな部分に疑問を呈す >>922 の様な人が声高に暴れて言語やライブラリのカオス度が濃くなるんだよな
科学技術とか未踏の分野の開拓なら役に立つかもしれんけど邪魔な存在だな
- 926 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 07:35:04 ]
- しかしpimpl_ptrは何回もrejectされている…
- 927 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 08:26:46 ]
- pimpl自体、きもいイディオムだから、あんなの使わなくて済むようななにかを追加して欲しい
- 928 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 08:27:37 ]
- 何の話をしているのかいまいちわからないが
ポインタ型があったとして A a, b; A *pa=&a, *pb=&b; pa = pb; こうしたら、aがbの値に上書きされるってこと? なんだがおかしいね。 *pa = *pb; だよね普通。
- 929 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 09:52:42 ]
- 個人的にpimplを使うようなでかいクラスは大体コンストラクタとかも
全部ソースで定義するのでscoped_ptrで問題なし
- 930 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:44:45 ]
- ちょいとしつもんだんですが、
30,000x30,0000x4程度のbool配列と、30,000x30,0000のint配列を使いたいという思いでいっぱいです。 しかし単純に配列を作ってしまうと、やはりout of memoryです。 どうにかして要素数を減らすのが一番だとは思うんですが、 一般的に、このように膨大な要素の配列を扱わざるをえない場合にはどのような方法を用いるのでしょうか?
- 931 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:49:51 ]
- >>930
疎なデータならその部分だけを保持する
- 932 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 10:51:08 ]
- >>930
速度が滅茶苦茶遅くていいならファイルをメモリと見なし operator[]をオーバーロードするとか
- 933 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:09:18 ]
- >ちょいとしつもんだんですが、
質問団?w そのくらいの量なら、64bitOSで普通にnewでもvectorでも持てると思うけど。 まぁ、swapされるのは覚悟する必要があるな。 処で、それ本当に必要なの? 疎行列として扱うとか、boolではなくcharかbitで保持するとかできない?
- 934 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:29:57 ]
- >>933
>64bitOSで普通に さらっと、OSレベルで条件付け加えんなw アフォか
- 935 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:32:54 ]
- >>934
2バイト整数を3万掛ける3万なら、32bitOSでも普通にOK。 今時、Windowsでも2GB位積んでるのが当たり前だしね。
- 936 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:38:47 ]
- > 30,000x30,0000x4程度のbool配列と、30,000x30,0000のint配列を使いたいという思いでいっぱいです。
30,0000?
- 937 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:41:11 ]
- うお、それは気づかなかった。30万なのか?w
- 938 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:43:13 ]
- 2G程度あっても無駄無駄無駄ーなのです
- 939 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 11:58:11 ]
- ごめんなさい!3万x3万です!ちなみに768MBしか積んでません><クズです!
>>931-933 0or1のフラグとして使うつもりでboolを使いました。 やろうと思っていることは、「生物学で使うDNA塩基配列のアライメント」で int 3マンx3マンを隅から数値を埋めていく一方で、 その数値を確認しながら条件に従って、その要素に対応するboolの配列の要素1-3に1or0を入れていく。 ということを行っています。 intの配列array[i][j]については[i+1][j+1]まで処理した時点で破棄できるのでもっと少なくできると思うんですが、 bool配列についてはすべて埋め終わった後に、もう一度フラグの確認をしていくのですべて残しておく必要があります。 ちなみにbool型が一番サイズが小さいと勝手に思い込んでいました。
- 940 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:05:43 ]
- なんだか良くわからないけど,計算用の鯖用意すれば解決するんじゃないかな^^;
パソコンでやるなら>>933とか. でも > int 3マンx3マンを隅から数値を埋めていく一方で、 > その数値を確認しながら条件に従って、その要素に対応するboolの配列の要素1-3に1or0を入れていく。 これって注意深く行うとすると,今状態[3万×3万]と次状態[3万×3万]が必要になるんじゃないかい? 軽くめんどくさい
- 941 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:26:39 ]
- int配列やbit配列の要素間で、相互参照がないなら
ストレージに対して、逐次読み出し、逐次書き込みで いいんじゃねーの。
- 942 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:31:29 ]
- 塩基配列なら AGTC の4種
30kx30k 900M 1bit データなら 900M/8 = 112MB 塩基配列なら4種2bit 900M/4 = 225MB メモリに載せるのは可能っぽい
- 943 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:35:52 ]
- >>939
768MBでも仮想記憶があるから屑だなんて言っちゃイヤ! と言うのはさておいて。 >intの配列array[i][j]については[i+1][j+1]まで処理した時点で破棄できるのでもっと少なくできると思うんですが、 これは、相互参照があるってことなのかな? だとしても、1行3万点として前後1行ずつで併せて3行がメモリにあれば事が足りるよね。 後は、ディスクをぶん回すことになるけどなんとかなりそうだ。 # 最初は1000x1000くらいに絞って作らないとデバッグの段階で死ねるね。
- 944 名前:デフォルトの名無しさん mailto:sage [2009/06/12(金) 12:51:27 ]
- 連続領域で取ることができないだけなので、int**にして3万を3万回動的確保すればいけるんじゃないの?
|

|