俺俺scoped_ptr

3
普通のC++使い、銀天すばる @SubaruG

というわけで俺々 scoped_ptr つくった。ちなみに未完成品。 http://gist.github.com/713685 RT @SubaruG: boost::scoped_ptr はカスタム削除子を指定できないのと release 出来ないのが不満。

2010-11-24 23:03:00
普通のC++使い、銀天すばる @SubaruG

完成品では、 std::auto_ptr のカスタムデリータ対応版と相互利用できるようにしようかと。まぁ std::unique_ptr さんがいれば要らないんだけど、私用以外で大手を振って std::unique_ptr を使えるのは何年後になるか分からんし。

2010-11-24 23:04:12
普通のC++使い、銀天すばる @SubaruG

んー。やっぱ auto_ptr 系列は危険だから、 move_type を使うべきやもしれん。

2010-11-25 01:29:09
普通のC++使い、銀天すばる @SubaruG

new 演算子を多重定義するのは落とし穴も多いから、お勧めはできん。いや、分かって使う分には問題ないけど。 new 演算子は原理的に例外安全だし。

2010-11-25 17:07:24
普通のC++使い、銀天すばる @SubaruG

つまり、コンストラクタで例外が投げられてもリークしない。正しく実装すればね。

2010-11-25 17:09:02
普通のC++使い、銀天すばる @SubaruG

言い換えるなら、例外安全的にアトミックな操作なんですよ、 new 演算子呼び出しは。

2010-11-25 17:10:57
普通のC++使い、銀天すばる @SubaruG

マルチスレッド的にはどうだか知らない。

2010-11-25 17:11:39
Fadis @fadis_

例外はスレッドをまたいで影響が出る性格のものではないと思います。無論コンストラクタ中で他のスレッドと同期してたらデッドロック等が起こる可能性はありますが QT @SubaruG: マルチスレッド的にはどうだか知らない。

2010-11-25 17:16:55
普通のC++使い、銀天すばる @SubaruG

new は「メモリを確保」して「オブジェクトを構築」する。このときメモリ確保に必要な引数とオブジェクト構築に必要な引数は別々に受け取る必要があるので、関数ではなく演算子なのです。

2010-11-25 17:19:15
普通のC++使い、銀天すばる @SubaruG

引数を pack できるなら関数でもいいんだけどね。

2010-11-25 17:20:20
普通のC++使い、銀天すばる @SubaruG

@fadis_ いや、例外安全的にはアトミックだけど、マルチスレッド的にはアトミックかどうかは知らないって意味。

2010-11-25 17:21:39
普通のC++使い、銀天すばる @SubaruG

マルチスレッド的にアトミックってのは語弊があるにゃ。ロックフリー?

2010-11-25 17:23:37
Fadis @fadis_

@SubaruG マルチスレッドにおける(スレッドセーフではなく)アトミックは一般的なシステムでは1命令で実行されるってのと等価なので、そっちの意味でのアトミックの条件を満たしていたらむしろビックリだと思いますw

2010-11-25 17:26:05
Fadis @fadis_

スレッドセーフ: 途中で別のスレッドが割り込んできても正しい結果が得られる アトミック: 途中で別のスレッドが割り込んでくることは絶対に無い

2010-11-25 17:28:29
Fadis @fadis_

mutexとか使って適切な順序で処理するのはスレッドセーフだけどアトミックではない

2010-11-25 17:29:15
普通のC++使い、銀天すばる @SubaruG

@fadis_ 厳密にアトミックって意味ではなく、実質的に、ですね。例外安全だって、例外の投げうる処理を2つやってるので、厳密にはアトミックじゃないのです。

2010-11-25 17:31:20
普通のC++使い、銀天すばる @SubaruG

new 演算子呼び出しでは内部で try ~ catch 相当の処理が必要になる。実際には最適化がかかるだろうけど。

2010-11-25 17:33:47
普通のC++使い、銀天すばる @SubaruG

例外安全的にアトミックって表現、少なくとも Exeptional C++ では使われてた筈。

2010-11-25 17:43:57
普通のC++使い、銀天すばる @SubaruG

そういや one-phase construction はスレッドセーフらしいですね

2010-11-25 18:09:50
普通のC++使い、銀天すばる @SubaruG

mutable メンバのないクラスの const オブジェクトはスレッドセーフ。

2010-11-25 18:12:25
普通のC++使い、銀天すばる @SubaruG

mutable メンバの是非はマルチスレッドを使うか否かで大きく主張が分かれるよね。僕は是派だけど(遅延評価おいしいです)、マルチスレッド考えると厄介だというのには同意できる。

2010-11-25 18:13:44
普通のC++使い、銀天すばる @SubaruG

mutable メンバを持ったクラスの場合、スレッディングポリシーを指定できるようにするのがマルチスレッド対策ではベストかなー。侵入的にやらなきゃいけない分だけ面倒だけど、外付けはもっと面倒だし。

2010-11-25 18:15:10
普通のC++使い、銀天すばる @SubaruG

侵入的で厳密な(つまりmutableのない) const があると面白い。文法は更に複雑化するけど。

2010-11-25 18:17:05
1 ・・ 4 次へ