C++0x 6 ..
[2ch|▼Menu]
596:デフォルトの名無しさん
09/08/29 14:20:38
>>594
「よくわからないから」という理由でSTL禁止にしたウチのPMに言ってやってください

597:デフォルトの名無しさん
09/08/29 19:04:15
そういうのはマ板でやってよ…

598:デフォルトの名無しさん
09/08/29 20:25:54
STL禁止の所があるのかww

599:デフォルトの名無しさん
09/08/29 20:46:09
>>596
昔、若かったころはSTLでコンパイルエラーが出ても意味不明だったんだから許してあげてよ。


600:デフォルトの名無しさん
09/08/29 21:23:40
その後進歩してないってことだから許さない

601:デフォルトの名無しさん
09/08/29 22:28:22
>598
海外のソフトのカスタマイズではコーディング規約としてそういう縛りはふつうにあるよ
海外だと結構お年の人が現役でコード組んでるから、なるべくコードの意味が多重化する
機能を禁止する傾向がある

602:デフォルトの名無しさん
09/08/29 22:43:45
STLって使いやすいとは思わなかったから使ってなかったんだけど、boostと一緒に使うと驚くほど使いやすくなった。
BOOST_FOREACHとかiterator_adaptorとかiterator_rangeとかと組み合わせるとすごい強力で使いやすい。
STL使わなかった人もこれなら満足するんじゃないかな。


603:デフォルトの名無しさん
09/08/29 22:47:45
>>601
そうなんだ
車輪の再発明が好きなお年寄りが多いんだな
ご苦労なことだ

604:デフォルトの名無しさん
09/08/29 23:00:23
>603
それをカスタマイズする人たちが知る必要はないだけ
機能を提供する側はSTLをtypedefしているだけかもしれないよ

define が衝突するのでそれはないが

605:デフォルトの名無しさん
09/08/30 02:32:03
STLと例外がないC++なんて面倒くさくてやってられない

606:名無しさん@そうだ選挙に行こう
09/08/30 03:41:46
Boostの無いC++も面倒くさくてやってられない

607:名無しさん@そうだ選挙に行こう
09/08/30 05:19:31
C++03にすらついてきていない俗世の話はおいといて、スレに沿った話をしようぜ。
もっとも、Conceptが外れることが決まってC++0xは
ほとんど確定してしまったからあまりネタが無いと思うんで、
そろそろC++0xの次についてを話題にしても良いんじゃないかと思うね。
言語仕様はConceptは個別にTRとして世に出ることは無いとすっぽすっぽが言ってたから、
C++0xの次の標準まで待たなくてはならないことは確か。
わりと影響が大きそうなModules in C++(N2316)は個別TRを予定しているらしい。あとはGCがどうなるか。
ライブラリに関してはLibrary TR2として
URLリンク(www.open-std.org)
"〜 Accepted into TR2"と"〜 Planned for a Future TR"
からは大きくは違わないものが入るのはほぼ間違いない。
"Papers With an Open Status"になってるものも、改良されて入ってくる可能性が高いね。

他に何に入ってほしい?

608:名無しさん@そうだ選挙に行こう
09/08/30 06:11:47
N2316を見てみたが、Introduction読むだけで汁が漏れそうだ

609:名無しさん@そうだ選挙に行こう
09/08/30 06:14:50
STL w

610:名無しさん@そうだ選挙に行こう
09/08/30 06:20:34
>>607のリンクは正しくは
URLリンク(www.open-std.org)
だった

611:名無しさん@そうだ選挙に行こう
09/08/30 11:42:40
じゃあGCの話でも

すっぽすっぽはD&EでC++にGCを入れるなら,入れるか入れないかのどちらかで,
入れたり入れなかったりする選択肢を作ることはありえないみたいなことを言っていたと思います

では入れるとして,問題になるのはGCが使えないような環境ですが,
今時GCが使えなくてC++を使っている環境ってありますかね?
あまり知りませんが,そういうところはいまだにあえてCを使っているということはないでしょうか

612:名無しさん@そうだ選挙に行こう
09/08/30 12:00:20
>>611
そういう時のためのスマートポインタでありRAIIでありPimplイディオムなわけだが

613:名無しさん@そうだ選挙に行こう
09/08/30 12:07:55
RAIIで固めまくっててリーク何それ状態なのに今更GCなんか来ても何も嬉しくないんだが…

614:名無しさん@そうだ選挙に行こう
09/08/30 12:14:29
>>611
C++にはゼロオーバーヘッド原則あるから組み込みでも
Embedded C++みたいなサブセットじゃなくてC++使えば良いよ
ってことが書かれたのがPerformance TR。
だから、C++が今使われてない環境はあっても、使えない環境は事実上無い。

