1 名前:デフォルトの名無しさん [2010/04/18(日) 20:51:28 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part79 pc12.2ch.net/test/read.cgi/tech/1268846738/
2 名前:デフォルトの名無しさん [2010/04/18(日) 20:51:46 ] ■基本■ [C++ FAQ] www.parashift.com/c++-faq-lite/ www.bohyoh.com/CandCPP/FAQ/ (日本語) Cとその仕様を比較しながらの解説なので分かりやすい。 ***** 質問の前に必ずこの二つに目を通してください ***** [C/C++ リファレンス] www.cppreference.com/ (英語) www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完) [禿 Stroustrup] www.research.att.com/~bs/ [C++ International Standard] www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110 [JTC1/SC22/WG21 - C++] www.open-std.org/jtc1/sc22/wg21/ ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。 [JIS X3014] www.jisc.go.jp/app/pager?id=15868 ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3 名前:デフォルトの名無しさん [2010/04/18(日) 20:51:56 ] ■Libraries■ [Boost] Boost www.boost.org/ (日本語) www.kmonos.net/alang/boost/ (日本語) shinh.skr.jp/boost/ [標準ライブラリ] SGI-STL www.sgi.com/tech/stl/ STLport stlport.sourceforge.net/ GNU libstdc++ gcc.gnu.org/libstdc++/ Apache C++ Standard Library (STDCXX) stdcxx.apache.org/ STLFilt www.bdsoft.com/tools/stlfilt.html (日本語) episteme.wankuma.com/stlprog/ (※1999年発行注意) [Loki] sourceforge.net/projects/loki-lib/ LokiPort-MSVC6sp5 fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
4 名前:デフォルトの名無しさん [2010/04/18(日) 20:52:03 ] ■Books■ amazon.com C,C++関連書籍 www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/ The C++ Programming Language www.amazon.com/exec/obidos/ASIN/0201700735/ www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳) C++ Primer (3rd Edition) www.amazon.com/exec/obidos/ASIN/0201824701/ www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳) The C++ Standard Library www.amazon.com/exec/obidos/ASIN/0201379260/ www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳) Effective C++ www.amazon.com/exec/obidos/ASIN/0201924889/ www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳) More Effective C++ www.amazon.com/exec/obidos/ASIN/020163371X/ www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳) Exceptional C++ www.amazon.com/exec/obidos/ASIN/0201615622/ www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳) More Exceptional C++ www.amazon.com/exec/obidos/ASIN/020170434X/ Exceptional C++ Style www.amazon.com/exec/obidos/ASIN/0201760428/
5 名前:デフォルトの名無しさん [2010/04/18(日) 20:52:10 ] ■Books(Templateまわり)■ Effective STL www.amazon.com/exec/obidos/ASIN/0201749629/ www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳) Modern C++ Design www.amazon.com/exec/obidos/ASIN/0201704315/ www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳) C++ Templates www.amazon.com/exec/obidos/ASIN/0201734842/ C++ Template Metaprogramming www.amazon.com/exec/obidos/ASIN/0321227255/ ■長いソースを貼るときはここへ。■ codepad.org/
6 名前:デフォルトの名無しさん [2010/04/18(日) 20:52:16 ] STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
7 名前:デフォルトの名無しさん [2010/04/18(日) 20:52:22 ] >>1 乙 もう俺に用はない ミ ヽ○ノ  ̄ ̄7 ヘ/ / ノ | / | / テンプレは以上です。
8 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 21:02:15 ] Exceptional C++ 正誤表 www.gotw.ca/publications/xc++-errata.htm www.pej-hed.jp/tools/file/download.cgi/1121/Exceptional%20C++%20Errata.htm
9 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 21:04:24 ] C++は全てスタティックリンクでね ダイナミックリンクなんてしないでね
10 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 22:26:14 ] ■長いソースを貼るときはここへ。■ について ttp://codepad.org/ もいいけど Ideone.com | Online IDE & Debugging Tool ttp://ideone.com/ これもなかなか良いよ。 ただ俺はcodepadの方が慣れているしそっち使うけど。
11 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 22:42:09 ] templateクラスの共通する変数とかは非templateにまとめて それをprivate継承すると実行ファイルのサイズとかコンパイルコストが減るようなんですが 実際そこまでこだわるほどの価値ってありますか?
12 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 23:08:18 ] 価値観って人それぞれだよね。
13 名前:デフォルトの名無しさん mailto:sage [2010/04/18(日) 23:10:24 ] >11 必要になってからやる。 構造の簡素化とか汎用化、一貫性を優先した方が良い。といってもこっちも必要にならなきゃやらんかも。
14 名前:デフォルトの名無しさん [2010/04/19(月) 06:40:58 ] class Hoge { std::string name; public: const std::string& GetName() const{return name;} }; ってクラスがあり、そのクラスのインスタンスへのポインタを 抱いてるvectorが下記のようにあります。 std::vector<Hoge*> vecString; このvecStringの中にあるHogeのnameの長さが5以上の数を C++らしくcount_ifで数えるにはどうなりますか?
15 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 07:10:36 ] codepad.org/jexMI50H
16 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 10:01:36 ] >>14 using boost::bind; std::count_if(vecString.begin(), vecString.end(), bind(std::greater_equal<std::string::size_type>(), bind(&std::string::size, bind(&Hoge::GetName, _1)), 5))
17 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 10:03:28 ] >>16 それだとぬるぽの可能性が
18 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 10:04:26 ] C++0xが一番ありがたく思えるシチュエーションかな、こういうのが。
19 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 21:47:27 ] たしかにC++らしいwwww
20 名前:デフォルトの名無しさん mailto:sage [2010/04/19(月) 22:45:31 ] std::count_if(vecString.begin(), vecString.end(), [](Hoge* h){return h->GetName().size()>=5;}) あまり楽になった気がしないのは何故だろう
21 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 01:17:30 ] 多分、それはコンパイラの気持ちになってパースしてしまうから…
22 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 17:48:03 ] 今更だけど、「C++ってコンパイラの気持ち(動作)を良く理解しないと いけない度合い」が他の言語より相当強いよね。 標準C++の仕様ってのがつまりは"広義のコンパイラ"の動作なわけだけど。 前スレのfriend議論もそうだけど、なかなか強烈な議論だった。
23 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 19:11:50 ] しゃあーない 禿の思惑とは反対方向にC++はどんどん肥大化してしまったからな PL/Iの二の舞になっとる
24 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 22:02:33 ] std::mapの二分木を巡回しながら各要素に適当な操作をしたいのですが 行きがけ順、帰りがけ順、などを切り替えて巡回する方法って用意されてますか?
25 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 22:12:21 ] マクロ関数 a-> ## b って記述したいんですけどプリプロセッサエラー 出ちゃうなんとかして困った
26 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 22:16:19 ] そのスペースはなんだい
27 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 22:16:32 ] イミフ
28 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 22:18:58 ] そもそもmapを二分木で実装しなきゃいけないって決まってたっけ? 要素の並び順が規定されてるだけ(ISO の 23.1.2)だから、二分木を想定した方法はないような
29 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 22:19:19 ] #define test(a, b) a-> ## b = 100 C++ってこんなの作れないのかな? スクリプト言語なら出きるのになんでC++はできないの? なんでなの?
30 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 22:21:53 ] お前が馬鹿だから
31 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 22:23:20 ] >>29 特殊な技法を駆使すればできるよ
32 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 22:33:13 ] >>29 C++ができないんじゃなくてお前の頭じゃできないだけ。
33 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 22:51:48 ] >>14 つかさ〜 素直にforでまわして、Hoge*へのポインタにlengthじゃダメなの? >>16 の回答があってるかどうかはわからんが、それを書くのに2,3分でかけるならいいけど 20分も30分も悩んでたら、どんだけ工数あっても足らないし、しかもぱっと見わかりづらい・・・
34 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 23:07:01 ] >>20 boost::bind にかけられた叡智と努力を無視してるから
35 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 23:16:10 ] >>33 boost::bind を理解してれば2、3分も掛からない 掛かるのはタイプにかかる時間だけ std::count_if(v.begin(), v.end(), bind(&std::string::size, bind(&Hoge::GetName, _1)) >= 5); 確かに見づらいね でも、 for 文だと余分なローカル変数を導入するし、for 文の方が間違いやすいと思う
36 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 23:20:48 ] この程度ならタイプ量の違いなんてカスみたいなもんだろう 実行コストは…これも大差ねーか?
37 名前:デフォルトの名無しさん mailto:sage [2010/04/20(火) 23:45:56 ] タイプ量なんてC++においてはクソの次ぐらいに位置するだろう。 TMPを見てみろあの変態共は…(ry
38 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 00:13:55 ] >>35 あの手のコードをタイプ時間のみで書ける、あなたのようは人は多くいはいないでしょ?
39 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 01:46:28 ] >>29 #define test(a, b) a-> b = 100 で何がいけないのか 話はそこからだ
40 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 02:37:44 ] >>39 Token-Pasting Operator (##) the tokens preceding and following it are concatenated. White space preceding or following the operator is optional. MSDNからの抜粋だが、そのような結果にはならないのでは?
41 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 03:00:42 ] 29が(bが*で始まってない限り)無意味だから意図を聞いてるんだよ ##の意味くらいみんな知ってるから下らない茶々入れるな
42 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 05:48:30 ] >>41 ちょっとなにいってるか分からない bが*で始まるという表現のひどさはさておいても、それがプリプロセスエラーになると思えるのはどういう考え?
43 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 07:03:27 ] >>42 トークン連結の結果は、ひとつのトークンを成していなければならない。 "->" と何かを連結してひとつのトークンを成すとすれば、当てはまる結果は "->*" しか 存在せず、したがって b は "*" で始まるほか無い。 この制約を満たさない場合の動作は未定義。コンパイラによってはエラーになったり、 何もメッセージは出なかったりする。
44 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 07:12:31 ] PHPをC++化するOSSツール「HipHop for PHP」、Facebookがベータ版を公開 ttp://www.nikkeibp.co.jp/article/news/20100204/208938/ 今更かもしれないけど俺は驚いた。
45 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 07:19:19 ] ひどい流れだ
46 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 10:48:25 ] 自作クラスTestをstd::vectorに入れています。 std::sort(vec.begin(),vec.end(),std::less<Test>()); の為にoperator <をTestクラスのメンバに書きましたが 「二項演算子 '<' : 型 'const Test' の左オペランドを扱う演算子が見つかりません 」 とのエラーメッセージが出たんで クラスの外に定義したら問題なく動作しました。 が、なぜクラスのメンバではダメなのでしょうか?
47 名前:42 mailto:sage [2010/04/21(水) 10:49:48 ] >>43 平身低頭して謝ることしかできません
48 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 10:55:55 ] >>46 constつけ忘れたんじゃね
49 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 11:02:29 ] >>48 ありがとうございます。 解決しました。
50 名前:デフォルトの名無しさん [2010/04/21(水) 16:22:55 ] VC++でビルドスクリプト的な需要を解決する方法って何が一般的ですか? eclipseだとIDEから簡単に使えたんだけどそういうサポートはされてますか?
51 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 16:28:19 ] カスタムビルドステップのこと?
52 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 16:46:09 ] DLLとかつくるときに「シンボルのエクスポート」とかチェックする項目あるけど シンボルって言うのは関数とグローバル変数を指すの? どの範囲を指すのかが良く解らん
53 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 17:08:01 ] >>50 nmake か msbuild のどっちか。VCのバージョンによるからお好きなほうで。
54 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 17:58:18 ] 特定のソフトウェアの話じゃなくて C++についての話をしようぜ。
55 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 22:45:27 ] 普段はC#メインで数年ぶりにC++を触っています 例えばvectorの特定の要素を見つける(条件は少し複雑)場合に 1.for文をbegin〜endまでまわす(なんかかっこ悪い?) 2.find_ifを使う(別途関数つくるのがうざい) 3.boostでラムダとか使う(使い方もう忘れたよ><) 4.VS2010が出るまで寝る の四択があるのですが一般的またはお勧めとされるのはどれですか? ちなみに完全趣味利用です。
56 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 22:46:48 ] 2
57 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 22:49:57 ] 4でfind_if+ラムダ式がベスト
58 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 22:53:57 ] >>57 それって、普通のC++でも可能なんですか? MSが開発したヘンテコなC++だけじゃなくて?MC++でしたっけ?
59 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 22:54:21 ] C++では滅多にusingは使わないのですか?
60 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 22:54:52 ] 使いません
61 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 22:57:09 ] >>59 boostで使うだろ いちいちboost::mpl::とかタイプしたいのか
62 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 22:59:13 ] >>58 C++0x
63 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 23:00:26 ] >>60 それどころかusing使わないとできない大事な技法もあるだろ using std::swap; とかまさか意味が分からないなんてヤツはいないよなw
64 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 23:01:27 ] >>58 C++0xなら可能。 gccの最新やvc10なら実装されてる。 std::find_if( first, last, [](int v) { return ...; } ); みたいな。
65 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 23:04:27 ] まずusing declarationとusing directiveの話がごっちゃになってる件。
66 名前:デフォルトの名無しさん mailto:sage [2010/04/21(水) 23:18:01 ] >>65 いや元の質問がごっちゃになっているから、 >>60 わざと使わないと言った(using directiveを意識している?) >>61 反例を挙げた(using directiveについて) >>63 あえて別例を挙げた(using declarationについて) 要するに元の質問者をおちょくっているだけだろう。
67 名前:66 mailto:sage [2010/04/21(水) 23:19:18 ] ちなみに分からない人には using declarationとusing directiveの違い ttp://cpplover.blogspot.com/2009/06/using-declarationusing-directive.html これでも読んでください。
68 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 00:33:16 ] >>63 ごめんなさい、そうしないとできない大事な技法というのが分かりませんでした
69 名前:55 mailto:sage [2010/04/22(木) 01:09:18 ] じゃあVS2010出るまで寝るか と思ったら20日に公開されてたんですね 早速落としてみるか
70 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 07:06:52 ] >>68 例外安全とかCopy & Swapを知らないの? なら勉強不足なだけ。
71 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 07:12:17 ] >>70 usingなんていらねーよカス
72 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 07:20:26 ] >>71 いらないなら何のためにあるの? その論でいくとtypedefも不要になりそうだが
73 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 07:26:07 ] #include <iostream> namespace A { class N { }; void swap(N& a, N& b) { std::cout << "swap N" << std::endl; } } int main() { using std::swap; A::N a, b; int c, d; swap(a, b); // A::swap が呼ばれる swap(c, d); // std::swap が呼ばれる(using が必要) } 名前空間関連のC++の仕様は複雑だよなあ
74 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 08:38:27 ] その例だと std::swap<A::N> で特殊化しないのはなんで?って言われると思う
75 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 08:53:55 ] std::swap<A::N> で特殊化しないのはなんでなのJOJO?
76 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 09:00:54 ] 規格で許されてるとはいえ、stdを汚すよりはいいんじゃない? 結局のところ適切なswapを呼び出してくれるんでしょ
77 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 13:07:15 ] swapも演算子レベルで仕様に組み込んでしまえばよかったのに いびつになってる
78 名前:68 mailto:sage [2010/04/22(木) 13:32:57 ] >>70 知ってますが、usingを使わなければならないと思ったことがありませんでした。 usingはコードの記述量を減らす為にしか使ったことがありません。
79 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 13:55:13 ] rvalue参照でswapに相当することが出来るようになるし swapで出来ない、というかちょっと無駄になるような処理も 効率的に表現出来るお
80 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 15:56:15 ] すみません。 2つ目のconstが無いとSTLがうまく動かないのですが。 これはどのような効果があるんでしょうか? bool operator < (const classdata &x) const { return (n<x.n) ; }
81 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 16:00:59 ] この中じゃ数値を変更しないよ宣言
82 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 16:01:30 ] >>80 エラーならエラーメッセージを貼るべきだし、メンバ関数ならそう断ろうよ。 で、2番目のconstはメンバ関数が静的である。 つまり、メンバの変更は行なわないことを表明している。 ということは、静的なインスタンスからでも呼べるということ。 逆に言うと、静的でないメンバ関数は静的なインスタンスからは呼べない。
83 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 16:17:29 ] サンクス。すみません。 このようなクラスがあったとき、x.nもnも変更しないという宣言なんでしょうか? class classdata { public: int n; bool operator < (const classdata &x) const { return (n<x.n) ; } };
84 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 17:05:32 ] メンバに変更が発生しないという宣言
85 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 17:09:10 ] サンクス
86 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 17:11:09 ] >>83 一個目のconstはxの参照先が変更不可。 二個目のconstはそのクラスのメンバが変更不可。 従って、nもx.nも変更不可。
87 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 17:21:33 ] ああ、そうだな。 >>83 では2個目のconstに限っていなかった
88 名前:70 [2010/04/22(木) 18:13:32 ] >>78 まず>>67 のusing declarationとusing directiveの違いは理解している? もしご存じなければリンク先を熟読してください、 >>71 お前本当にC++でプログラミングしてんのかよ。 無知を曝してる割に一切恥じないとはなかなかのツワモノだな。 言っとくがそうやって煽られてもお前に教える気はないよ。 ………………………… と思ったのだが、ROMってる純真な初学者さんが>>71 の言うことを真に受けてしまうと 可哀相なのでヒントだけ書いておく。 上で述べられているstd::swapの特殊化は可能な限りしておくべきだが、クラステンプレートに対しては(部分特殊化となるため)できない。 そこで using std::swap; が活躍する事になるのだが、その辺のconsensusについては かの名著『Effective C++第3版』 にも記載があるので未読or忘れた人は読んでおきましょう。 ちなみにまさにこういった事を知らない>>71 のような無知プログラマが万一プロジェクトに 居た場合の対策についても『Effective C++第3版』は言及しているという名著っぷり。 他にもusingは 基底クラスのメンバを可視にするとか CRTP関連の変態イディオムとか いろいろ出番あるじゃないか。
89 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 18:18:43 ] 煽りを真に受けて長文レスして越に入っちゃう男の人ってちょっと…
90 名前:デフォルトの名無しさん [2010/04/22(木) 18:30:26 ] using が絶対に必要な例を1つでも示せれば そんなに凄まなくていいのにな
91 名前:68 mailto:sage [2010/04/22(木) 18:44:10 ] >>88 はい、その違いについては理解しているつもりです。 そもそも、using directiveしか知らない方は見かけますが、using declarationの存在を認識していて それらの違いを理解していない方はあまりいないのではないかと思っています。 起こり得がたい状況にも思えます。 閑話休題しますと、例外安全にするためにswapを使う、その際にstd::swapと記述するのでは だめなのでしょうか? 繰り返しになってしまって申し訳ないのですが、usingを使わなければならない、逆に言えば、 usingを記述しなければ実現できないという状況をまだ知らないのです。
92 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 18:44:15 ] >>73 で using がないと std:: が必要になる。 std:: を書くようになると、swap の引数が何かによって std:: をつけるかつけないかが変わってしまうので、 swap の中身を変えたら swap できなくなった、とかの問題が起こる事がある。 swap(a, b); で A::swap が呼ばれるのは、 引数の a と b の型が名前空間 A に属しているので、 勝手に名前空間 A の中に swap が無いか探して、 あればそっちを優先してくれるから。 このあたりのことは Effective C++ に書いてあるから、 この重要性が分からない = Effective C++ すら読んでないヘボPGだと声高に叫んでる ということになる。
93 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 18:53:36 ] usingよりtemplate使えよ メンバswapにもSwapにもPODの最適化にも対応出来る
94 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 18:59:35 ] >>76 その結局のところというのは完全合法なのかなぁとか適当に言ってみるんだけどどうなの?
95 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 19:06:15 ] >usingよりtemplate使えよ swap技法について言ってるのなら、ちょっと意味が分からない。
96 名前:デフォルトの名無しさん [2010/04/22(木) 19:15:50 ] >>95 最適なスワップを呼び出してくれる関数をtmp使って書いて {using std::swap; swap(a, b);} の代わりに saikyo::swap(a, b); って使うんだよ
97 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 19:18:01 ] それTMPなの?
98 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 19:19:08 ] >>96 saikyo::swapはどうやって書くのさ まさか、必要な型のぶんだけ全部オーバーロード(もしくは特殊化)するの?
99 名前:88 mailto:sage [2010/04/22(木) 19:38:28 ] >>90 > using が絶対に必要な例を1つでも示せれば > そんなに凄まなくていいのにな 上で述べられているstd::swapの特殊化は可能な限りしておくべきだが、クラステンプレートに対しては(部分特殊化となるため)できない。 って一行で済ませているだろ なんでそれが分からないんだよ なんでEffective C++すら読んでないんだよ
100 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 19:39:49 ] std 名前空間内じゃないから規格を気にせず好き勝手特殊化できる、という事なのだろう まあ悪くはないように見えるが、std::swap でなくそちらを使うよう周知させる必要がある点が微妙
101 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 19:40:03 ] >>96 お前の言っているテンプレートはC++のテンプレートとは思えんくらい あり得ない動きを期待しているようだが。 頼むからEffective C++を最低2回は熟読しろ。
102 名前:88 mailto:sage [2010/04/22(木) 19:41:12 ] >>100 > std 名前空間内じゃないから規格を気にせず好き勝手特殊化できる、という事なのだろう できないっつーの。 なんでお前までも Effective C++ を読んでないんだよ! > クラステンプレートに対しては(部分特殊化となるため)できない。 って俺が>>88 で述べただろうが!
103 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 19:45:03 ] >>101 tmp勉強すればわかる
104 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 19:47:43 ] >>103 tmpがテンプレートメタプログラミングの略だとしたら 知ったかぶりもいいところだな。 こんなにテンプレートに関してうるさい俺が Template MetaProgrammingを知らない訳ねえじゃねぇか。
105 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 19:51:55 ] >>104 実際わからねぇんなら勉強不足なんじゃない?
106 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 20:00:52 ] またhitoが暴れてる予感
107 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 20:03:02 ] おまえらただの言語オタクだ
108 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 20:03:30 ] hitoってダレだよw
109 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 20:05:52 ] saikyo::swapの実装を考えてみたが、 ・メンバswapやSwapが存在するかなどSwappableを判定するtraitsでできる限り網羅的に定義する。 ・それ以外のものは実装者自身またはサードパーティが適宜saikyo::swapまたはtraitsを特殊化。 というか俺lexical_castを作るのにこういう実装でやったことがある。 swapに関して言えば、どう考えてもusing std::swap(またはboost::swap)のほうが綺麗で便利。 もっと本当に最強な実装があるというなら教えてくれ。まじで。
110 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 20:07:34 ] 今日はあちこちおもろいな。 宿題スレではhttpはtelnetプロトコル以降に生まれたから互換性があると断言してる人もいるし ここはここでこんなだしw
111 名前:デフォルトの名無しさん [2010/04/22(木) 20:39:54 ] >>99 特定の書籍をどうするかは他人の勝手だよ 話が通じてないと思うなら、おまえが自分の言葉で語らないことを省みたらどうなんだ #include <algorithm> #include <iostream> namespace A { struct B {}; void swap(B&, B&) { std::cout << 1; } } main() { A::B x, y; swap(x, y); } くらいのことを自慢できる相手が2ちゃんしかないんじゃないか?
112 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 20:50:54 ] ageてまで自分の無知を宣伝するとかどんなM
113 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 20:55:05 ] ADLと言えば済むところをコードまで書いちゃうおとこの人って
114 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 20:56:03 ] >>73 と同じ事書いてるだけだし 何がしたいのか分からない
115 名前:デフォルトの名無しさん [2010/04/22(木) 21:08:54 ] ヘボかどうかの基準に特定の書籍は登場しないって指摘してるだけだよ C++ならC++でどんな目的に使ってどのくらい達成できたかに過ぎないのを わざわざ礼を失した表現を選ぶ者こそ何がしたいのか理解に苦しむ # スレッドフロートという掲示板の仕様が気に入らないのを一般ユーザに八つ当たりするバカも同類
116 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 21:13:02 ] >>115 # スレッドフロート型を拡張した掲示板の慣例を守っていないことに対する指摘は八つ当たりではない、と書いたところでsage進行スレじゃないことを知る
117 名前:デフォルトの名無しさん [2010/04/22(木) 21:16:43 ] さらに、ここはム板 強制と任意の区別がつかない知恵遅れに出る幕はない
118 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 21:16:50 ] 特定の書籍は共通認識として役に立つぐらいだよなぁ。デザパタと一緒。 デザパタの名前を知らないからヘボと決めてはならないし、特定の書籍を 読んでないことについてももちろん同様。 共通認識としての情報が使えない場合、相手に対して正しく伝えられるかどうかが ヘボかどうかの基準といえる。 まとめると、この本読んでないからお前アウト、という考えをしてる人はヘボ。もしくはヘボではないが短気。
119 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 21:20:02 ] > この本読んでないからお前アウト、という考えをしてる人はヘボ。もしくはヘボではないが短気。 Effective C++を読んでないからお前アウトとは言っていない。 Effective C++を読んでなくてもそれに相当する最低限の知識を持っていれば アウトではないし、別にEffective C++を読む必要すらないレベルの方々だということだ。 だが 「それに相当する最低限の知識」を持ち合わせていない ようなので、お前アウトと申し上げたとおりだ。
120 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 21:22:25 ] 上記のstd::swapの議論に荷担したいわけじゃなく、 全然関係ない質問として swapについて質問をさせてください。 他人の作ったクラスOther_s_Classを利用したクラスMy_Classを作る時、 Other_s_Classの仕様のせいでどうしても swap(const My_Class&, const My_Class&, ) を例外を投げないように実装できない (頑張っても不可能)ということは 実際にあるのでしょうか? ありましたら例を教えてください。 よろしくお願い申し上げます。
121 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 21:28:27 ] 例外を投げないようにというそれだけの要求であればすぐできるよね。 ただ、例外を投げない例外安全性を求めるのならずいぶん難しいと思う。
122 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 21:29:06 ] My_Class::swapが例外を投げる可能性があり、しかも何が投げられるか不明確 (たとえばLib+ヘッダのみ公開されていて仕様にも記載がない)なら事実上無理だわね。 throw()で握り潰せば何でもありだけど。
123 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 21:29:12 ] Other_s_Class をポインタで持てば 常にポインタの交換で実装できるんじゃない? swap のためだけにポインタにする、というのが嫌ならアレだが
124 名前:120 mailto:sage [2010/04/22(木) 21:31:32 ] みなさんありがとうございます。 > swap のためだけにポインタにする、というのが嫌ならアレだが swap のためだけにポインタにするのも厭いません。 例外を投げるswapを認めないということは常に実装可能なのかと 疑問に思いまして。
125 名前:デフォルトの名無しさん [2010/04/22(木) 21:33:10 ] アウト・セーフ・よよいのよいってか 何の話だよいったい・・・ 知らなければ論外だと思うならそもそも相手すんな 自分が論内に引っぱってるんだろうが
126 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 21:41:56 ] >>124 123 のレスが全てでしょ
127 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 21:44:35 ] >>124 なんにも制約をつけないとなるとswapってなんだろうという哲学的な問いのような気がしてきた たとえば連結リストの一つのノードに対する struct node_t{ node_t *prev; node_t *next; int v; }; void swap(node_t *n1, node_t *n2); という関数は必要なのか? どういう実装にすべきか?
128 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 21:49:35 ] 作るなら void swap(node_t& n1, node_t& n2); でしょ 値だけの交換と前後の交換の二種類あるけど、 テンプレートだと値が交換可能である保証が無いから 前後の交換で実装するのが無難かと これはintだから値の交換でもいいと思うが 前後の交換だと、n1, n2 が連続している時に少し考慮が必要かな
129 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 21:54:31 ] codepad.org/FdFoMETP なんでコンパイル出来ないんですか?
130 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 22:06:19 ] fugaの引数の型がintだけど、 intからhoge<T>::typeのTを類推できないので typedefされた型は元の型と同じように扱われて、 xには既にhoge<T>::typeという情報は残らない
131 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 22:16:35 ] なるほど 引数からの類推って結構制限きついんですね 最終的にその型になればなんでもいいのかと思ってました
132 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 22:55:08 ] 修飾された型名は推論できないんだよな >>35 それだと5uにしないと警告の嵐
133 名前:デフォルトの名無しさん [2010/04/22(木) 23:17:54 ] でも警告でしかないんだよね
134 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 23:28:39 ] >>133 それがC++さ!
135 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 23:35:29 ] 嵐っちゅっても結局はこれ↓一つでしょ warning: comparison between signed and unsigned integer expressions
136 名前:デフォルトの名無しさん mailto:sage [2010/04/22(木) 23:48:46 ] お前らのコンパイラは優秀だな オレのVCで試したら40行近く出たぜ
137 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 07:04:49 ] テンプレートとかその他の細かいとこの仕様を知りたいんだけど仕様書だと読むのしんどい わかりやすく細かい仕様を解説してるサイトとか書籍ってある?
138 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 07:22:52 ] >>137 template metaprogrammingをやりたいの? それとも初めてtemplateに触れるの?
139 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 07:27:24 ] metaのほうで初めてというわけじゃなくて 知識をよりまとまった強固なものにしたい
140 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 07:39:58 ] >>139 なら回り道せずに規格読むのが最善手。 他の人の解説では間違いや省略が混ざる可能性が出てくるので、強固な知識とは言いがたい。
141 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 09:05:11 ] >>137 C++テンプレート完全ガイドとか
142 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 16:02:55 ] 激しくスレ違いな気もしますが適切なスレが見つからなかったのでここで失礼します。 C++とDirectXでFlashのようなツールを作っています。 Flashはレイヤーの数やフレームの数が限りなく作れたり、「戻る」もかなりの回数を使うことが出来ますが 編集中のデータは一体どこに保存しているのでしょうか。 自作プログラムでメモリに1分ほどのアニメーションを保持させると レイヤーの枚数や同時に開いているアプリケーションによってはメモリ不足になります。 ファイルに保存しているのかなと思いましたがファイルアクセス?に若干時間がかかり、 レイヤーやフレームの増減や現在見ているフレームを切り替えたときにカクカクしました。 他に方法があるのかと考えましたが思いつかず・・・何か参考になりそうなことがありましたら教えて頂けると有難いです。 そもそもこういった処理に何か名称があるのでしょうか?
143 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 16:06:30 ] 画像、イメージの保持じゃないんだろ。
144 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 16:43:55 ] 前後のフレームをバッファリングするとか。
145 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 17:58:01 ] >>142 描画につかったパラメータとかプロパティとかを構造体かなんかでバックアップしといて、 必要になったらそれ使って再描画ってかんじじゃないの?? 面データとかはなるべくフラグに落としたり出来ないか考える。 もしくは、ランダムアクセスできるような数式を考えて逆側に進めるとか。 初心者だからよく解らんけど。
146 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 19:01:37 ] >>142 参考になるかもしれないキーワード ・ベクターアニメーション ・Mementoパターン ・Commandパターン
147 名前:142 mailto:sage [2010/04/23(金) 19:03:37 ] >>143-144 前後のフレームをバッファリングするにしても再生すると毎フレーム必要になることを考えたら変わりがないような気も。 情報量を圧縮するにも限界があるので根本的な解決にはならなさそうですね。 「アニメーションの巻き戻しをしない」が前提であれば差分データだけでいいので若干良くはなりそうですが・・。
148 名前:142 mailto:sage [2010/04/23(金) 19:06:18 ] >>147 に>>145 のアンカーの付加ワスレ >>146 調べてみます。
149 名前:デフォルトの名無しさん mailto:sage [2010/04/23(金) 19:10:16 ] >>147 ああ、編集じゃなくて再生のことも書いてたのか それにしてもバッファリングを否定されるとつらいな。バッファリングなしで動画を描画している例って今あるのかね
150 名前:デフォルトの名無しさん [2010/04/23(金) 23:51:24 ] >>139 パーサー作ってみたら? () や typename あたりのどたばたまで引っくるめて C++ を愛せるかどうかも「強固」には必要だろ
151 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 04:27:44 ] flashは基本的に 「三角形を左へ100ドット、100フレームかけて移動せよ」 みたいなデータの集合だから、 よほど複雑なアニメーションでもなけりゃ、10分でもオンメモリ余裕だと思う。
152 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 06:29:10 ] コンストラクタに可変個のstring渡す方法無いですか。 もしくは、("aaa", "bbb", "ccc")が自動で vector<string> へ変換させられる方法とか。
153 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 06:38:01 ] 自己解決。こんな関数を挟むことにしました。 #define tovecstring(...) tovecstring_sub(__VA_ARGS__, NULL) std::vector<std::string> tovecstring_sub(char *p, ...){ va_list L; va_start(L, p); L = (char *)L - sizeof(char*); char *ch; std::vector<std::string> x; while((ch=va_arg(L, char*))!=0) x.push_back(ch); va_end(L); return x; }
154 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 07:19:59 ] こっちのほうがいいや #define tov(...) tovecstring_sub( "",__VA_ARGS__, NULL) std::vector<std::string> tovecstring_sub(char *tmp, ...){ std::vector<std::string> x; char *p; va_list L; va_start(L, tmp); while((p=va_arg(L, char*))!=0) x.push_back(p); va_end(L); return x; }
155 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 07:44:44 ] stlのmultimapとmapの要素をvectorにしたのはどっちが挿入が早いですか?
156 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 08:46:48 ] ここで訊くより自分で測った方がよほど早いんじゃ?
157 名前:デフォルトの名無しさん [2010/04/24(土) 12:28:25 ] 「線形時間」とか言われても具体的な係数は決まってないしな
158 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 12:35:07 ] >>157 あるよね。 O(n^2)のはずなのにO(n)より早えぇよとか。 たぶんnがでかけりゃ逆なんだろうが。
159 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 14:20:39 ] 良く多倍長整数がうんぬんって話になると Fast Fourier Transformは実はそこまで早くないとかあるらしいね。 nがそこそこなうちはカラツバ法が良いとか。
160 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 14:44:29 ] すみません。 string str[]={"aaa", "bbb"}; を 関数を使ってvector<string>にするにはどうすればいいですか。 string*を引数にするとサイズデータが無くなるんですが。
161 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 14:58:14 ] template <unsigned N> vector<string> make_strvec(const string (&a)[N]) { return vector<string>(a, a + N); }
162 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 15:01:26 ] サンクス
163 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 15:01:48 ] Boostありなら、 #include <iterator> #include <algorithm> #include <boost/range.hpp> string str[]={"aaa", "bbb"}; vector<string> v; std::copy(std::back_inserter(v), boost::begin(str), boost::end(str));
164 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 15:02:50 ] copyの引数まちがえた。 std::copy(boost::begin(str), boost::end(str), std::back_inserter(v));
165 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 15:07:17 ] コンパイルできないんでこうしましたよ template <unsigned N> vector<string> make_strvec( string (&a)[N] ) { int n; vector<string> x; for(n=0; n<N; n++) x.push_back(a[n]); return x; }
166 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 15:15:01 ] すまん自分で確認してなかった コンパイル出来なかったか 何がダメなんだろう
167 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 15:19:38 ] 横だが、最初のコードでコンパイルできたよ。 @VC9
168 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 15:37:35 ] >>164 BCC6.2.1だがコンパイルして走ったよ
169 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 15:51:23 ] string str_table[] = { "aaa", "bbb" }; size_t num_str = sizeof(str_table) / sizeof(str_table[0]); vector<string> v( str_table, str_table + num_str ); v.assign( str_table, str_table + num_str );
170 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 17:03:55 ] stringのインスタンスのsizeofは何を返すんだろうな 例えば>>169 で文字列の長さが違っていても動くかな
171 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 17:08:31 ] おまえは何を言ってるんだ?
172 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 17:09:38 ] stringのインスタンスのサイズに決まっているだろう 可変長構造体でもあるまいし
173 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 17:47:11 ] なんでオーバーロード解決の候補にprivateなメンバ関数が入るんだコラァ!
174 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 17:49:16 ] ディスパッチしたいときとか、いろいろあるだろJK
175 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 20:28:52 ] 友達がいるかもしれないからな。
176 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 20:39:08 ] え・・・・・
177 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 23:15:35 ] C言語を呼び出す時の、extern "C"の"C"って何?
178 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 23:20:05 ] Bの次だからC
179 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 23:21:46 ] C言語の"C"だろJK
180 名前:177 mailto:sage [2010/04/24(土) 23:30:41 ] あっそうなの
181 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 23:32:32 ] 規格で定められているもうひとつは extern "C++" で、これがデフォルト。
182 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 23:34:36 ] へぇ"C++"もあるんだ どんなふうに使うんだろうね
183 名前:デフォルトの名無しさん mailto:sage [2010/04/24(土) 23:39:06 ] マクロで切り替えるとか・・・? 使わないな
184 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:01:02 ] というか、extern "Pascal"だったり extern "Ruby" だったりができてないだけ
185 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:09:48 ] 多くの現実のコンパイラが、その目的のために採用したのは、 extern "hogehoge"じゃなくて、独自の指定子だったからな。 VCの__stdcallとか
186 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:11:16 ] extern な場合だけじゃないしなあ
187 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:44:42 ] 基本的なことですみません 配列の演算子をオーバーロードしたいのですが、 T & foo::operator[](int idx) とかやってるとします。 ここでidxがむちゃくちゃで返すべきTの参照が無い場合、何を返せばよろしいのですか? 例外を投げる? カラッポのTをつくって返す?っていっても無理矢理なんか帰しても無意味だから やっぱり例外かな。。
188 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:46:23 ] 非constの参照を返すなら、空っぽのTを作って返すのはマズいんじゃ?
189 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:47:18 ] >>187 俺は基本的にはstd::out_of_rangeすろーかな。
190 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:48:55 ] ありがとうございます 例外投げます!
191 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:50:20 ] >>187 かのScott Meyersの名言 「intの様に振る舞え」 って知らない? > ここでidxがむちゃくちゃで返すべきTの参照が無い場合、何を返せばよろしいのですか? intの配列でそれをやったら未定義の動作だから、 基本的にはその状況は考えないで何をやっても責められないとは思うが、 > 例外を投げる? 現実的にはそれが親切だと思う。 投げるクラスはstd::out_of_rangeまたはそれを継承したクラスを投げましょう。 > カラッポのTをつくって返す? それは最悪の選択。 返却値の型は T & なんだろ? テンポラリオブジェクトへの参照を返すつもりなの?
192 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 00:56:20 ] 俺ならassertするかも std::vector とかだと、operator[] は例外投げず、at() は例外投げる、と使い分けてるね
193 名前:デフォルトの名無しさん [2010/04/25(日) 01:15:22 ] これ超分かりやすいんだけど shota356.blog91.fc2.com/blog-entry-707.html
194 名前:191 mailto:sage [2010/04/25(日) 01:24:49 ] >>192 > 俺ならassertするかも 俺もそれ言おうとしたが、 assertはデバッグビルドで削除されるってことを 思い出して止めた。 > std::vector とかだと、operator[] は例外投げず、at() は例外投げる、と使い分けてるね うむ。 たぶんSTLに準拠すると喜ばれると思う。
195 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 01:28:52 ] >>193 そう・・・かな・・・ぁ。 まあ説明は人によってウケが違うしな。
196 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 02:17:24 ] 宣伝だろ
197 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 10:00:53 ] >>194 逆!逆! リリースビルドで削除だ
198 名前:191 mailto:sage [2010/04/25(日) 10:47:18 ] >>197 ああごめん逆ったw
199 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 11:26:26 ] ポリシーで例外を投げるかアサートするか無効なオブジェクトを返すかその他にするか選択できるようにすればいい
200 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 11:27:37 ] operator[] にポリシーねえ かといって、クラスレベルでポリシー設定したんじゃ粗すぎるし
201 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 12:13:48 ] 無効値オブジェクトとか*NULLの参照とかって大抵ろくなことにならないけど使いたがる奴多いよな なんで?
202 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 12:31:43 ] Null Objectパターンに近いようなそうでもないような
203 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 12:33:11 ] やっぱ近くないな
204 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 14:30:31 ] >>201 クソ設計だけど、もうそうするしかないほど追い詰められている時に 「とりあえず動けばいいんだよ!早く作り終えないとけないし!」 ってなった結果じゃないかな?
205 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 14:44:08 ] 誰もがいつでも例外を投げれていい環境で働いてるワケじゃないんだぜ
206 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 15:10:07 ] >>205 あー、なるほどね。 ・・・その場合、Boostとか使えないの? 例えばboost::lexical_cast<std::string>()とかどうするの? 例外を投げないオプションとかあるのかな?
207 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 15:15:53 ] あれだ goっぽくtupleでも返すとか
208 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 15:16:02 ] GoogleだとboostどころかSTLも禁止じゃなかったっけ bad_allocとかout_of_rangeとか投げるから そういうとこだと完全に独自ライブラリ
209 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 15:19:21 ] 例外禁止って、さらに new が禁止で2段階初期化が強制になるんだろ? よく聞く話だけど、そこら辺まで考えての判断なのか疑問だね。
210 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 15:22:04 ] 例外を使わない過去の資産との相性が悪いからと聞いている
211 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 15:30:48 ] >>208 まじかよ boostやSTLを廃止したら生産性が下がるだろ。 Googleの躍進を見ていると、それを感じさせないほどの Google独自ライブラリがあるのだろうかね。
212 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 15:32:01 ] 全部例外じゃなくエラー返すようにした 完成度の高いライブラリでも持ってんじゃない
213 名前:211 mailto:sage [2010/04/25(日) 15:46:11 ] >>212 でも結構オープンソース開発をしているよな。 そのライブラリの一部も公開しているのだろうか。
214 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 15:52:57 ] >>209 > 例外禁止って、さらに new が禁止で2段階初期化が強制になるんだろ? なるほど。 newは当然のごとく禁止ってのはわかる。 さらにConstructorで失敗した時に例外禁止だとどうしようもないから init() メンバを用意する訳か。 ほー。
215 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 15:59:18 ] デストラクタはあるからCの時ほどはつらい制限ではないけどね
216 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 16:02:05 ] initメンバなくてもis_valid的なメソッド有ればええんちゃうの?
217 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 16:10:44 ] valid であると判定できないといけないのは面倒くさい気がする 初期化済みフラグをいちいち導入する必要があったりとか
218 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 16:13:27 ] >>216 まぁね。 new(nothrow) した後 valid じゃない場合は即座に delete するファクトリメソッドを 用意すれば使う側の負担にもならない。これが害の最も少ない対処法だと思う。 例外使ったほうがずっと良いんだけどね。
219 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 16:23:18 ] 可変個引数テンプレートがないと根本的な解決には
220 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 16:31:19 ] >>219 なんのこっちゃ?
221 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 16:32:59 ] >>217 逆に言えばbool メンバが一つ必要になる反面、 いかなる状況でもis_validを呼び出せば初期化済みかどうか 確認できるってメリットにもなるよな。 init()で初期化する方式だとそれはできない。 でも例外を使うべきだと俺は思うけどね。
222 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 16:36:52 ] まあ、初期化済みフラグがちゃんと管理されてればな
223 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 16:46:54 ] >>222 >ちゃんと管理されてればな そんな手間じゃないでしょ。 メンバの bool 初期化済みflag; をConstructorでfalseに設定して、initでtrueにするように設定して、 他のメンバからはいじれないようにすれば大丈夫さ。
224 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 16:54:59 ] 復旧不能なエラーが起きた場合どうするかとか
225 名前:223 mailto:sage [2010/04/25(日) 16:57:39 ] > 他のメンバからはいじれないようにすれば大丈夫さ。 自分で言っててそれはつまりどうする気だと思ってきた。 初期化済み flag をメンバに持つそのためだけの基底クラス class InitFlagImpl を用意して InitFlagImpl 中で派生クラスの init() を一個一個全て friend 指定する。 また InitFlagImpl の Default Constructor は初期化済み flag を false にセットするようにしておく。 そして派生クラスは InitFlagImpl を private 継承してやれば 派生クラスの Constructor では自動的に InitFlagImpl の Default Constructor が呼ばれるので 自動的に初期化済み flag が false にセットされ、 派生クラスの init() だけに気を配れば良い事になる。 >>224 それは初期化済みフラグには関係ない話だ。
226 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 16:59:26 ] オブジェクトが正常でない状態になったら is_valid は false を返すべきだと思う
227 名前:223 mailto:sage [2010/04/25(日) 17:01:59 ] >>226 うむ。おっしゃるとおり。 だがそれは本質的な問題じゃないから解決は簡単だ。 上述の is_valid を is_初期化済み として読み替えてくれ。
228 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 17:07:23 ] 復旧不能な状態って初期化済みと自信を持って言えるかね まあコンストラクタのエラーに対してのみ使う、という規約を周知するのなら
229 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 17:13:15 ] flagの中身が破壊されるようなエラーが出たらダメだから ちゃんとチェックメソッド書いた方がいいよね
230 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 17:17:37 ] メモリ破壊気にするなら flagの前後にメモリとって そこが破壊されてるかチェックしたのでいいと思うの
231 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 17:17:49 ] >>228 bool is_初期化済み() と bool is_valid() があれば自信を持って言っていいと思うぜ。 >>229 >>225 方式ならflagは破壊されないんじゃね?
232 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 17:18:08 ] めんどくせー。例外投げりゃいいじゃねーか。 Google みたいな事情がおまいらのところでもあるのか?
233 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 17:19:46 ] おい議論がおかしくなって居るぞ。 今は 1.「例外を禁止したが故に生じる問題点とその解決策」 について論じているんじゃないのか? なのに不法なメモリー破壊の話とか、 2.「例外を禁止していようがいまいが生じる問題点」 じゃないか。 1.と2.を混同してないかい?みんな。
234 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 22:52:23 ] かわいい映画を見に行こうと思って「テディ」を選んでしまったときの気持ち
235 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 23:19:53 ] AMD製 CPUを搭載しているPCでコンパイルしたEXEが Intel製 CPUを搭載しているPCでなぜ動作するのですか? コンパイラはネイティブコードを出力するとすると、動作しないのでは?
236 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 23:23:45 ] >>235 動作するように互換性を持たせてるからです。 ja.wikipedia.org/wiki/X86 ja.wikipedia.org/wiki/AMD64
237 名前:デフォルトの名無しさん mailto:sage [2010/04/25(日) 23:25:00 ] もちろん、IntelやAMDの独自拡張命令を使ってると ほかのCPUでは動かなくなる
238 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 01:06:47 ] ファンクタって何が便利なんですか?
239 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 01:14:59 ] 関数ポインタと比べると最適化されやすいあたり
240 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 01:19:55 ] 単に一時オブジェクトの関数呼んでるだけじゃなかったんですね
241 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 02:10:12 ] 何も便利とは思わんが・・・
242 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 02:13:02 ] boost::function使い倒してからもう一度出直してこい
243 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 02:43:51 ] >>242 今使い倒してみました 高が知れてますね
244 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 02:50:19 ] 私が知りたいのは、ファンクタは無理に使う必要は無いか?ということです
245 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 02:57:44 ] C++に慣れてくれば自然と使いたくなるので、無理に使う必要は無いです。
246 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 06:25:02 ] >>235 下手にある側が、上手にある側にいやいやでも合わせて互換性を持たせる なんてことは良くある話だ。
247 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 06:26:30 ] >>244 > 私が知りたいのは、ファンクタは無理に使う必要は無いか?ということです 無理に使う必要は無い。 だが使わない方が無理とは言わないまでも、不便だし デザパタ上もまずいと思いませんか
248 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 06:49:06 ] 面白いやり取りを発見しました。 rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200309/03090053.txt
249 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 08:23:04 ] レベルの高い方々はその程度のことでもカリカリして大変そうだな
250 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 08:34:55 ] レベルが高いとかの問題じゃないでしょ。 見本となる人がこの程度の事で手を抜いてどうするの?
251 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 08:39:38 ] いやこれは手を抜いていいだろ
252 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 08:41:30 ] 日付見てスルーしろよ
253 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 08:54:16 ] プログラマって知的でいつも冷静沈着な人種と思ってたけど、案外沸点低いよね
254 名前:デフォルトの名無しさん [2010/04/26(月) 11:54:35 ] 下記のように配列をまとめて代入したいのですが、良いアイディアはないですか? char value[] = {1,2,3,4}; vallue = {5,6,7,8};
255 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 12:02:20 ] >>254 static char const next_value[] = {5,6,7,8}; std::copy(next_value, next_value + 4, value); さぁ不満なところを列挙してもらおうか?
256 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 12:14:44 ] freadって
257 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 12:44:56 ] >>256 std::fread()のことならC標準関数のそれと同じものです。 つまり、ストリームから指定バイト数の要素を指定個数読み取る関数ですね。
258 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 12:55:02 ] enumしてもらおうか
259 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 13:42:35 ] >>225 の方式って読んでみたらかなり綺麗に見えるけど、 コンパイル通るんかいな。
260 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:04:06 ] デストラクタの挙動で質問です。 すべて純粋仮想関数のメソッドを持つクラスを基底として、 継承したクラスをdeleteした際、デストラクタが呼ばれないようです。 テストは下記のように作りました。 class ITest { public : virtual ~ITest(){}; public : virtual void Print() = 0; }; class TestOne : public ITest { private : char* str; public : TestOne( char* str_ ){ str = str_; }; public : virtual ~TestOne(){ printf( str ); str = NULL; }; public : virtual void Print() { printf( "ONE " ); printf( str ); }; };
261 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:04:53 ] class TestTwo : public TestOne { private : char* str; public : TestTwo( char* str1_, char* str2_ ) : TestOne( str1_ ){ str = str2_; } public : virtual ~TestTwo(){ printf( str ); str = NULL; } public : virtual void Print() { printf( "TWO " ); printf( str ); } }; int _tmain( int argc, _TCHAR* argv[] ){ TestTwo* _two = new TestTwo( "1111","2222" ); TestOne* _one = _two; ITest* _ites = _two; _two->Print(); _one->Print(); _ites->Print(); delete _ites; return 0; }
262 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:06:56 ] _itesをdeleteした際に、PrintTwo、PrintOneの順でデストラクタが 呼ばれることを期待しましたが、呼ばれないようです。 コンパイラはVC++2008でPSはXPのSP3です。 _oneや_twoをdeleteした場合は、 期待したとおりにデストラクタが呼ばれております。 この挙動はC++の仕様なのでしょうか?
263 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 15:08:07 ] 申し訳ありません。 class ITest は下記の物と差し替えてください。 class ITest { public : virtual void Print() = 0; };
264 名前:254 [2010/04/26(月) 19:01:26 ] >>255 代入するのに2行必要なのが不満です。 その後必要ない変数next_valueが残るのが不満です。 そうではなく下のように1行で書きたいです。 value = {5,6,7,8} どうにかして書けませんか?
265 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 19:05:23 ] 0xに移行してvector使う
266 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 19:27:53 ] >>264 あと1年くらいでそれがコンパイル通るようになるから しばらく待てない?
267 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 19:50:30 ] Boost.Assign
268 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 19:52:06 ] クラス、テンプレート駆使したらできるだろ
269 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 19:52:13 ] >>254 strcpy(vallue,"1234")
270 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 19:53:00 ] どうやればいいかはしらんが value = {5,6,7,8} はできるはずだ。
271 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 20:07:00 ] >>269 それを書くなら、memcpy(value, "\x5\x6\x7\x8", 4)だろ。
272 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 20:11:22 ] >>269 にプログラムを書かせると 平気でメモリ破壊するということが分かったな
273 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 20:12:19 ] こまけーことはいいんだよ
274 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 20:12:49 ] こまかくねーよw
275 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 20:13:59 ] メモリ破壊どころか、値も滅茶苦茶。
276 名前:254 [2010/04/26(月) 20:49:59 ] >>265-266 C++0xって奴ですか(本当に出るの?) 今すぐにできないならあきらめます。 全く使えない言語だ
277 名前:260 mailto:sage [2010/04/26(月) 20:55:46 ] タスケテー・・・
278 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 21:06:38 ] >>263 の通りなら、>>260 のように基底クラス(ITest)のデストラクタを仮想にしてやらないと 基底クラスのデストラクタしか呼ばれない。
279 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 21:10:13 ] >>276 > 全く使えない言語だ あきらめろ。お前には無理だから。
280 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 21:22:58 ] >>278 レスありがとうございます。 そのような挙動でしたか。 インターフェースにもvirtualのデストラクタをつけなければ、 継承した子のデストラクタもよばれないのですね・・・。 お手数おかけいたしました。
281 名前:デフォルトの名無しさん [2010/04/26(月) 21:51:31 ] >>280 deleteを独自に定義とかしていない限り、 struct Derived : Base {}; Base * p = new Derived; delete p; としたとき、BaseがvirtualなDestructorを持っていない場合の 動作は、標準C++では未定義の動作である。 ////////////////////////////////////////////////// struct MyContainer : std::vector<int> {}; でも std::vector<int> * p = new MyContainer; で未定義の動作になるのは delete p; とした時だけで、例えば delete (MyContainer*)p; だったら未定義の動作にはならない。 あるいは boost::shared_ptr< std::vector<int> > * p(new MyContainer); としても未定義の動作にはならない。 そもそもMyContainerを基底クラスのポインタに入れるということをしなければ 全然問題ないし。
282 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 21:54:18 ] >>276 つ GCC4.4以上
283 名前:254 [2010/04/26(月) 22:48:03 ] >>282 まじっすか。 なら4/29発売のUbuntu10.04がgcc4.4.3らしいので使えそうですね。 これは楽しみだ。gcc最高
284 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 22:49:12 ] >>283 Ubuntuが売ってたらびっくりだわ。 ・・・じゃねぇや、gccのバージョンなら今でも自分で上げられるんでは?
285 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 22:52:43 ] その代入そんなすげえか?
286 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 22:55:44 ] >>276 みたいな低脳にいちいち教えてやるなんて お前ら優しいな。
287 名前:デフォルトの名無しさん mailto:sage [2010/04/26(月) 23:05:38 ] >>281 そのソースを使う人のことを考えないなら確かに「全然問題ない」ね
288 名前:260 mailto:sage [2010/04/26(月) 23:42:39 ] >>281 詳しい説明ありがとうございます。 動作未定義でしたか・・・。 Webの入門系しか見てなかったもので、 こういう所の動作は知りませんでした。 確かに基底クラスのポインタに入れなければ問題ないですね。 外部に提供する時にすべてvirtualのインターフェースを 返していたため、その型で保存しておりました。 考えてみれば、元の型で保存しておいて、getXXで返す型を すべてvirtualの基底クラスにしておけばよかった事にいまさら気づきました。
289 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 00:14:10 ] >>287 問題ないと思うけどな。 仮想デストラクタを持たないクラスを継承するなんて、 stlでもboostでも普通に使われてるじゃない。
290 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 00:27:56 ] >>287 > そのソースを使う人のことを考えないなら確かに「全然問題ない」ね いや、普通におかしくないだろ。 もしかして 「多態的にデザインされていないクラスのデストラクタは仮想にしない」 ってのを知らない? デストラクタが仮想になっていたら多態的に使ってください!って言ってるようなもんじゃん。
291 名前:290 mailto:sage [2010/04/27(火) 00:29:20 ] >>290 正確な日本語で言えば ×「多態的にデザインされていないクラスのデストラクタは仮想にしない」 ○「継承されて基底クラスとして多態的に使用することを想定して作られていないクラスのデストラクタは仮想にしない」 だな。長いけど。
292 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 00:49:32 ] >>289 stlは見た事無い気がするけどboostでなら当然のようにあるよ。 polymorphicに使わない基底クラスでDestructorをvirtualにするのは間違いで、 無駄にオーバーヘッドが出るだけ。
293 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 01:05:32 ] >>292 std::unary_functionとかste::iteratorとか。 でもまあ、普通はstd::vectorから派生なんてしないよな。大抵は包含すりゃ済むし。 >>281 は単なる例だと思うから気にしなかったが、 そういう意味では>>287 の言うこともわかる。
294 名前:293 mailto:sage [2010/04/27(火) 01:07:06 ] ste→std
295 名前:290 mailto:sage [2010/04/27(火) 01:12:37 ] >>294 あー、そっか。それがあったね。 > まあ、普通はstd::vectorから派生なんてしないよな。大抵は包含すりゃ済むし。 うむ。おっしゃる通りで、大抵は包含すれば, だめでもprivate継承すれば十分だ。 俺は確かに例としてのためだけにstd::vectorを継承したんだけど、 >>287 はそうは取らなかったってわけか。 なるほど。
296 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 01:20:47 ] 継承を前提とするクラスで非仮想デストラクタにするなら、 そのデストラクタはprotectedにすべしと、C++ Coding Standardsに書いてあったはず。 それを守ればいい。
297 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 14:05:55 ] >>296 それだと継承してない場合にその基底クラスを使えないんじゃないか?
298 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 14:10:54 ] >>297 「継承を前提とするクラス」 むしろ使えないようにしといた方がいいという場合のこと
299 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 15:01:51 ] C++使って趣味でゲームプログラミングしてる人って結構いるもんなの?
300 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 15:19:28 ] >>299 結構いるかはしらないけど俺の周囲には俺も含め3人いる 皆別々の作品を作っているよ
301 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 15:25:01 ] >>300 俺の周囲・・・っていうとサークル所属か何かかな? もし良かったら、各々が作ってるジャンルと深さ(エンジンまで作ってるとか、そこまでじゃないけど制作用ツールは作ってるとか色々)を教えて欲しいな
302 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 15:30:42 ] 制作用ツールってなんだろ。
303 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 15:33:02 ] C++でゲームプログラミングか。Mですなぁ。 なんかもっと、こう 簡単に作れそうなframeworkとかないのかね。
304 名前:301 mailto:sage [2010/04/27(火) 15:35:47 ] >>302 開発が楽になるような自分用ツール。
305 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 15:36:50 ] サークルとかじゃないよ 俺->日曜プログラマー MMORPGのサーバサイドの処理をC++で作成中 友人->趣味としてWindowsのシューティングを作っている 本職もゲーム屋さん 友人の友人(俺の知人)->大学生 今は3D関連のライブラリーだかエンジンだか作っている。俺3D弱いから彼が何言っているかよく理解出来ないw
306 名前:301 mailto:sage [2010/04/27(火) 15:44:00 ] >>305 THX っていうか凄い人達だな。何だその繋がりwwどこで知り合ったんだ? 俺も大学生だけど経済学科だし、3Dのライブラリとかエンジン作るとか夢のまた夢って感じだ・・・・
307 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 17:11:33 ] 横槍レスだけど >>306 まあもしゲームをC++で作りたい場合でも別に3Dライブラリを作る必要まではないんじゃないの? 3Dライブラリは日進月歩だし、自分でライブラリレベルから作ってたらたぶんゲームが完成しないw 既にある優秀なライブラリを借りればいいじゃないの。
308 名前:デフォルトの名無しさん [2010/04/27(火) 18:58:41 ] 関数テンプレートのプロトタイプ宣言ってどうすんの? 必要ないの?
309 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 18:59:16 ] 必要は無いけど、書ける 普通に定義したものの { } をなくせばいいだけ
310 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 19:16:27 ] >>309 サンクス
311 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 19:26:20 ] >>307 DXやGLレベルのことじゃなくて、それらを使った便利オレオレラッパーとかのことじゃねえかな。
312 名前:307 mailto:sage [2010/04/27(火) 19:57:53 ] >>311 あーびっくりした。 そうだよな、OpenGLレベルを自力で書ける大学生とか もう卒業待たずにGoogleに入れるレベル。
313 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 20:19:25 ] >>312 膨大なだけで根性さえあればかけると思われ・・・
314 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 20:21:16 ] そんな根性ある学生が居るならうちで雇いたい
315 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 20:21:47 ] ハードウェアサポートなしなら作れるんじゃない? 時間さえあれば
316 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 20:27:43 ] >>315 やるならもちろんソフトウェアレンダでしょうね。 15年昔ならアセンブラで手書きとかがあったよね。 グラボ会社も資料出してくれてたこともあったし。
317 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 20:32:45 ] Mesaと同レベルの物をスクラッチから書くなら応援するわ。 どれくらい意味があるかは分からんが。
318 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 20:56:35 ] まて、例え出たとしても超えなきゃ意味ないしバグが取れるまで…(ry とか考えると、やっぱり便利なラッパを書いてくれる方がうれしいな。
319 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 23:07:14 ] iostreamとSTLについての質問です。 標準入力から読み込んだ英文を単語毎に分解する目的で、 よく以下のようなコードを見かけるし使うのですが、 cout << "Please input strings : "; istream_iterator<string> start(cin); istream_iterator end; vector<string> v(start, end); これを複数回繰り返す方法がよくわかりません。 #正確に書くとこのコードの後に普通にcinから読み込ませる方法を知りたい 上記コードに続けて、 cout << "Please input strings again : "; cin.clear(); vector<string> v2(++start, end); とするとWindowsXP(MinGW)の環境では意図した通りに再度入力できるのですが、 FreeBSD上のgcc環境で試したところcinから何も読み込まずにv2に空vectorが出来ます。 #cin.clear()が無いときと同じ動作 何とか移植性のある方法は無いものでしょうか。
320 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 23:37:00 ] cin.seekg(0); したらいけた
321 名前: ◆QZaw55cn4c mailto:sage [2010/04/27(火) 23:43:04 ] すみません STL を勉強しているところですが、 gcc-4 では、教科書の次のコードがコンパイルできません。 (bcc32 ではコンパイル・実行とも問題がありません。) コード上で問題はありますでしょうか? codepad.org/SyLoUb14 よろしくお願いいたします。
322 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 23:47:34 ] sinは現在オーバーロードされてるので、 どれを使っていいのか分からないというエラーになる 目的の関数ポインタ型でキャストするか、 テンプレート引数を明示的に与えるといいのだが、 transformでテンプレート引数を明示的に与えるのは面倒臭いので、キャストがベスト
323 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 23:50:17 ] >>321 ご丁寧に unresolved overloaded function type って書かれてます つまり、sinがオーバーロードされてるのでどれを使ったらいいか分からないということ
324 名前:デフォルトの名無しさん mailto:sage [2010/04/27(火) 23:58:55 ] Line 19: error: no matching function for call to 'transform( __gnu_debug::_Safe_iterator<__gnu_norm::_Deque_iterator<double, double&, double*>, __gnu_debug_def::deque<double, std::allocator<double> > >, __gnu_debug::_Safe_iterator<__gnu_norm::_Deque_iterator<double, double&, double*>, __gnu_debug_def::deque<double, std::allocator<double> > >, __gnu_debug::_Safe_iterator<__gnu_norm::_Deque_iterator<double, double&, double*>, __gnu_debug_def::deque<double, std::allocator<double> > >, <unresolved overloaded function type> )' compilation terminated due to -Wfatal-errors. まだ悪夢には程遠いけど、やっぱ見づらいな
325 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:00:16 ] >>321 >>322 ありがとうございます。これでコンパイル・実行ともできました。 transform(radians.begin(), radians.end(), sines.begin(), (double(*)(double))sin);
326 名前:325 mailto:sage [2010/04/28(水) 00:01:58 ] すみません >>322 >>323 でした。 的確な回答ありがとうございました。
327 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:02:42 ] 横槍だけど >>322-323 sin(0.3)とかはstd::sin(double)が他より優先的にマッチするから オーバーロード解決が問題じゃないのでは? VC2008ではコンパイル&リンクできて C:\>aaaaa.exe 0.1:0.0998334 0.2:0.198669 0.3:0.29552 0.4:0.389418 0.5:0.479426 ってなったよ?
328 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:06:22 ] Comeau C++では Comeau C++では Comeau C/C++ 4.3.10.1 (Oct 6 2008 11:28:09) for ONLINE_EVALUATION_BETA2 Copyright 1988-2008 Comeau Computing. All rights reserved. MODE:strict errors C++ C++0x_extensions "ComeauTest.c", line 19: error: no instance of overloaded function "transform" matches the argument list The argument types that you used are: (std::_Deque_iterator<double, double &, double *>, std::_Deque_iterator<double, double &, double *>, std::_Deque_iterator<double, double &, double *>, <unknown-type>) transform(radians.begin(), radians.end(), sines.begin(), sin); ^ "ComeauTest.c", line 9: warning: variable "n" was declared but never referenced double n; ^ 1 error detected in the compilation of "ComeauTest.c". ってなったわ。 つまりなんなんだ????
329 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:10:10 ] >>327 テンプレート引数は 関数テンプレートの引数のみの情報から推論できないといけない 関数テンプレートの中の処理なんて一切見ない transformのテンプレート引数を見れば、推論不可能なことが分かる
330 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:12:53 ] わかり易い例 codepad.org/XutU6qLk
331 名前:327 mailto:sage [2010/04/28(水) 00:17:48 ] >>329-330 ほー、ありがとう。 今 gcc と VCの<algorithm>を漁って定義を確認してきたところ。 おっしゃる通りでございました。 ありがとうございました。
332 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:31:29 ] イテレータじゃなくてポインタ使ってるなら推論効くけどね イテレータ使ってるってのがポイントなのよね
333 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:33:38 ] transform(radians.begin(), radians.end(), sines.begin(), (double(*)(double))sin); って関数ポインタにキャストしているように見えるんだけど、 最適化の障害になったりはしないの?
334 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:35:02 ] つまり今回は テンプレート引数の推論の問題であって Overload Resolutionの問題ではないということか。 ややこしや
335 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:37:41 ] >>332 関係ないよ codepad.org/yT2ckp7t
336 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:41:43 ] もしtransformの定義がtransform(T*, T*, T(*)(T))ならって話
337 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:43:38 ] >>333 double(*p)(double) = sin; のpと同じ一時オブジェクトを作る意味になるから やってることはオーバーロードの選択
338 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:49:25 ] オーバーロードの選択でキャストするのって面倒臭いよね 長くなるし、いちいち typedef するのもめどい
339 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:53:04 ] while(1) { Hoge h; func(&h); } funcに渡されるアドレスって毎回同じインスタンスですよね?
340 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:54:07 ] いいえ毎回新品です
341 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 00:54:53 ] 毎回新しく作られる 普通は同じアドレスだろうけど、そう保証されているわけではない とりあえずコンストラクタとデストラクタはループごとに毎回呼ばれる
342 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:00:44 ] >>339 なぜそう思う。 むしろ違うと思うのが自然では? 例えば while(1) { Hoge h; hをいじる。 func(&h); } だったとして、次のループのhが前回hをいじった結果を継承していたらおかしいでしょ? なぜおかしいかというと、}のところで一回スコープから外れているんだから hはデストラクトされているわけだ。
343 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:02:32 ] >>342 C言語だと同じなのですが....
344 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:06:10 ] 割り当てされるメモリ上のアドレスは同じでも「インスタンス」は別。
345 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:06:46 ] >>343 C言語で同じ事が規格で保証されているってこと? そんなこと無いでしょ。 C++だって同じになるかもしれないけど、同じにならないかもしれない。 規格ではどっちでも良い事になっている。
346 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:08:21 ] >>345 規格ではどっちでもいいけど 実装は同じになるのですが
347 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:13:37 ] >>346 結局何を聞きたいの? > 規格ではどっちでもいいけど > 実装は同じになるのですが そういう実装なんだろ? コンパイラのマニュアルでそう保証されているの? それとも今のところ一緒ってだけ?
348 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:17:39 ] >>347 こうゆう書き方ってまずいのか よくわからなくて こまってます
349 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:19:21 ] 同じhをいじり続けたいなら Hoge h; while(1) { func(&h); } でいいじゃないか
350 名前:347 mailto:sage [2010/04/28(水) 01:23:41 ] >>348 まずいかどうかはfuncを君がどう定義しているかによる。 funcはhが次の4パターンのどれを期待しているの? 1.常に同じオブジェクトかつ同じアドレスが必要 -> >>349 が言っている通り。 2.常に同じオブジェクトかつ違うアドレスが必要 -> 言ってる事が矛盾している。 3.毎回新しいオブジェクトが必要かつアドレスは同じでも違ってもいい。 -> 君のコードのままでおk。 4.毎回新しいオブジェクトが必要かつアドレスは同じでないとやだ。 -> 配置構文newを使うしかないと思う。
351 名前:347 mailto:sage [2010/04/28(水) 01:24:57 ] ねるわ。 もしパターン4を期待しているなら誰かが 配置構文newを教えてくれるよ。
352 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:28:38 ] ちょっと待って、そもそもCで変数の途中宣言って出来たっけ
353 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:28:51 ] >>350 3が保証できればそれでいいのですが 例えば、funcの中でスレッドを生成し hを渡す場合も保証できるのかなぁって 心配です。
354 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:29:27 ] 4はオブジェクトを初期化するメンバ関数でもいいんじゃないか?
355 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:33:27 ] C99
356 名前:347 mailto:sage [2010/04/28(水) 01:35:08 ] >>352 最近のCはできる。 >>353 >>354 Hogeの作者が作ってくれていればそれでOKだね。 あるいはHoge h = Hoge()で初期化同然に動作する仕様になっていればそれでもOKか。
357 名前:347 mailto:sage [2010/04/28(水) 01:37:21 ] >>353 > 3.毎回新しいオブジェクトが必要かつアドレスは同じでも違ってもいい。 は保証できるだろ。 だが君が言っている > funcの中でスレッドを生成しhを渡す場合 ってのが謎だが、 while(1) { Hoge h; func(&h); }<-制御がココに達した瞬間にhは破棄されるため別スレッドがこの&hにアクセスしないこと っていう条件が必要。
358 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:38:36 ] もうバカは放っておいていいんじゃないか? 規格と実装の区別も付かないどころかスコープも理解していないのに スレッドとか言っちゃうやつにC/C++プログラミングは不可能! これ、結論でOK。↑↑
359 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:46:18 ] C言語を知っているようなことを言っているが、 良く良く突っ込んでみると確かにC言語すらあやしいようだしな。
360 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:47:28 ] 配置構文newとかwww 知識では某書で見た事ある程度だが使った事ねぇw
361 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 01:48:19 ] >>353 ローカル変数のアドレスをスレッドに渡すのはやめとけ。 グローバル変数か、newで確保したオブジェクトか、どっちかのアドレスを渡すほうがいい。 newで確保することにした場合はdeleteを忘れないように。
362 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 02:02:13 ] 最適化して外に出されてない限り、たまたま同じアドレスに配置されただけなんじゃないの?
363 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 02:03:55 ] >>356 今回の記述が許されないCってどのC?
364 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 02:19:06 ] > そもそもCで変数の途中宣言って出来たっけ ↓ > 最近のCはできる。 ↑のC99?の話と >>339 のブロックの先頭で変数を宣言するってのは別件でしょ >>352 がC言語の事あまり詳しく知らないだけなんだと思うけど
365 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 14:05:59 ] 配置構文newってこれか! C++編(言語解説) 第36章 placement new ttp://www.geocities.jp/ky_webid/cpp/language/036.html うへぁ
366 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 15:29:50 ] 流し読みしただけだけど、newのオーバーロードってことかいな?
367 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 15:36:50 ] >>366 それは分かった事にならんだろ。 自前で定義したnewとは違う意味ですよ?
368 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 17:34:55 ] >>366 普通のnewはメモリ確保も込みだけど、既に確保されている領域に インスタンスを構築するのがplacement newってだけだよ。
369 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 17:45:22 ] placement newってイマイチよく分からんないから newのオーバーロードで配列プールを返すようにしてるんだけど やっぱりplacement newを使った方がいいんだろうか
370 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 18:07:24 ] どうやってコンストラクタ走らせてるんだろう?
371 名前:デフォルトの名無しさん mailto:sage [2010/04/28(水) 20:06:24 ] >>367 まあ、規格的には 引数付きのnew=配置new なんだけどな コンストラクタを呼ぶだけのものを指す事が多いし、それが語源なんだろうけど
372 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 01:40:31 ] >>370 いや走るだろ。 配列プール作成したときと、newされたときで、2回走ることになるが。
373 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 02:06:05 ] え、二回も走らんでしょ
374 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 02:31:31 ] クラスの配列作ってんじゃないだろうね 普通型無しのメモリ領域に対して使うんだが void* p = operator new(n * sizeof(A)); A* pa = (A*)p; for (int i = 0; i < n; ++i) { new(&pa[i]) A; // ここでのみコンストラクタが呼ばれる } ...使う... for (int i = 0; i < n; ++i) { pa[i].~A(); // ここでのみデストラクタが呼ばれる } operator delete(p);
375 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 18:19:00 ] >>374 >new(&pa[i]) A; これってplacement newじゃないの?
376 名前:デフォルトの名無しさん mailto:sage [2010/04/29(木) 22:24:07 ] 配置構文newが大人気だな。 このスレで過去に出て来たのはいつだろうと思うくらい前だろうに。
377 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 03:27:35 ] 配置構文newなんてメモリ節約の基本だろ。人気も何もない。必須。
378 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 03:31:02 ] (゚Д゚)ハァ? メモリ節約したいならC言語使えばいいじゃん オブジェクト指向の恩恵を受けるんだから多少のオーバーヘッドとか無駄とか我慢しろよ! と無駄に煽ってみるテスト
379 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 03:33:23 ] 現実問題C言語は低機能過ぎて使いにくい。 というか配置構文newのどこがだめなの?これ使ってもオブジェクト指向の恩恵を十分受けられるだろ。
380 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 03:46:53 ] 配置newのメリットって速度だと思ってたんだけど・・・。
381 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 11:14:28 ] 配置newって、渡すメモリ領域の大きさを考慮してもらえるのだろうか・・・
382 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 11:24:25 ] >>380 newって速いの?
383 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 11:40:04 ] メンバ変数をpublicにすると、いけないらしいのですが、 わざわざ{ return メンバ変数;}なんてメソッド呼んでたら 遅くなりませんか?
384 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 11:42:26 ] >>383 気にすんな。 心配するほど遅くならない。
385 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 11:52:35 ] >>383 速度は実測が基本
386 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 12:34:12 ] 配置newはコンテナを作るときに必要になるんだよ。 速度のために使うこともあるだろうけど。 >>381 考慮されないよ。メモリを正しく確保するのは呼び出し側の義務。
387 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 12:45:34 ] >>383 そのメンバ関数を別の翻訳単位にしていなければ、 コンパイラの最適化でインライン展開されて事実上、 全く同じコードになる。 おまけに、デバッグ時にはメンバ関数でトラップを張ったり ログ出力したりと、効率よく対処できる。 それなりに大きなクラスならpublicメンバをデバッグするより トータルコストが抑えられる場合が多いと思われる。 もし仮に、ほんの僅かなパフォーマンスさえ気にするのであれば、 一旦完成させた後に実測した上で、必要に応じてpublicにすればいい。
388 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 12:50:14 ] >>380 >>381 例えばMSVCのnewの実装を見てみるといい。あれは中でmallocをOSから応答があるまでwhile(true)で待ってるだけだから。(マルチスレッドでコンパイルしたプログラムは知らん) そういう意味で確保済みのメモリ領域をOSの処理にまで委ねなくても再利用できる点では優秀だし、カスタムアロケータを使っている場合はプールで高速化を図る時に 統計的な裏づけを元にOSではなくプログラムがメモリを管理するのだから配置newがあって当然だと言える。
389 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 13:37:41 ] ハイチ乳
390 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 15:05:50 ] mallocはアロケートかわいい
391 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 15:25:12 ] 配置構文new でメモリって節約できるんですか? 基本らしいですが何故節約になるのかわかりません。
392 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 15:26:44 ] 趣味でC++を勉強してる人、C++を勉強する目的って何?
393 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 15:29:34 ] new HogeHogeType; ← クラスのコンストラクタに加えOSのAPIを呼び出したりするからデバッグでスタックの余裕がないと大変 new(ptr) HogeHogeType; ← HogeHogeTypeのコンストラクタしか走らないので余裕がなくてもそれなりに使える。ただしHogeHogeTypeの中でスタック浪費してると論外
394 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 15:33:21 ] shared_ptrってboostのとstd::tr1のとどっちが良いの?
395 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 16:06:06 ] 配置newすると普通のnewよりはやくなるの?っていうか、普通のnew遅いよね
396 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 16:24:57 ] >>395 普通のnewが何をするか分かってる? ネックになってるのはメモリ管理だからplacement newみたいに既存のメモリ空間にコンストラクタを走らせるだけなら速くも遅くもないけど。
397 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 16:27:05 ] 再配置newの方が早い。メモリアロケートしないから。
398 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 16:41:41 ] ”仕事が開始してから終了するまでの時間だけでいえば” 普通のnewの作業 =メモリアロケート作業+配置構文newの作業 である以上、そりゃもちろん配置構文newのが 普通のnewよりずっと早いさ。 だが仕事の内容が違う以上、どっちが早いとか論じるのはおかしい。
399 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 16:43:18 ] >>391 > 基本らしいですが何故節約になるのかわかりません。 節約にはならないだろう。 普通にコンストラクタを起動するだけなのだから。 もしかしたら>>377 を読んで思ったのかもしれないが、 誰も指摘していないだけで>>377 は普通に間違っているから 鵜呑みにしてはならない。
400 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 18:12:29 ] 配置newした場所にまた配置newしたら、後にnewした内容で初期化される? 頻繁にnewする必要がある場合、どうしたら早くなるだろうか。
401 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 18:18:27 ] g++ (GCC) 4.2.1 のコードに #include <stdio.h> こんなのがあったんですが、どういう意味デツカ
402 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 18:19:16 ] >>401 その部分にstdio.hの内容をコピペするって意味。
403 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 18:26:41 ] >>400 配置newしたら、対応したdelete呼ばないと悪い意味で破壊されるんじゃね。 new(GlobalPool)->delete(Pointer,GlobalPool)->new(GlobalPool)->dele... の順じゃないとだめじゃね? 利点はメモリを確保するという動作を放棄できる。
404 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 18:31:42 ] >>402 昔からある、仕様なのでしょうか?それとも最近のC++0x 9の仕様ですか。
405 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 18:33:41 ] もうスルーでいいよ
406 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 18:37:37 ] >>402 ごめんなさい、firefoxのバグなのでしょうか IE で見ると #include <stdio.h>なのですが、firefoxでは #include <stdio.h&gt; &gt;この部分は半角 こうなってた、ソースコードがあったんでびっくりして聞いてしまいました。
407 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 18:45:19 ] そりゃHTMLの特殊文字だ。C++関係ない。 HTMLスレかFirefoxスレ逝け。
408 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 18:48:16 ] HTMLのソースで>が>になってたんじゃね
409 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 18:49:54 ] ―ッ!!? > >が&gt;になってたんじゃね のまちがい
410 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:20:29 ] >>404 #include <cstdio> じゃないのが納得いかないという雰囲気でもない?
411 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:21:50 ] ってごめんよー続き見てなかったよー 具体的にどのファイルか教えてもらえると助かる、、、わけでもないけど興味がある
412 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:29:37 ] >>411 それは知らん。 人によって違うから。 #includeのルールに則って考えて見て。 普通はコンパイラのパスの通っているディレクトリで、 stdio.hって名前のヘッダを探せば一つしか無いと思うけど。
413 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 20:58:01 ] いや、GCCのコードに、だろ?
414 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 21:29:49 ] >>413 ?何?? まあいいや。
415 名前:デフォルトの名無しさん mailto:sage [2010/04/30(金) 21:59:43 ] そうですね。