でも、GCはリアルタイム性の確保が不可能だからその手の環境じゃ
少なくともコーディング規約上禁止されるに違いないし、
GCについてもゼロオーバーヘッド原則は守られなければならない、ってところかな。

615:名無しさん@そうだ選挙に行こう
09/08/30 13:24:18
GCか・・・昔は欲しかったけど今はどうでもいいな

616:名無しさん@そうだ選挙に行こう
09/08/30 13:33:04
スマポが十分使えるからmark&sweep方式のGCとか使えるようになっても俺は使わないだろうなぁ
thisの参照を数えないから自分への最後の参照を切るような処理をするとsuicideしちゃう点だけ何か上手い方法あればなと思うくらい

617:名無しさん@そうだ選挙に行こう
09/08/30 13:34:33
>thisの参照を数えないから

kwsk

618:名無しさん@そうだ選挙に行こう
09/08/30 14:53:26
スマートポインタで十分だと思うし。スマートポインタでうまくいかない場合が思いつかない。


619:名無しさん@そうだ選挙に行こう
09/08/30 15:12:47
循環参照の問題があるから所有権を明確に管理しないとまずいし。
イベントドリブンなコードをOOP的に書いてるとすぐ循環する。

620:名無しさん@そうだ選挙に行こう
09/08/30 15:17:57
いやだからBoostのスマポは何種類かわざと用意されているわけで

621:名無しさん@そうだ選挙に行こう
09/08/30 15:20:53
一方に、弱弱しいポインタを使えば解決。

622:名無しさん@そうだ選挙に行こう
09/08/30 15:21:30
手段があればいいってもんでもなくて。
それを正しい知識を持った人が選択しないと有効に働かないってのがなぁ。

623:名無しさん@そうだ選挙に行こう
09/08/30 15:23:00
ほとんどの循環参照は設計で解決できる。
それでも解決できないイベントハンドラのような循環参照を起こしやすいものはweak_ptrで解決できる


624:名無しさん@そうだ選挙に行こう
09/08/30 15:32:23
スマポで必要十分なのは確かだけど古めのフレームワークで
RAIIに従ってないのがあるとすり併せに苦労するのが辛い

625:名無しさん@そうだ選挙に行こう
09/08/30 15:41:21
>>622どんな道具も正しく使わないと効果を発揮しないものだ。
たとえGCがあっても不要なデリゲートやら参照やらをいつまでも保持していると
リソースの開放をしてくれない。


626:名無しさん@そうだ選挙に行こう
09/08/30 17:04:57
Javaだって循環参照するとリークするからわざわざ参照を4種類も用意してる
GCは万能ではない

627:名無しさん@そうだ選挙に行こう
09/08/30 18:01:48
>>626
>Javaだって循環参照するとリークするから
それはない。
循環参照でリークするのはJava仕様違反。

628:名無しさん@そうだ選挙に行こう
09/08/30 18:51:28
>>616
これでできないか?
class A :public boost::enable_shread_from_this<A>
{
public:
void hoge()
{
shared_ptr<A> my=this->shared_from_this();
}
};


629:名無しさん@そうだ選挙に行こう
09/08/30 18:57:26
>>611
ゲーム屋や組み込み系のこともたまには思い出してあげてください

例外やRTTI無しがデフォっす

630:名無しさん@そうだ選挙に行こう
09/08/30 18:57:52
まぁでも、C++に標準的にGCが導入されたら世の中のメモリリークがある程度減る
という想像は付く(問題が先送りされただけって考え方もあるが)
逆に、リークさせてはStop the world、なアプリが無駄に増えそうな気もするが…
どっちがいいんだろうなぁ
ゼロオーバーヘッドが守られるならどうでもいい、ってのはある

631:名無しさん@そうだ選挙に行こう
09/08/30 19:09:35
リークがなくなるといっても、わざとリークさせてGCが回収するってことだから設計がいい加減なソフトが蔓延しそうな気がして怖い。


632:名無しさん@そうだ選挙に行こう
09/08/30 19:13:42
scope_exitも言語仕様でサポートしてくれ

633:名無しさん@そうだ選挙に行こう
09/08/30 19:16:22
Perlのループラベル構文もパクってくれ

634:名無しさん@そうだ選挙に行こう
09/08/30 19:52:57
>>632
shared_ptrのカスタムデリータにlamda関数をセット


635:名無しさん@そうだ選挙に行こう
09/08/30 20:08:46
lambda

636:デフォルトの名無しさん
09/08/30 21:43:09
そういうのになると多分適当な連中は手抜きして使わないんだよなぁ…
というか、たまには綺麗に書ける為だけの追加があってもいいと思うんだ

637:デフォルトの名無しさん
09/08/30 21:47:19
ライブラリでできることはライブラリでって方針なんじゃ?

638:デフォルトの名無しさん
09/08/30 22:36:31
scope_exitはマクロで制約付きだからなぁ
制約付きのマクロでいいなら、新しいfor構文も要らないことになるし

639:デフォルトの名無しさん
09/08/31 16:35:45
finally入れろって?

640:デフォルトの名無しさん
09/08/31 16:52:31
VCはfinally入るっぽいんだっけか

641:デフォルトの名無しさん
09/08/31 18:43:05
>>633
賛成!
それがあったら、gotoを使わなくても
よくなるのに。


642:デフォルトの名無しさん
09/08/31 19:21:35
finallyじゃなくscope(exit)の方がいいなぁ
つーかfinallyだったら別にイラネ

643:デフォルトの名無しさん
09/08/31 19:34:17
イディオムで何とかなればいい、使える奴が使えればいい、ってのに慣れすぎてる
ところはあると思う
爺さんもある程度の危惧はあるみたいだが…

644:デフォルトの名無しさん
09/08/31 20:05:08
auto h = shared_new Hoge;
でshared_ptr<Hoge>が帰ってくるようにならねえかなあ

645:デフォルトの名無しさん
09/08/31 20:18:00
>>644できるよ!
auto h=boost::make_shared<Hoge>();


646:デフォルトの名無しさん
09/08/31 20:45:59
可能な限りライブラリ主義は問題ない。
ソースの先頭に #include <...> が十数行必要になること以外は。

647:デフォルトの名無しさん
09/08/31 20:47:43
#include "all.h"

648:デフォルトの名無しさん
09/08/31 20:51:55
使用頻度が高いものはプリコンパイルヘッダーに入れちゃうけどね。
boostのヘッダーなんか一箇所でも使う箇所があったらプリコンパイルヘッダーに入れてる。


649:デフォルトの名無しさん
09/08/31 21:11:01
pchを使わない生活には戻れないなぁ
VC++のは癖ありすぎだけど

Boostで提供してるマクロは、つまりは言語サポートが不足してる部分だと思ってる
FOREACHもSCOPE_EXITもSTATIC_ASSERTもそうだし、そもそもPP系が全部そう
まぁPP系は最終手段として必要だろうけどな…

650:デフォルトの名無しさん
09/08/31 21:20:15
プリプロセッサがもっと強力になればいいんだな

そうだPHP埋め込めば(ry

651:デフォルトの名無しさん
09/08/31 21:46:53
#define BOOST_FOREACH foreach
とすれば組み込み機能かと錯覚しちゃうぐらいだよ

652:デフォルトの名無しさん
09/08/31 21:52:49
錯覚できるくらい完全なら幸せなんだろうけどなぁ

653:デフォルトの名無しさん
09/08/31 22:20:36
安心しろ、C++0xでは本物のforeachが言語組み込みになる!

はずだったじゃないか、なあ

654:デフォルトの名無しさん
09/08/31 22:27:15
本来、Range-based for はconceptを前提にして設計されていたからな。
それをADLなんていう、根本的に邪悪な機能で実装しようとしたら、
悲惨なことになるのは当たり前だろ。

ほんとにどうするんだろ、n2930。

655:デフォルトの名無しさん
09/08/31 22:35:16
差し当たりダサい実装になるのは仕方ないけど
後で新生concept版に置き換えるときに邪魔になってグダグダになるのが一番怖い

656:デフォルトの名無しさん
09/08/31 22:46:15
すっぽすっぽおじさんはちゃんと>>646-648のことも考えてくれているんだよ
URLリンク(www.open-std.org)

657:デフォルトの名無しさん
09/08/31 22:47:02
>>651
それ#define間違ってね?

658:デフォルトの名無しさん
09/08/31 23:10:44
#define BOOST_CONSTEXPR constexpr
#define BOOST_DECLTYPE decltype
#define BOOST_NULLPTR nullptr
#define BOOST_LAMBDA []
#define BOOST_AUTO(v,e) auto v = e
#define BOOST_ENUM_CLASS enum class

659:デフォルトの名無しさん
09/09/01 00:03:35
しかしさ。n2930だと、begin(), end()は、stdをassociated namespaceに付け加えたADLによって探されると規定されているんだよね。
つまり、通常のunqualified lookupは実行されない。
問題ありすぎるよな。

自作のクラスで、イテレーターを返すメンバ関数のシグネチャがbegin(), end()じゃなかったりする場合に、
自作クラスをRange-based forで使えるようにするには、ADLが何かということを理解していなければならない。

例えば、ある名前の名前空間に入っている自作クラスをRange-based forに対応させるためのbegin(), end()を、
グローバル名前空間に書いても、Range-based forは動かない。
なぜなら、通常のunqualified lookupは実行されないから。

テンプレート引数の型の名前空間もassociated namespaceになるので、
ある名前空間でテンプレートクラスとbegin()/end()を定義して、
別の名前空間の型をクラスのテンプレート引数に渡したとき、
たまたまシグネチャが一致するbegin()/end()が、別の名前空間にあっただけで、曖昧でエラーになる。

Joe coderにADLの理解を強要するのか?

660:デフォルトの名無しさん
09/09/01 00:14:40
ADLを理解していないレベルのJoe coderは自作クラスを
Range-based forに対応させようと思うどころか、
対応させることが出来るとも思わないんじゃないか、という疑問

661:デフォルトの名無しさん
09/09/01 07:34:52
ライブラリだけで使っていれば良いんだよ

662:デフォルトの名無しさん
09/09/01 12:27:36
使わね〜

663:デフォルトの名無しさん
09/09/03 09:37:36
不定値を表すリテラルとか欲しいなぁ

664:デフォルトの名無しさん
09/09/03 09:40:00
>>663 何に使えるの?

665:デフォルトの名無しさん
09/09/03 10:25:52
不定値で済ませれば最適化が掛けられる場所もあるなぁと
まぁ例えば、API関数にダミー突っ込む時とか?

666:デフォルトの名無しさん
09/09/03 10:32:30
>>665
それだけじゃ良く分からん。具体例を示して

667:デフォルトの名無しさん
09/09/03 10:54:14
>>665
具体的に!

668:デフォルトの名無しさん
09/09/03 10:54:41
sub sp, 16
とか
dw ?
とかに相当する操作が欲しいってだけで、使い道も効果も微妙だから総合的には微妙
ただ「アセンブラならここは不定値だよなぁ」って思う時がたまにあるから思い出しただけ

669:デフォルトの名無しさん
09/09/03 10:56:35
と書いてて思ったけど
dw ?
は多分普通に初期化しない静的変数として書いてるな

670:デフォルトの名無しさん
09/09/03 11:00:02
と書いてて思ったけど(連投ですまんが)、結局関数の引数以外は不定値普通に書けるな

int dummy;
f(dummy,dummy,dummy,dummy);
がpush四回になるかsub sp,16になるかはコンパイラ次第か。別に不定値要らないな。

671:デフォルトの名無しさん
09/09/03 12:08:54
>>670
COMとかのoutみたいなもんか。


672:デフォルトの名無しさん
09/09/03 12:25:28
いや、COMのoutはちゃんと0入れないとやばくね

673:デフォルトの名無しさん
09/09/03 17:00:37
includeを打ち消すdecludeみたいなのが欲しいなぁ。
undefみたいなノリで

674:デフォルトの名無しさん
09/09/03 18:19:36
推薦図書スレに誤爆した奴がいるらしい

675:デフォルトの名無しさん
09/09/03 19:10:41
>>673
一体どういう挙動するんだそれ…

676:デフォルトの名無しさん
09/09/03 19:17:14
includeで読み込んだh内のclassとかdefineとか変数とか一切合財
decludeで無かったことになる、と。

include <hoge.h>

〜 hoge.h で記述されてるものを使ったコード 〜

declude <hoge.h>
ここから無効


pimplしなくてもhを軽くできて良いんじゃないかなぁと。
激しく実装するのが面倒そうだが

677:デフォルトの名無しさん
09/09/03 19:18:34
>>676
> pimplしなくてもhを軽くできて良いんじゃないかなぁと。

お前勉強し直しな。


678:デフォルトの名無しさん
09/09/03 19:22:49
>>677
勉強すればheaderのチェーンを断ち切る目的でpimpl使おうと思わなくなれるんですか?

679:デフォルトの名無しさん
09/09/03 20:20:09
> hが軽くできて

kwsk


680:デフォルトの名無しさん
09/09/03 20:25:07
>>679
簡単にエッチできるって意味では無いと思うぞ

681:デフォルトの名無しさん
09/09/03 20:54:45
>>676
結局ヘッダ読み込んでコンパイルしてる上に、 declude の処理が増えてるじゃん。
ヘッダが「軽く」なるように感じる要素がまるで無い。

682:デフォルトの名無しさん
09/09/03 21:09:30
せめてexcludeとかにしてくれ・・

683:デフォルトの名無しさん
09/09/03 21:21:29
make 使わなくても済む様に C++ で規格化してくれりゃIDE毎の違いやら鈍足 template が一気に解決するのにね


684:デフォルトの名無しさん
09/09/03 21:26:30
pascalのようにuses で自動的にコンパイル&リンクまでしてくれるとありがたいのに。


685:デフォルトの名無しさん
09/09/03 21:46:09
PGOみたいな最適化の邪魔になるような気がする

686:デフォルトの名無しさん
09/09/03 22:11:25
includeの話をしてる奴らはとりあえずModules in C++も一応嫁

687:デフォルトの名無しさん
09/09/03 22:14:01
>>683
何を言っているのだ、お前は?

688:デフォルトの名無しさん
09/09/04 00:14:45
>>681
ヘッダの連鎖コンパイルは減るじゃん

689:デフォルトの名無しさん
09/09/04 00:36:58
何で減るんだ?

690:デフォルトの名無しさん
09/09/04 00:38:36
そもそもヘッダの連鎖だかチェーンだかとやらが意味不明なんだけど、何のことを
指してるんだ?

691:デフォルトの名無しさん
09/09/04 06:48:08
減らないし、g++もVC++もpre-compiled headerあるし、
>>676って、下手な考え休むに似たり、ってことでしかない。

692:デフォルトの名無しさん
09/09/04 07:49:38
pimplならローカルなクラスの宣言は .cpp のほうに書けばいいんでないの

693:デフォルトの名無しさん
09/09/04 07:51:03
すまん、692は忘れてくれ

694:デフォルトの名無しさん
09/09/04 08:11:15
VC++のpchはそろそろ改善して欲しいけどな
まぁ2010の次のバージョンが全面改修らしいから、あるとしても遠い話か

しかし、>>676は明らかに何かを誤解してると思うんだが、どう誤解してるのかが
気になるなぁ

695:デフォルトの名無しさん
09/09/04 11:22:49
>>694
勘違いというか、あれで内部的にpimpl相当になって外部のクラスを
変更しても影響受けない素敵状態になってくれないかなぁという妄想みたいな。

誰か書いてたけどexcludeとか、class_extern見たいな方が適切だったと思う。

696:デフォルトの名無しさん
09/09/04 11:43:44
外部のクラスってのが何を指してるのか分からんし、どう見てもpimplを何か変に
誤解してるようにしか見えないが…

クラスのサイズが分からないとインスタンスは生成できない
→privateメンバ変数すら全てヘッダ中で定義しなきゃならない
→ポインタの向こうの構造体にメンバ変数を全部隠せばいい

ってだけの話だぞpimplは。
もっと綺麗に分離する為に、普通はポインタの向こうに不完全型の実装クラスを
置いて、中身全部そっちに移して転送関数を書きまくる訳だけど。

697:デフォルトの名無しさん
09/09/04 12:59:12
>>695は今すぐExceptional C++を穴が空くほど読むべき

698:デフォルトの名無しさん
09/09/04 13:10:16
pimplしたくないからprivateメンバをヘッダ以外に追い出せる別な方法が欲しいって話なんだけどなぁ。

699:デフォルトの名無しさん
09/09/04 13:15:19
>>698
別の方法と言うなら、空のインターフェースクラスと実装クラスに分ける方法があるじゃないか。

700:デフォルトの名無しさん
09/09/04 13:28:30
>>698
>>673>>676は追い出せてないじゃんw



701:デフォルトの名無しさん
09/09/04 13:31:36
ヘッダの問題はModules in C++がTRとして出て解決する予定になっている。
だから、同じ問題を解決するものは
意味論的にModuleより優れていない限り、考慮する価値も無い。
よってこのネタは終了。

702:デフォルトの名無しさん
09/09/04 13:51:16
>>673>>676で追い出せると思ってる理由が分からんw

703:デフォルトの名無しさん
09/09/04 14:04:05
>>702
いや、技術的にこれで追い出せる〜みたいな話じゃなく、
こんな書き方で追い出せるようにならないかなって妄想でw

704:デフォルトの名無しさん
09/09/04 14:04:56
>>701
ヘッダ問題解決する予定があるなら、本当にどうでもいい話でした

705:デフォルトの名無しさん
09/09/04 14:34:43
クラスを丸ごとpimpl化するのは面倒なので、クラス内に包含する一部のオブジェクトのメンバ変数をshared_ptr<>にしてる。
そうすれば一部だけでもヘッダーをcppに移せるからそこそこ効果がある。



706:デフォルトの名無しさん
09/09/04 14:37:26
>>705 は中途半端。
対処としては中途半端。
「見えちゃ嫌だけどちょっとは見えたほうが」
そんなの微妙すぎ。

スレリンク(tech板:182番)
これ思い出した。

707:デフォルトの名無しさん
09/09/04 14:48:47
>>705
pimplじゃん

708:デフォルトの名無しさん
09/09/04 14:55:31
やけくそ頻繁に参照されるメンバがあって、そこだけpimplから外に出したりすることはある

709:デフォルトの名無しさん
09/09/04 14:59:32
>>707うん、メンバすべて丸ごとじゃなくて一部のメンバにpimpを適用。
すべてのメンバ関数で間接呼び出しさせる必要がない。.演算子を->にするだけでいい。

>>706中途半端なのはそうだけど、手間と効果の兼ね合いかな。


710:デフォルトの名無しさん
09/09/04 15:08:23
初心者スレかよ。

711:デフォルトの名無しさん
09/09/04 15:42:25
>>673から一気にアホな流れになったな

712:デフォルトの名無しさん
09/09/04 16:02:28
汚染してしまってすまん

713:デフォルトの名無しさん
09/09/04 16:06:46
これでもまだマシ、っていうのが世間におけるC++のレベルなんだろうな。

C++0xの言語側の実装状況は
URLリンク(wiki.apache.org)
みたいの見ればすぐ分かるし、ネタにもよくあがるけど、
ライブラリの方はどの程度ついてきているのだろう。
URLリンク(gcc.gnu.org)
見ると、constexprが無いのが結構響いてるっぽいなあ。

右辺値参照(というかMove Semantics)のライブラリ側の対応も大体済んだみたいだし、
そろそろ実用面でのベンチマークを見てみたいね。

714:デフォルトの名無しさん
09/09/04 16:24:24
URLリンク(gcc.gnu.org)
によると、constexprの実装はGCC-4.5で入るのかな?

715:デフォルトの名無しさん
09/09/04 16:24:32
ベンチマーク必要な変更はない。

716:デフォルトの名無しさん
09/09/04 16:45:04
必要か不要かじゃなくてどの程度かを知りたいって話だろ・・・

717:デフォルトの名無しさん
09/09/04 17:22:30
標準コンテナをvalue semanticsで使っているようなプログラムは
g++のコンパイラオプションに-std=c++0xを入れるだけでかなり早くなるかもしらんが、
そんなプログラムはあまり無いだろうなあ。
使っているとしてもstd::stringくらいか。

718:デフォルトの名無しさん
09/09/04 17:50:15
コンテナにshared_ptrを突っ込んで使ってる人は自動的に速くなるだろうな。
アトミックオペレーションのコストって高いからなあ

719:デフォルトの名無しさん
09/09/04 18:28:50
constexprて実装側で無く利用側で指定するようには出来なかったのかね

720:デフォルトの名無しさん
09/09/04 18:33:54
>>719
例えばどんなメリットがあるん?

721:デフォルトの名無しさん
09/09/04 19:05:21
デメリットや実装難度を見たいって話なんだから
メリットが判らん様な低脳は黙ってればいいと思うよ

722:デフォルトの名無しさん
09/09/04 19:22:34
decludeと同じく何を意図しているのか分からんが、
案を出すなら構文と意味論の例を提示しろと。

定義は1回なのに対し、利用するところは無数にある。
その全ての箇所で指定するなんて、現実的じゃない。
明らかに、定義時に指定する方が合理的。

指定しないでもコンパイラがコンパイル時に判断すれば良いって?
D使えば良いんじゃない?

723:デフォルトの名無しさん
09/09/04 19:39:06
>>719利用者側で指定するとはどういう意味かわからん
実装時にconstexprによってコンパイル時の評価が可能で且つ同じ引数に対して同じ定数が戻ることが
保証できるわけだろ。それで十分だと思われる。


724:デフォルトの名無しさん
09/09/04 19:50:39
>>708
よけくそ頻繁ってどこの方言?
純粋に興味で知りたい

725:デフォルトの名無しさん
09/09/04 19:56:32
やけくそ と書いたところで頻繁の方が良いカナと思ったが、
どっちが良いかは全文を書いてから決めることにして、取り合えず
両方残したままにしたのが裏目にでて、消すのを忘れてたと読む。

726:デフォルトの名無しさん
09/09/04 19:59:39
>>721
態度は悪いが良い指針
で、メリット何?

727:デフォルトの名無しさん
09/09/04 20:06:55
constexprはコンパイル時定数として自然に使えることを目的としているんだから、
使用時に何か指定が要るっていう時点で問題外だろ……

「ぼくのかんがえたC++0xはスレ違い」の文言をテンプレに追加するべきだ
あと、「papers嫁」もだな

728:デフォルトの名無しさん
09/09/04 21:27:25
URLリンク(d.hatena.ne.jp)
> この点をふまえて考えると、 std::list::size() でリンクをたどって
> 数える処理は「コンテナ内のオブジェクトに対する操作」ではないので、
> 計算量の要件が仮に定数時間とされても、実装を変更する必要は無いと
> 言えてしまいそうだったりします。

これ、どうなの?
これがほんとなら N2923 をまじめに考えてた委員会の人とかみんな
この点を見落としてるってこと?

729:デフォルトの名無しさん
09/09/04 21:29:43
>>697
そんな本読む必要なし。
だから、その手の本を日本人がかけないんだよ。

730:デフォルトの名無しさん
09/09/04 21:42:29
>>728 emptyが有れば十分たい

731:デフォルトの名無しさん
09/09/04 21:44:46
連結リストに対してsize()なんかが必要になる時点で設計おかしいよな

732:デフォルトの名無しさん
09/09/04 21:48:17
えー誰得?

733:デフォルトの名無しさん
09/09/04 21:50:48
>>731
それを断言できるスキルがうらやましいです^^;;
もっと精進せねば^^

734:デフォルトの名無しさん
09/09/04 22:17:56
>>728
そのコメントは嘘。

URLリンク(gcc.gnu.org)
で問題にしているのはamortized constant timeかconstant timeかの違い。
GCCでの実装がamortized constant timeなのにStandardではconstant timeと
書いてあるから、これはGCCのバグだよね、と言うのが論旨。

結局、Standardで
URLリンク(anubis.dkuug.dk)
と修正されているので、amortized constant time操作であるstd::deque::push_back()
はStandard通りの振る舞いということ。

735:デフォルトの名無しさん
09/09/04 22:36:49
>>734
その解釈には無理が無いか?

もしそのとおりであれば、 gcc のバグ報告に対して 23.1/2 をあげる必要が
無かったはず。

それに、 defect 139 を挙げてるのは、報告者が vector の push_back に
言及してたからでしょ。 deque の push_back については最新のドラフトでも
constant time が要求されてるよ。

736:デフォルトの名無しさん
09/09/04 22:59:02
>>735
無い。無理があるのは

You are talking about complexity in terms of the number of operations
performed on pointers to the contained objects.

の方だと思うぞ。そもそも、Standardでは

23.1.1
All of the complexity requirements in this Clause are stated solely in terms
of the number of operations on the contained objects. [ Example: the copy
constructor of type vector <vector<int> > has linear complexity, even though
the complexity of copying each contained vector<int> is itself linear. end
example ]

とわざわざ例を挙げて言っているように、ポインタ経由でアクセスしているか否かを
問題にしているわけではない。
最新のドラフトでは確かに"should have constant complexity"と書いてあるが、
そもそもDefect 139は "Status: TC Submitter: Andrew Koenig Date: 30 Mar 1999"
とあるように、確実に当時のStandardに反映されている。その後complexityに対する
委員会の見解が変わったか、エンバグしたかのどちらかだろう。

737:デフォルトの名無しさん
09/09/04 23:16:42
>>736
誰もポインタ経由でアクセスしているか否かなんて問題にしてないよ。

問題なのはコンテナ内の要素に対する操作か否か。
list の size で要素を数え上げる処理は明らかに違うでしょ。

あと、 deque の push_back の要件は defect 139 で修正された
Optional sequence operations じゃなくて、 23.2.1.3 [lib.deque.modifiers] に
別途記載されている。最新のドラフトだと 23.3.2.3 ね。
> Inserting a single element either at the beginning or end of a deque always
> takes constant time and causes a single call to a constructor of T.

やっぱりおかしいよ。

738:デフォルトの名無しさん
09/09/04 23:31:13
>>736
"should have constant complexity" って、どこ見てるの?

defect 139 で修正された Optional sequence operations についての記述では
2003 の時点でも最新のドラフトでも
"shall implement them so as to take amortized constant time" って書いてあるよ。

まぁ、もう元の話とは関係ないんだけどね。

739:デフォルトの名無しさん
09/09/05 00:38:32
>>737
そもそもGCCのバグ報告を持ち出したのは、ポインタ経由での要素へのアクセスは
オブジェクトへのアクセスでは無いからcomplexityに影響しないということだと
思うが。

> 問題なのはコンテナ内の要素に対する操作か否か。
> list の size で要素を数え上げる処理は明らかに違うでしょ。
その認識が合っているとは思えない。list::reverse()のcomplexityはlinear time
だとStandardにあるが、これはlist::size()同様にリンクポインタをいじることで
実現可能。もしリストのリンクを辿ることが"operations on the contained objects"
でないのなら、list::reverse()のcomplexityも当然constant timeと書くと思うが。

こんな矛盾を委員会が放置しているとは思えないし、そもそも>>728が言うような
誤解をしているとも思えない。

740:デフォルトの名無しさん
09/09/05 00:46:04
>>738
> "should have constant complexity" って、どこ見てるの?
これは間違いだった。General container requirementsのsize()について見ていた。

> defect 139 で修正された Optional sequence operations についての記述では
> 2003 の時点でも最新のドラフトでも
> "shall implement them so as to take amortized constant time" って書いてあるよ
見落としていたが、確認した。

741:デフォルトの名無しさん
09/09/05 00:57:07
>>739
gcc のバグ報告ちゃんと読んでる?
ポインタ経由での要素へのアクセスなんてどこにもでてきてないはずなんだけど。
問題になってるのは deque 内に持ってるポインタ配列の再確保とコピーね。

> こんな矛盾を委員会が放置しているとは思えないし、そもそも>>728が言うような
> 誤解をしているとも思えない。

みんなそう思ってるんだけど、事実は矛盾が発生しているようだという話ね。

list のリンク操作は "operations on the contained objects" であって
deque のポインタ配列操作はそうではない、というのはおかしい。

元々の意図はそうなんだろうとは思うけど、それが 23.1/2 の記述が甘いせいで
おかしくなっている、と。

742:デフォルトの名無しさん
09/09/05 01:09:31
>>741
正しくはポインタへのアクセスだったな。まあそのくらい補完してくれよ。

で、お前さんの立場は何なの?
list::size()やlist::reverse()はO(1)(面倒だからO表記を使う)とStandardに
書くべきだという意見?

自分は、こんな大事に気づかずに放置するわけが無くて、deque::push_back()の
complexityをamortized O(1)と書くべきという意見。
amortized complexityを良く理解していない人は結構多い上に、defect 139に
あるように実際同様のバグがあったこと、こちらの方が可能性が高いと考える。

743:デフォルトの名無しさん
09/09/05 01:09:40
調べてみると、こんなのが出てきた。
URLリンク(www.open-std.org)
ここの Issue Number 20-036 で問題の 23.1 p2 の追加が行われている。

これが "10 July 1996" とあるので、おそらく list の計算量要求なんかはそれ以前から
あったもので、操作全体の時間について言っていたのがそのままになってる可能性が高い。

N2923 も含めて、 list のリンク操作はあきらかに計算量に含まれる想定で書かれている
ので、 23.1 p2 の文面を現状に合うように修正するべきなんじゃないかと思う。

そうすると、 deque の push_back に対する要求は amortized constant に合わせて修正
しないといけなくなりそう。ただし、これは制限を緩めるものなので、現状の実装を変更する
必要は生じないはず。

744:デフォルトの名無しさん
09/09/05 01:29:39
>>742
> で、お前さんの立場は何なの?
> list::size()やlist::reverse()はO(1)(面倒だからO表記を使う)とStandardに
> 書くべきだという意見?

そうするか、 >>743 のとおり 23.1/2 のほうを直すか、とにかく矛盾を直すべき
だとは思う。

>>743 のほうが自然だし、楽だね。

745:デフォルトの名無しさん
09/09/05 01:32:24
>>743
なるほど。確かにそういう事になるだろうな。そうすれば>>728>>735>>737
のようなおかしな解釈をする輩がいなくなる。

そもそもコンテナ内の要素数に依存するような操作をしているのにポインタへの
アクセスは関係ない、なんて言い出したらcomplexityを明示することが無意味に
なってしまう。

746:デフォルトの名無しさん
09/09/05 02:15:43
どちらかというと「標準委員会が矛盾に気づかないわけがない」なんて
思い込んでるほうがおかしいだろ。

747:デフォルトの名無しさん
09/09/05 02:48:46
>>746
見苦しいぞ

748:746
09/09/05 03:01:16
へ?なんで?意味がわからない。

749:デフォルトの名無しさん
09/09/05 09:28:43
>>746
おまいは>>728から100回読み直してこい

750:デフォルトの名無しさん
09/09/05 13:05:38
どっちがおかしいよかよくわかってない美少女中学生もお忘れなく

751:デフォルトの名無しさん
09/09/05 15:48:55
規格の文面をまじめに読むと、どっちの解釈が「おかしい」とも言い切れない状態に
なってるのが問題。

752:デフォルトの名無しさん
09/09/05 15:56:27
ここでいう「どっち」は >>728>>743 の2つね。( >>745-746 は敢えてスルー)
728 は deque::push_back の(計算量)要求は正しくて list::size() の要求は無意味。
743 は list::size() の要求には意味があって deque::push_back の要求は間違ってる。

753:デフォルトの名無しさん
09/09/06 12:29:21
23.1.1 の記述を問題にしてる人は、具体的にどう直せば厳密になると思う?

俺はまともに書き下せる気がしないので、
「今の文面を、常識的に考えて意図したいであろう意味と解釈して読め」
が現実的だと思うんだけど。

754:デフォルトの名無しさん
09/09/06 13:04:37
計算量とか「実装の質」で切り捨てたらあかんの?
なんか言語の規格で決める事じゃないような気がする

755:デフォルトの名無しさん
09/09/06 13:13:12
>>754
それはさすがに認識のレベルが出発点にすら立ってない


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5395日前に更新/145 KB
担当:undef