1 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 03:00:31.85 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part92 toro.2ch.net/test/read.cgi/tech/1320339482/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.77【環境依存OK】 toro.2ch.net/test/read.cgi/tech/1323692486/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
2 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 03:01:07.68 ] ■基本■ [C++ FAQ] www.parashift.com/c++-faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) Cとその仕様を比較しながらの解説なので分かりやすい。 ***** 質問の前に必ずこの二つに目を通してください ***** [C/C++ リファレンス] en.cppreference.com/w/cpp (英語) ja.cppreference.com/w/cpp (↑の日本語訳だけどまだ未完) [Stroustrup] www2.research.att.com/~bs/ [C++ International Standard] www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?csnumber=50372 [JTC1/SC22/WG21 - C++] www.open-std.org/jtc1/sc22/wg21/ ここから規格の最新ドラフトがダウンロードできる。 [JIS X3014] www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014 ISO規格の日本語訳。JIS X3014:2003はISO/IEC 14882:2003 (E)に対応。
3 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 03:01:21.80 ] ■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 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 03:01:36.34 ] ■Books■ amazon C,C++関連書籍 www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/ www.amazon.co.jp/b/?node=754384 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/ www.amazon.co.jp/exec/obidos/ASIN/4894714833/ (翻訳) Exceptional C++ Style www.amazon.com/exec/obidos/ASIN/0201760428/ www.amazon.co.jp/exec/obidos/ASIN/4894714663/ (翻訳)
5 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 03:01:46.07 ] ■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/
6 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 03:02:14.47 ] テンプレここまで。あと続けたい人は好きにして。
7 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 03:02:44.67 ] STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
8 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 03:06:49.86 ] >>6 まだ終わってないぞ 壁紙にしてね! ttp://www2.research.att.com/~bs/Bjarne.jpg
9 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 03:21:31.15 ] おつ
10 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 07:33:10.63 ] >>7 は根強い人気だな そう言えばランタイムライブラリのDLLって テンプレートでも std::vector<int> とか基本的なものくらいは 含んでたりするんだろうか?
11 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 07:59:16.56 ] テンプレートはないだろ
12 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 08:42:33.23 ] 本当にテンプレートを使ったことがあれば、 exportが無謀って事はすぐにわかるだろ。
13 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 09:33:16.13 ] friendクラスとクラス内クラスってどういった違いがあるんでしょうか class Hoge { friend class FactoryA; class FactoryB; private: Hoge(int init); // ry }; class FactoryA { private: int i; public: FactoryA(void) : i(0) { } Hoge * Create(void) { return new Hoge(++i); } }; class FactoryB { private: int i; public: FactoryB(void) : i(0) { } Hoge * Create(void) { return new Hoge(++i); } }; パッと見どちらとも同じような気がするのですが
14 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 09:39:18.43 ] コンパイル通らんだろそれ
15 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 11:41:47.45 ] 静的に関数を呼びだせば体が空の関数は最適化によって 何も無いようになりますか?
16 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 11:57:27.42 ] >>15 コンパイラの実装や設定次第。試せ。
17 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 12:13:57.34 ] C++0xに関数を定数にする機能あったじゃないですか? それ使えば出来ませんか? factoryをテンプレート型として 体が空のときはその機能を使い factory.a()は右辺値の定数だから 何もすることが無いみたいなこと なりませんか?
18 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 12:19:30.84 ] constexprはコンパイルタイムにガーッと計算して結果を埋め込む機能だけど。 小さい関数はインライン展開を期待したほうがいいんじゃないか?
19 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 12:25:12.63 ] >>15 ,17 最適化するもなにも、空の関数はそもそも何もしないので、 ちょっと何言ってるかわからないですね。
20 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 12:29:47.59 ] 空の関数はスタックに引数を詰んだりするんですよ?
21 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 12:34:07.58 ] >>20 >>16
22 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 12:50:46.39 ] くだらないこと言ってないでさっさとアセンブラコード見ればいいと思うの tmp> g++ -S test.cc && cat test.s
23 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 13:39:49.61 ] struct A{ typedef int type; }; struct B : A{ type a; } b; &bと&(b.a)が同じアドレスをさしてほしいのですが データメンバのないクラスを継承したときに サイズが増えないようにする方法はありませんか?
24 名前:23 mailto:sage [2011/12/27(火) 13:55:22.69 ] データメンバがなく 関数だけが定義してあるクラスを複数継承したら サイズがどんどん増えていってしまいました。 ttp://sites.google.com/site/boostjp/tips/operators これとは少し違うのですが、これも演算子だけが定義してある クラスを継承していると思うのですが この場合はサイズが増えてしまうのでしょうか? それとも増えないようにする方法があるのでしょうか?
25 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 15:18:15.80 ] >>23 Aは空クラスなのでサイズ1 Bは変数があるからそのサイズになる なのでサイズは必ず増える
26 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 15:25:55.72 ] あと、Aは継承時にはサイズ0として扱われるはずなので、 &b == &b.a になると思うんだが
27 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 15:28:35.33 ] 0にするかどうかはコンパイラの最適化次第じゃなかったか
28 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 15:32:00.59 ] >>23 template <class Derived> class A { protected: ~A(void) { } public: typedef int type ; } ; class B : public A<B> { public: type a ; } ; とりあえずこう書いてあとはコンパイラの気分しだい
29 名前:23 mailto:sage [2011/12/27(火) 15:34:12.73 ] 空クラスであるにもかかわらず 継承時にサイズが0として扱われない条件というのがあるのでしょうか。 情報の後出しになってしまい申し訳ないのですが template<typename T> struct ptr_convertable{ operator T*(){ return *(T**)this; } }; struct my_int_ptr : ptr_convertable<int>{ int *p; }; int a; my_int_ptr b; b.p = &a; int *c = b; こういう感じのことをやろうとしています。
30 名前:23 mailto:sage [2011/12/27(火) 15:47:37.76 ] struct A{}; struct B : A{}; struct C{ operator int(){} }; struct D : C{}; struct E : B, D{}; struct F{int a;}; struct G : F{}; struct H : E, G{}; struct I : G, E{}; int a = sizeof(A); //1 int b = sizeof(B); //1 int c = sizeof(C); //1 int d = sizeof(D); //1 int e = sizeof(E); //1 int f = sizeof(F); //4 int g = sizeof(G); //4 int h = sizeof(H); //5 int i = sizeof(I); //5 クラスの内容にはあまり関係ないようです。
31 名前:23 mailto:sage [2011/12/27(火) 15:55:00.89 ] すいません、更新せずに書き込んでしまいました。 >>27 >>28 protectedデストラクタを書いてみましたが結果は変わりませんでした。 変換対象のクラスが多いので、こうすれば1行で書けるかと思ったのですが なんか別の方法はないでしょうか。 マクロであきらめようかな。
32 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 17:11:35.93 ] >>31 多重継承で親が重なる場合に増えてるね。
33 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 17:39:37.10 ] まさか関数ってvirtualの? それだと仮想関数テーブルの分どんどん増えると思うけど。
34 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 19:30:47.70 ] >>20 最適化してバックトレースとってみ。 リンケージが同じなら消失するから。
35 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 19:34:47.21 ] >>29 つかアドレス一緒にして何するつもりよ
36 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 20:19:02.71 ] >>32 > 多重継承で親が重なる場合に増えてるね 全ての基底クラス部分を区別できる形で表現できる必要があるからな。 struct B {}; struct D1 : B {}; struct D2 : B {}; struct D12 : D1, D2 {}; D12 * pd12 = new D12; // 1 D1 * pd1 = pd12; // 2 D2 * pd2 = pd12; // 3 B * pbd1 = static_cast<D1 *>(pd12); // 4 B * pbd2 = static_cast<D2 *>(pd12); // 5 1と2,3は型が違う。4,5は型が同じなのでアドレスを変えて違いを出す。
37 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 20:19:50.47 ] 何かトリッキーな事でもしたいんじゃね C++はどうしてもCより抽象度が高くなるからアドレス関係をいじると あまり無茶は出来ないよな
38 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 20:34:58.10 ] 平松邦夫/民主党 大阪市役所・自治労・大阪市労働組合・日教組・大阪市教育委員会・自民党・共産党・社民党・関西電力・住友グループ ・毎日放送・毎日新聞・関西経済連合・日本原子力発電株式会社 ・ 週刊文春・週刊新潮・NHK・朝日新聞・読売新聞 ・部落解放同盟・朝鮮総連・在日本大韓民国民団・日本遊技関連事業協会・全日本遊技事業協同組合連合会・日本弁護士連合会・生活保護受給者・反日左翼・9条の会・革マル派・中核派 VS 橋下徹/維新の会 大阪市民・みんなの党・国民新党・亀井静香・石原慎太郎・東国原英夫 様子見:公明
39 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 21:12:02.53 ] >>12 exportじゃなくて明示的実体化の話だよ
40 名前:デフォルトの名無しさん mailto:sage [2011/12/27(火) 22:50:38.50 ] >>39 それとDLLだけとじゃさっぱり分からんのですけど。
41 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 01:26:43.45 ] >>40 明示的な実体化を行うと、別リンケージに関数の実体が生成される。 DLLでも同じ話。実体がある以上他のDLLやEXEで使用できる。 てか、このへんは初歩的な話じゃ・・・
42 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 01:41:31.98 ] >>29 それ、結局派生側の指定位置に生の T* をメンバで持つことを強要してんじゃん。 ptr_convertable が T* 持てば全て自然に解決する話じゃないの?
43 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 01:42:13.22 ] >>37 CにできてC++にできないアドレス操作なんて無いだろ。
44 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 05:14:11.43 ] >>43 いやそういう意味じゃない Cだと構造体の中に何かを入れて後から伸ばすとか割りと見えやすかったけど C++のクラスで同じ事をしようとすると仮想関数やら大きさ最低1バイトの縛りやら あと継承なんかしていたら伸ばそうとした途端に他のメンバが壊れたり いろいろ気を使うという事を言いたかった
45 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 06:28:37.89 ] >>44 配列以外のアドレス(ポインタ)加減算がCなら安全なことがあると思ってるんなら おおかたただの勘違い。規格上認められる操作は大差ない。 たまたまプログラマの間違った期待どおりに動いてしまうことがCのほうがいくらか 多い(C++のほうがいくらか少ない)というだけのこと。 実際の違いと言えるところとして可変長配列と構造体中の 0 長配列メンバがあるけど、 それらも「抽象度」がどうのこうのではない。 seclan.dll.jp/c99d/c99d04.htm
46 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 06:38:56.59 ] そうなのか vtableとかどこにくっついているか実装依存なので扱いにくいのではと思ったんだけど
47 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 07:06:16.11 ] >>46 vtable以外にも、オブジェクトのレイアウトに関して実装依存なことはパディングやら アライメントやらCの範囲でもいくらでも考えられるからね。 www.kouno.jp/home/c_faq/c16.html#5 > 16.5: このプログラム、あるマシンではうまく走るのに、別のマシンだと変 な結果を返す。もっと変なことに、デバッグ用の出力を付けたり外し たりすると症状が違ってくる。 > A: おかしくなる可能性のあるものはたくさんある。以下に可能性の高い ものをいくつか示す。 ... > 対象となる具体的なシステムで コードの生成されかたを決 め付けて、こういう使いかたを考え付くとは俺って頭がいい なと思っていることはなんでも
48 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 07:09:56.13 ] Cは継承や仮想継承、仮想関数がないからそれだけでもC++よりは扱いやすい 構造体だと思ったんだが >>47 のリンクは知ってる トリッキーな事をすると必ずリスクは付いて回る しかしC++はそのトリッキーな事が致命的な結果をもたらす率が高いと思う
49 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 07:31:04.25 ] >>45 反応する所が違うだろ クラスに対してトリッキーな事(強制キャストが必要な操作)を すんなってのが要点なんだから。 別にPODなコードは絶対安全とかそんな話を してるわけじゃないだろ。
50 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 07:43:35.04 ] >>49 まあいいだろ 俺は前スレからの流れで書いたつもりだったんだが汲んでもらえなかったようなので クラスはPODにいろいろ厄介な物が(もちろんメリットの方が遥かに大きいが)付いているので あまり変な事はしない方がいいよって意味で書いた PODも規格外の事をすれば当然危ない 当たり前の事だよな
51 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 07:45:26.57 ] 無茶なキャストやアドレス操作をすることを前提にして 問題を起こす率の高い低いを考える意味がわからんな。 まぁ「思う」のは自由だよね。
52 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 08:44:15.45 ] >>10 文字列関係は大体入ってた。complexやnumeric_limitsなんかも入ってることはあるな。
53 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 09:00:15.72 ] >>51 いやだから「規格外」である事は承知で、Cで無茶をして動かしている例はいくらでもある プログラム組んだ事ないのか? でもC++でそれをやろうとするとほとんど不可能になると言いたいだけの話 お前アスペだろ
54 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 09:09:48.07 ] C++でも規格外なコードは書けるし書かれまくってるだろ ラップするから見えないだけで
55 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 12:33:24.42 ] 駄目だこいつ 相手しないでおこう
56 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 12:35:38.71 ] >>55 >>55
57 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 13:24:02.68 ] 56 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
58 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 13:38:54.97 ] 57 名前:チンカス[sage] 投稿日:臭い
59 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 15:31:31.63 ] >>47 そういや、vtableなんてポインタじゃ無くても実装できるしな。 動的リンクを考えなきゃ、コンパイラが全てのクラスのvtableを 直列した配列にして、オブジェクトには、その配列のオフセットを 持たせるだけってのでもいいわけだしな。
60 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 17:35:07.64 ] 仮想関数のテンプレート化はできないんでしょうか? class Hoge { public: template <class Iterator> virtual void Func1(Iterator begin, Iterator end) = 0 ; template <class Inserter> virtual void Func2(Inserter inserter) const = 0 ; } ; class HogeEx : public Hoge { std::vector<int> v; public: template <class Iterator> void Func1(Iterator begin, Iterator end) { v.assign(begin, end); } template <class Inserter> void Func2(Inserter inserter) { inserter = v.front(); } } みたいな感じで主にイテレーター関係やファンクタを引数に取る関数で使いたいんですけど
61 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 17:41:09.06 ] ああそれね。そういうのウチはやってないから。
62 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 17:54:03.06 ] 何か朝から頭のおかしい粘着がいるなあ >>60 標準C++の仕様では出来ないけど、boostを使うとそれらしいのは出来るみたい d.hatena.ne.jp/moriyoshi/20090727/1248697647
63 名前:デフォルトの名無しさん mailto:sage [2011/12/28(水) 18:27:38.15 ] >>62 それっぽくできました ありがとうございます
64 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 01:17:05.61 ] 相談 C++(C)でdllのリソースファイルとして.txtファイルを埋め込んで、そこから文字列を取り出すにはどうしたらよいですか? 検索しても出てこないのはもしかして当たり前のこと過ぎるからでしょうか・・・
65 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 01:37:47.41 ] C/C++にそのような機能はないのでなんらかのAPIを使う
66 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 01:41:34.87 ] >>64 ID_SAMPLE TEXT_DATA DISCARDABLE "text.txt" リソース名 リソースグループ DISCARDABLE "ファイル名" www.sm.rim.or.jp/~shishido/rctest.html
67 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 02:01:52.43 ] WindowsならWin32スレいけ、っていえるほどあそこいいところじゃないからとりあえずはっとく BOOL CALLBACK 探すコールバック( HMODULE hModule, LPCWSTR lpType, LPWSTR lpName, LONG_PTR lParam ) { HRSRC hrsrc = FindResource( hModule, lpName, lpType ); if( hrsrc ) { void* data = LoadResource( hModule, hrsrc ); if( data ) { hoge* pwork = (hoge*)lParam; strcpy( pwork->hage, data ); } } return TRUE; } void 探す関数() { hoge work; HMODULE hModule = LoadLibrary( "dllのパス" ); if( hModule ) { EnumResourceNames( hModule, RT_STRING, 探すコールバック, (LONG_PTR)&work ); FreeLibrary( hModule ); } } あぁ、ファイル埋め込みならRT_STRINGじゃなくてRCDATAか
68 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 02:13:11.19 ] ありがとう
69 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 06:17:59.89 ] >>65 分からないのなら黙ってろよカス
70 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 09:08:42.19 ] >>65-67 ありがとうございます なるほど、やはり一発でポンというのはないのですね またわからないことが出来たらよろしくお願いします
71 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 09:25:50.01 ] 複数の配列を合併してひとつの配列をつくりだすことに もっとも適したデータ構造をおしえてください。
72 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 10:19:04.72 ] 配列とそのポインタの配列。
73 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 10:20:11.71 ] RopeかFingerTreeあたりか
74 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 11:43:51.93 ] std::vector<std::vector<>>
75 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 11:50:20.64 ] 2重配列のやつだと同じ要素が2つあるやつの合併は処理が困っちゃいますよね。
76 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 11:50:43.96 ] それは重くなる。 std::vector<std::vector<>*>にしとくべき。 ポインタだけならサイズ変更しても負荷は小さい。
77 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 11:52:02.05 ] 普通、連結と言ったら要素は重複しても、単に前か後ろにつなげるだけだ。
78 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 12:05:26.22 ] >>71 vectorのリストがいいよ 先頭のベクタの長さをNとする 先頭を除いたベクタのリストの長さが合計で2Nに達したら 先頭を倍+αに伸ばしてそこに先頭を除いたベクタの内容をコピーして先頭以外を解放する
79 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 12:09:31.82 ] union-find木
80 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 12:29:23.89 ] 要素の重複は削り、順序は無視して良いならstd::setに入れとけ。
81 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 13:07:34.03 ] mapで使えるやつがないな。 メモリ食いすぎる。 STLportがマシだが。 Googleとか頻繁に更新してるのにSTLportのメモリと速度に追いつけず。
82 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 13:20:46.52 ] 同条件で比較したmapの性能。stlport_std::hash_mapが全てにおいて優れて他のやつ使う余地がないな。 stlport_std::hash_map Insert Time: 8.859 sec. Search Time: 2.875 sec. ページフォールト数: 11007 最大ワーキングセットサイズ: 42045.4KB stlport_std::map Insert Time: 12.265 sec. Search Time: 14.953 sec. ページフォールト数: 11422 最大ワーキングセットサイズ: 46846.0KB std::map VC9 Insert Time: 14.078 sec. Search Time: 13.953 sec. ページフォールト数: 14323 最大ワーキングセットサイズ: 58740.7KB stdext::hash_map VC9 Insert Time: 10.109 sec. Search Time: 7.5 sec. ページフォールト数: 13922 最大ワーキングセットサイズ: 56836.1KB google::sparse_hash_map ver.1.12 Insert Time: 51.921 sec. Search Time: 9.407 sec. ページフォールト数: 11949 最大ワーキングセットサイズ: 48664.6KB google::dense_hash_map ver.1.12 Insert Time: 10.14 sec. Search Time: 5.375 sec. ページフォールト数: 29635 最大ワーキングセットサイズ: 82599.9KB
83 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 13:24:36.39 ] 自分の環境はスペックであることは書いておかなければいけなかった。物理メモリが1ギガしかない。 消費メモリサイズには影響は無いと思うが、ページフォールトによる速度低下はあり得る。 google::dense_hash_mapなどはメモリ食うから、容量が大きいマシンでつかったら速度は一番になり得る。
84 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 14:16:07.33 ] これがコピペだと気付くのに時間かかった
85 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 14:42:32.01 ] コピペだけど自作データだが。
86 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 15:10:51.18 ] 再試+テストコード公開よろ ここに貼るのが無理でもblogの方にでも貼っていただければ
87 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 15:35:18.00 ] こんなのだが。map部分は書き換える。 #include <string> #include <time.h> #include <unordered_map> #include <windows.h> #include <psapi.h> #pragma comment (lib, "psapi.lib") using namespace std; int InsertNum=500000, SearchNum=4000000; double timer();string strgen();void meminfo(); int main() { tr1::unordered_map<string,int> hmap; int i; timer(); for(i = 0; i < InsertNum; i++) hmap.insert( make_pair( strgen(), i ) ); printf("Insert Time: %fsec.\n", timer()); timer(); for(int n=0; n<100; n++) { string find = strgen(); for(i = 0; i <= SearchNum/100; i++) hmap.find(find); } printf("Search Time: %fsec.\n", timer()); meminfo(); } double timer() { static int n=-1; static unsigned int cl[2]; if(n==-1) { n=0; cl[0]=clock(); return 0; } n=1-n; cl[n]=clock(); return (cl[n] - cl[1-n]+0.0)/CLOCKS_PER_SEC; } unsigned int randxor() { static unsigned int t, x=123456789,y=362436069,z=521288629,w=88675123;t=x^(x<<11); x=y; y=z; z=w; return w^=(w>>19 )^t^(t>>8 ); } string strgen() { string str; for(int j = 0; j < 1+randxor()%4; j++) { int r=randxor(); for(int n=0; n<32; n+=2) str+=(char)('a'+(r>>n)%4); } return str; } void meminfo() { PROCESS_MEMORY_COUNTERS memInfo = {0}; GetProcessMemoryInfo( GetCurrentProcess(), &memInfo, sizeof(memInfo) ); printf("ページフォールト数: %d\n", memInfo.PageFaultCount); printf("最大ワーキングセットサイズ: %0.1fKB\n", 0.001*memInfo.PeakWorkingSetSize); printf("最大ページングファイル使用サイズ: %0.1fKB\n", 0.001*memInfo.PeakPagefileUsage);}
88 名前:デフォルトの名無しさん mailto:sage [2011/12/29(木) 21:58:38.76 ] | ┏━━━┓ 従軍慰安婦は反日朝日新聞の捏造でした。 | ┃借収安┃ デマだらけの報道に注意しよう | ┃三三婦┃ | ┃○○大┃ | ┃○○募┃ | ┃○圓集┃ | ┃圓以 ┃ | ┃迄上 ┃_ \┃可 ┃ \ ┗━━━┛ \  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | img04.ti-da.net/usr/wishcomestrue/t02200190_0220019010786142693.jpg
89 名前:デフォルトの名無しさん mailto:sage [2011/12/30(金) 02:29:27.45 ] stlportのhash<string>はあんまり質が良くないから気をつけたほうがいいかも
90 名前:デフォルトの名無しさん mailto:sage [2011/12/30(金) 22:49:56.84 ] たまに衝突してもいいというマップだと省メモリ・高速にできるな。
91 名前:デフォルトの名無しさん mailto:sage [2011/12/31(土) 09:36:49.83 ] listのmergeって内部のデータを盗むやつだから 新たにデータをつくりませんよね? あと順序を維持したままというのはmergeすると ソートが勝手に行われるということですか? 単純に後ろにくっ付けたいときはどうしたらいいですか? あとdequeやvectorで2つのやつを新たなデータを作らずにマージできますか?
92 名前:デフォルトの名無しさん mailto:sage [2011/12/31(土) 10:04:40.11 ] listはデータ構造的にたまたまそういうことができるだけ STLのほかのコンテナでは無理 setやmapならできそうな気もするけどSTLには残念ながらそういう機能はない ソートせずにくっつけたいだけならspliceを使う
93 名前:デフォルトの名無しさん mailto:sage [2011/12/31(土) 10:11:47.79 ] 配列のポインタを保持してそれでつなげ。 そしたら低負荷だ。
94 名前:デフォルトの名無しさん mailto:sage [2011/12/31(土) 10:17:15.52 ] 派生クラスのコンストラクタを自動でprotectedにするテクニックってありますか? 派生可能かつ生成関数を通じてのみ生成可能なクラス群を書きたいのだけど いちいち全クラスにprotectedコンストラクタを書くのが面倒です (例) class X { protected: // CTORS virtual ~X(void) {}; public: static X * Create(void) { return new X; } }; class Y : public X { protected: // CTORS public: static Y * Create(void) { return new Y; } }; class Z : public Y { private: // final的な意味で // CTORS public: static Z * Create(void) { return new Z; } };
95 名前:デフォルトの名無しさん mailto:sage [2011/12/31(土) 11:32:10.13 ] 配列の配列がdequeってかいてあったからマージできるとおもったけど 出来ないんですね。 おとなしくvector型の配列つくりますね。
96 名前:デフォルトの名無しさん mailto:sage [2011/12/31(土) 13:05:16.37 ] >>94 無理じゃね そもそも何でコンストラクターはダメで Createならいいの?
97 名前:デフォルトの名無しさん mailto:sage [2011/12/31(土) 13:11:33.81 ] >>96 enable_shared_from_thisとかその他のフックがついてる時 あるいはCreateでマネージャに登録などの他の処理もしてる時 とかですかね
98 名前:デフォルトの名無しさん mailto:sage [2011/12/31(土) 17:24:46.05 ] cp2.uh-oh.jp/read_img/index/ab83e09400ff17d99f45ceee15a37e09.jpg cp2.uh-oh.jp/read_img/index/a58c2ddc9cdbe45529ef0d58c95cc232.jpg テレビに騙されるな(自称街の人-台本読んでるだけの業者)
99 名前:デフォルトの名無しさん mailto:sage [2012/01/01(日) 10:33:04.62 ] 寿命の管理の責任ははっきりしているけれど共有したいポインタがあるから unique_ptrのweak_ptrみたいなものが欲しいのだけどそういうイディオムとかって有りませんか?
100 名前:デフォルトの名無しさん mailto:sage [2012/01/01(日) 11:22:44.36 ] unique_ptrを参照渡しする
101 名前:デフォルトの名無しさん mailto:sage [2012/01/01(日) 13:20:36.24 ] #include <memory> #include <iostream> #include <stdexcept> template<typename T> void f(std::unique_ptr<T> const& p) { if (p.get()) { std::cout << *p << std::endl; } else { throw std::invalid_argument("no ownership"); } } int main() { std::unique_ptr<int> p(new int(0)); f(p); std::unique_ptr<int> q = std::move(p); try { f(p); } catch (std::invalid_argument const&) { std::cerr << "p lost ownership" << std::endl; } f(q); } こんな使い方していいのだろうか・・・
102 名前:デフォルトの名無しさん mailto:sage [2012/01/01(日) 14:08:38.33 ] 参照だけではウニポが無効になったことを検知できない
103 名前:デフォルトの名無しさん mailto:sage [2012/01/01(日) 16:37:02.96 ] unique_ptrがscope outしたらそもそも見えない std::moveで他のunique_ptrに所有権が移ればget() == nullptrになる それ以外で無効になるときってどういうのがありますか?
104 名前:デフォルトの名無しさん mailto:sage [2012/01/01(日) 16:53:04.58 ] 明示的に開放した場合
105 名前:デフォルトの名無しさん mailto:sage [2012/01/01(日) 17:23:22.11 ] >>104 なるほど明示的な開放ですか、確かに弱参照っぽく使うとなるとそういうケースも当然考えられますね そこでこの操作をunique_ptrのデストラクタにおける所有権放棄+リソースの解放を手作業で行うものと見做して rp = p.release();とした後にp.get_deleter()(rp);としましたが、その直後のpはreleaseの仕様よりp.get() == nullptrとなり unique_ptrの参照から無効となったことを検出できているようですが、これでは駄目なのでしょうか? これ以外にはdelete p.get();のような対処不可能なものしか考えられないんですが、他にも見落としがあるという気もします
106 名前:デフォルトの名無しさん mailto:sage [2012/01/01(日) 17:29:54.06 ] ユニポに割り当てられていたメモリが最利用されて他のオブジェクトで上書きされた時
107 名前:デフォルトの名無しさん mailto:sage [2012/01/01(日) 18:38:38.48 ] なるほど、やはり排他付きのshared_ptrとweak_ptrでやった方が楽そうですね
108 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 00:16:22.68 ] 便乗してshared_ptrに関する質問なんだけど、 void SetValue(const shared_ptr<Value> & value) { ... } みたいな引数のconst参照渡しは認められているけど、 const shared_ptr<Value> & GetValue() const { ... } みたいなconst参照返しは認められていないのはなぜ?
109 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 00:20:28.94 ] べつに認められてないことはないよ
110 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 00:23:02.84 ] >>108 それでも、問題ないと思うけど、 shared_ptrは自身のコピーを作るときにカウント増やすのであんまり参照返しにする意味はないと思う。
111 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 05:22:03.18 ] なるほど、大丈夫なのか shared_ptrを参照返しするばあい、 shared_ptrのポインタ(参照)を取得→参照返し→呼び出し側の処理 だから、呼び出し側の処理で参照カウントのインクリメントをする前に、 参照カウントが0になるような処理が他のスレッドとかで発生する(するのか?)とまずいと思ったんだけど・・・ shared_ptrを値返し(shared_ptr<Value> GetValue() const)するばあい、 参照カウントのインクリメント→値返し→呼び出し側の処理 だから、途中でカウントが0になることはあり得ないという考え
112 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 05:37:37.05 ] 値返しでも ・GetValue呼び出し ・他スレッドで内部スマポを破棄 ・GetValueの戻り値コピー(空スマポが返る) という順番になる可能性はある。
113 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 07:20:55.20 ] おお、確かにあるわな つまるところ微妙に大きい構造体のメンバ変数を値返しするか、参照返しするかの違いか
114 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 08:52:45.66 ] スレッドAにスマポを保持 スレッドBにスマポを保持 この時点でカウントは2 スレッドA内のスマポ保持者が同じスレッドにスマポを参照で返そうが値で返そうが問題ない 返してる途中でスレッドB内のスマポが破棄されてもカウントは1以上と保証されてる やってはいけないのは何の防御もせずにスレッド間で直接スマポの参照をやり取りすること まあそんなことする奴はいないと思うが
115 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 09:25:55.29 ] std::list<int[2}>は作れますか? 作れなければどうしたら好いですか
116 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 09:44:22.44 ] struct a { int a[2]; } list<a>
117 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 12:12:05.55 ] >>115 なんでstd::list<int[2]>なんですか? std::list<int>じゃダメなんですか?
118 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 15:02:12.31 ] そこはstd::list<std::pair<int, int>>で
119 名前:デフォルトの名無しさん mailto:sage [2012/01/02(月) 16:26:27.80 ] boost::arrayなら入れられる
120 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 01:03:05.84 ] >>144 >やってはいけないのは何の防御もせずにスレッド間で直接スマポの参照をやり取りすること 参照返しはダメだとして、値返しならスレッドセーフになる? あと、スレッド間の参照渡しも危ない? BOOST_SP_DISABLE_THREADSを宣言したばあい、スレッド間での ・値渡し ・参照渡し ・値返し ・参照返し の動作はどうなりますか?
121 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 12:16:23.78 ] class Base{ コンストラクタとデストラクタ } class Super:Base{ コンストラクタ1 コンストラクタ2 } コンストラクタ1:Baseコンストラクタ{ (コンストラクタ2をオーバーロード) } コンストラクタ2:Baseコンストラクタ{ ... } こうすると、コンストラクタ1を呼び出した時、多分そのスコープを抜けるときにBaseのデストラクタを呼び出して 困ったことになるんですが回避方法はありますか?
122 名前:121 mailto:sage [2012/01/03(火) 12:39:01.09 ] ちょっと調べて見ましたがコンストラクタはコンストラクタでオーバーロードすべきではなさそうですね コンストラクタ2の内容を別の関数にしてそれを実行させることで回避させました
123 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 13:10:23.46 ] >122 >コンストラクタ2の内容を別の関数にしてそれを実行させることで回避させました 多分、対処はそれで正しい。が、 ・オーバーロードって用語、意味間違ってるんじゃね? ・Super→Sub あるいは Base→Derived なので Base、Super って書かれるとはぁ?って感じがする ・コンストラクタの中で他のコンストラクタを呼び出すことは出来ない。多分、一時オブジェクトを生成してるだけ。 struct Derived : Base { Derived() : Base() {} Derived(int n) : Base() { Derived(); // 一時オブジェクトを生成してるだけ } }; ・「ちょっと調べて見ましたがコンストラクタはコンストラクタでオーバーロードすべきではなさそうですね」 標準ライブラリでも普通にオーバーロードしてると思うが。
124 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 14:20:14.86 ] C++ 11 delegating constructor
125 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 15:59:58.36 ] ちょっと質問です。 char c[4] = {'a','\0','*','*'}; c は文字列を表していますが、実際は 4byte 固定のバイナリデータで、\0 の後ろにはゴミが入っています。 3文字以下の場合は \0 終端が保証されていますが、4文字ちょうどの場合は \0 終端されていません。 この c を std::string に変換するにはどうすればいいでしょうか。 案1: std::string s = std::string(c); これだと、\0 終端していない場合はうまく変換できません。 案2: std::string s = std::string(c, 4); これでうまく行くと思ったのですが、続けて s += "def"; とすると、 s の中身が a \0 * * d e f \0 となってしまいました。4文字というデータがどこかに残っているようです。 理想では a d e f \0 となってほしいです。 自分で \0 を探索して…などすれば上手く行きますが、もっとスマートな方法があればと思います。 よろしくお願いします。
126 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 16:23:21.44 ] >>125 これくらいしか思いつかん std::string s = std::string(c, 4); s.resize(strlen(s.c_str()));
127 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 17:32:43.18 ] string s(string(c, 4).c_str());
128 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 17:41:00.83 ] >>127 ああーーそれだ! うまく行きましたありがとうございます!!
129 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 21:44:10.55 ] >>125 std::string s(c, std::find(c, c + 4, '\0'));
130 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 22:17:51.09 ] string自体に超最適化されたfindメンバがあるのに、どうして効率の低いアルゴリズムをわざわざ使いまんのや。
131 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 22:44:30.53 ] stringのfindメンバとやらで>129をもっと効率よくできるの?
132 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 22:47:03.31 ] C++ Coding Standards 「時期尚早の最不適化をしてはならない」原則に反する。 要するに糞コードを書くなってことだろ。
133 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 22:50:13.20 ] それとも Effective STL の「アルゴリズムより同名のメンバ関数を優先して使おう」だろうか。 どっちにしてもそんな初心者向けのルールすら無視して糞コード書いちゃだめだな。
134 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 23:30:38.66 ] どれを指して糞コードって言ってるの?良いコードはどんなの?
135 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 23:35:34.78 ] 同名とはいえ可換じゃない関数でそんなこと言われても
136 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 23:48:31.98 ] 当たり前すぎて議論するようなレベルの話じゃないが 理由を知りたいなら Effctive STL にも C++ Coding Standards にも載ってるからそれ読めれ。 っていうか、回答者なんだから知ってて当然だと思うんだけどどーなの?
137 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 23:56:50.99 ] >>131 大して変わらないと思うけど例えば char c[4] = {'a', '\0', '*', '*'}; std::string s = std::string(c, 4); std::cout << s << " length: " << s.size() << std::endl; s.resize(s.find('\0')); std::cout << s << " length: " << s.size() << std::endl;
138 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:09:20.40 ] それじゃ\0が含まれないとき死ぬだろ
139 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:16:29.56 ] あそっか、string::nposをチェックしないと行けないのか s.resize((s.find('\0') == std::string::npos) ? s.size() : s.find('\0')); なんか格好悪いなあ
140 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:18:31.63 ] if文で単純に分岐させた方がいいな std::string::size_type si = s.find('\0'); if (si != std::string::npos) s.resize(si);
141 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:39:53.13 ] すみません。以前こちらで仮想デストラクタについて質問したものです。 簡単な参照カウンタつきnew/delete を実装したく、Web ページをあさっていたのですが、delete/new の演算子オーバーロードのサンプルをみるかぎり、 class A { static void *operator new(size_t size) { malloc(size); } static void operator delete(void *p) { free(p) } }; という感じで、new/delete の中身は malloc()/free() になっているものしか見当たりませんでした。 これを <cstdlib> を使わずに c++ だけで完結させたいのですが、どうすればいいでしょうか。new/delete をオーバーロードした以上、malloc()/free() 呼び出しは不可避なのでしょうか。 キーワードをいただければありがたいです。よろしくお願いいたします。
142 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 00:43:19.71 ] ::newとか
143 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 01:10:59.02 ] プログラム系の質問とは若干離れてますが、 ここで議論してる事ってかなり高度な事ですよね プログラマ目指したいのですがここの話に参加できる位にならないと話にならない感じですか?
144 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 01:27:17.42 ] >>141 OSのメモリ関連のAPIを直接呼び出してもいいし(WinならVirtualAllocとかHeapAllocとか) そんなに大きな領域が必要でないならstatic char mempool[10000]とか確保しといてメモリプールとして少しずつ割り当てていくとかある
145 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 01:27:42.98 ] >>143 そうかもしれないしそうでないかもしれない精進あるのみ
146 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 01:34:47.30 ] >>145 そうですね 学校で無双して気持ち良くなってるレベルじゃダメですねw 精進しないとダメだとわからされました><
147 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 01:46:22.97 ] >>141 boost::poolは?
148 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 01:50:11.58 ] あ、今docのバグを発見した boost::poolのリンクが間違ってる boost/libs/pool/doc/index.html じゃなくて boost/libs/pool/doc/html/boost_pool/pool.html だ
149 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 01:50:44.55 ] boost/libs/pool/doc/html/index.html だった
150 名前:デフォルトの名無しさん [2012/01/04(水) 09:36:17.54 ] >>143 できないと話にならないブラック企業もあるし ずぶのド素人でも研修でちゃんと使い物にしてくれる優良企業もある
151 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 11:45:44.45 ] しかし、3ヶ月でC++が物になるとはちょっと思えんなぁ… Javaなら3ヶ月でも十分だけど。
152 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 11:55:40.49 ] 3日で経験3年とかいって放り込むのはよくあることでした
153 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 12:40:00.82 ] デストラクタでメモリを解放するとき、まだ参照しているところが残っていたら削除しないようにすねにはどうしたらできますか。 vector<クラス> a(100,クラス(5)); とすると初期化時に呼び出したクラスが解放処理してしまいます。
154 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 12:45:27.37 ] つ[コピーコンストラクタ]
155 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 13:02:12.39 ] サンクス
156 名前:片山博文MZ ◆0lBZNi.Q7evd [2012/01/04(水) 13:30:50.40 ] 難しいよぉ。助けてよ。。。 codepad.org/rn3cpaZh
157 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 13:31:16.58 ] codepad.org/BYwy3H3K Deep Copyの問題だよな 代入演算子を書いておけばなおよし
158 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 13:58:37.74 ] >>156 名前空間内でoperator newなどを定義するなと言ってくるんだが ..\New_test2.cpp:26:82: error: 'void* mzc::operator new(size_t, const mzc_debug_t&)' may not be declared within a namespace ..\New_test2.cpp:43:62: error: 'void* mzc::operator new [](size_t, const mzc_debug_t&)' may not be declared within a namespace ..\New_test2.cpp:47:34: error: 'void mzc::operator delete(void*)' may not be declared within a namespace ..\New_test2.cpp:70:36: error: 'void mzc::operator delete [](void*)' may not be declared within a namespace ..\New_test2.cpp:74:58: error: 'void mzc::operator delete(void*, const mzc_debug_t&)' may not be declared within a namespace ..\New_test2.cpp:91:60: error: 'void mzc::operator delete [](void*, const mzc_debug_t&)' may not be declared within a namespace 規格票は§3.6.2だな
159 名前:片山博文MZ ◆0lBZNi.Q7evd [2012/01/04(水) 14:12:04.44 ] >>156 >>158 codepad.org/y4kz6D2y 今度はBorland C++で失敗する。
160 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:17:26.14 ] >>159 ..\New_test3.cpp: In function 'void* operator new(size_t, const mzc_debug_t&)': ..\New_test3.cpp:26:37: error: 'malloc' was not declared in this scope ..\New_test3.cpp: In function 'void operator delete(void*)': ..\New_test3.cpp:56:11: error: 'free' was not declared in this scope ..\New_test3.cpp: In function 'void operator delete(void*, const mzc_debug_t&)': ..\New_test3.cpp:66:11: error: 'free' was not declared in this scope ..\New_test3.cpp: In function 'mzc_debug_t MzcNew(const char*, int)': ..\New_test3.cpp:77:26: error: 'strcpy' was not declared in this scope std:: と <cstdlib> <cstring> を忘れているだけだと思うが
161 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:21:03.91 ] >>137-140 効率悪くなってんじゃねーか。読みやすくもないし。どこも良くなっるように見えない。
162 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:23:24.64 ] >>161 だからどれでもいいんだって find()を使えと言われたから使っただけの話
163 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:27:24.47 ] stringはメモリ効率悪いよ。 char*なら終端は1バイトだけ。 stringは最低でも長さを表すのに4バイト(32ビット)使っている。 それ以上に無駄がある可能性あり。
164 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:28:52.98 ] stringに変換するなら、 string s = ch; もしくは string s = (string) ch; でいいだろ。
165 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 14:29:41.72 ] MinGWではOKだが、BCC55ではダメ。原因不明。 codepad.org/u5gfzDHk
166 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:30:28.96 ] >>164 お前さあ >>125 を良く読んでないだろ >案1: >std::string s = std::string(c); >これだと、\0 終端していない場合はうまく変換できません。 これを回避したいと言っているんだけど
167 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:30:37.40 ] stringはサイズの他にcapacityも持ってるんじゃないかなあ?
168 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:33:12.95 ] >>166 char*を渡されたとき終端は\0で判別するしかないだろう。 それかchar*と一緒にサイズを渡せば解決。 string(ch, size);
169 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:33:50.95 ] >>165 BCCのバージョンは? 俺のは最新のEmbarcadero6.43で問題なし ところでバグあるんじゃね?このソース CodeGuard掛けると何か言ってくるぞ Error 00003. 0x400000 (r) (Thread 0x1200): Exception 0xC0000005: Access violation at 0x4. | C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree line 1170: | _Nodeptr _Lbound(const key_type& _Keyval) const | { // find leftmost node not less than _Keyval |> _Nodeptr _Pnode = _Root(); | _Nodeptr _Wherenode = _Myhead; // end() if search fails | Call Tree: 0x00406F41(=operator_new1.exe:0x01:005F41) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#1170 0x0040511A(=operator_new1.exe:0x01:00411A) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#914 0x00402881(=operator_new1.exe:0x01:001881) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#888 0x004026F4(=operator_new1.exe:0x01:0016F4) operator_new1.cpp#49 0x00403535(=operator_new1.exe:0x01:002535) operator_new1.cpp#62 0x0040D19F(=operator_new1.exe:0x01:00C19F) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#189 0x0040D2BF(=operator_new1.exe:0x01:00C2BF) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#124 0x32C5F979(=CC32120MT.DLL:0x01:05E979) 0x32C65399(=CC32120MT.DLL:0x01:064399) 0x32C6533B(=CC32120MT.DLL:0x01:06433B) 0x32C9C66B(=CC32120MT.DLL:0x01:09B66B) 0x32C9CBA9(=CC32120MT.DLL:0x01:09BBA9) 0x32C012BB(=CC32120MT.DLL:0x01:0002BB) 0x7C9624CA(=ntdll.dll:0x01:0214CA) 0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
170 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:35:30.76 ] >>168 だからそれは>>125 に既に書いてあるから ちゃんと読んでから書け >案2: >std::string s = std::string(c, 4); >これでうまく行くと思ったのですが、続けて s += "def"; とすると、 >s の中身が a \0 * * d e f \0 となってしまいました。4文字というデータがどこかに残っているようです。 >理想では a d e f \0 となってほしいです。 >自分で \0 を探索して…などすれば上手く行きますが、もっとスマートな方法があればと思います。 >よろしくお願いします。
171 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:35:35.76 ] >>162 なんだ>>129 が書いたんじゃないのか。 お題はfind()を使って効率よく、だよ。
172 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:36:51.77 ] stringの一時オブジェクト作ってる時点でどうやっても>>129 より効率よくなんてならないよ。
173 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:37:00.55 ] テンプレートでTemplate N、 char[N]のようにサイズとれるか?無理だったか?
174 名前:170 mailto:sage [2012/01/04(水) 14:37:32.23 ] アンカー間違えた。 > なんだ>>129 が書いたんじゃないのか。 ここ>>130 ね。
175 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:39:45.29 ] >>170 それはゴミも渡しているんだよ。サイズは1だろが。
176 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 14:40:01.43 ] >>169 どうやらmainの初期化処理と終了処理の内部で::newが使われて いるのが原因らしい。bool g_initを付けてフラグで指定すると うまく動くようだ。でもこれって余分なコードだよね? codepad.org/xCEvYC2p
177 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:40:32.54 ] >>173 template <int N> void func(double (&a)[N]); みたいな奴か?
178 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:41:27.31 ] >>175 だからゴミを取り除く議論をしてるだろうが お前全然人のレス読まないのな
179 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:43:56.89 ] >>176 いやそれは関係ないと思う まだエラーが出るぞ Error 00003. 0x400000 (r) (Thread 0x0E18): Exception 0xC0000005: Access violation at 0x4. | C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree line 1170: | _Nodeptr _Lbound(const key_type& _Keyval) const | { // find leftmost node not less than _Keyval |> _Nodeptr _Pnode = _Root(); | _Nodeptr _Wherenode = _Myhead; // end() if search fails | Call Tree: 0x00406F41(=operator_new2.exe:0x01:005F41) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#1170 0x0040511A(=operator_new2.exe:0x01:00411A) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#914 0x00402881(=operator_new2.exe:0x01:001881) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xtree#888 0x004026F4(=operator_new2.exe:0x01:0016F4) operator_new2.cpp#49 0x00403535(=operator_new2.exe:0x01:002535) operator_new2.cpp#62 0x0040D19F(=operator_new2.exe:0x01:00C19F) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#189 0x0040D2BF(=operator_new2.exe:0x01:00C2BF) C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocnum#124 0x32C5F979(=CC32120MT.DLL:0x01:05E979) 0x32C65399(=CC32120MT.DLL:0x01:064399) 0x32C6533B(=CC32120MT.DLL:0x01:06433B) 0x32C9C66B(=CC32120MT.DLL:0x01:09B66B) 0x32C9CBA9(=CC32120MT.DLL:0x01:09BBA9) 0x32C012BB(=CC32120MT.DLL:0x01:0002BB) 0x7C9624CA(=ntdll.dll:0x01:0214CA) 0x7C81CAAE(=kernel32.dll:0x01:01BAAE)
180 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:47:40.15 ] >>178 ゴミを取り除くためにはstring s = ch;でいいだろ。 charのポインタを渡されたらサイズ不明で処理して\0を終端と見なすしかない。 それを自動でやってくれるのがstring s = ch;
181 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:48:10.94 ] もういい、しゃべるな。
182 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:49:16.16 ] >>180 >>125 > 4文字ちょうどの場合は \0 終端されていません。
183 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 14:51:58.17 ] g_mapのメソッドとnewとdeleteがどこからどういう順番で 呼ばれてくるかが分からない。
184 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:52:38.16 ] 自作関数に限らず、標準関数でも終端は\0として処理するぞ。 4バイト以内に\0が現れなければそれ以降に\0が出るところまでを一文と見なす。 これが正常動作。 最初に\0を付加しないのがバグ。
185 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 14:55:21.43 ] いまは固定長でサイズが4だと判明してるから、min( \0が現れる位置、4 )でいいがサイズ不明なら、\0が現れる位置という情報しか取れない。
186 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 14:56:48.54 ] g_mapのメソッドがコンストラクタよりも前に呼び出される ということ? どうすればいいんだ。。。
187 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 15:05:47.49 ] やった!できたー!皆様、有難うございます! codepad.org/Qz23i49K
188 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 15:13:30.05 ] >>187 このコードを見て皆様はどう思いますか?
189 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:22:46.37 ] >>184 バグじゃなくて、わざと'\0'終端でない場合どうするかって話をしてるんだが・・・文盲?
190 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:23:17.62 ] >>185 sizeof()でいいだろ
191 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:28:53.09 ] >>187 何これ Error 00001. 0x350010 (Thread 0x179C): Resource type mismatch: a(n) memory block was expected. free(0x00BAECC0) | operator_new3.cpp line 65: | } | |> std::free(p); | } | void operator delete[] (void* p) throw() The object array (0x00BAECC0) [size: 1 bytes] was created with new[] | C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocale line 443: | { // convert C string to _Elem sequence using _Cvtvec | size_t _Count = _CSTD strlen(_Ptr) + 1; |> _Elem *_Ptrdest = _NEW_CRT _Elem[_Count]; | | for (_Elem *_Ptrnext = _Ptrdest; 0 < _Count; --_Count, ++_Ptrnext, ++_Ptr)
192 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:29:40.55 ] Error 00003. 0x350010 (r) (Thread 0x179C): Resource type mismatch: a(n) memory block was expected. free(0x00BAECE0) | operator_new3.cpp line 65: | } | |> std::free(p); | } | void operator delete[] (void* p) throw() The object array (0x00BAECE0) [size: 5 bytes] was created with new[] | C:\Program Files\Embarcadero\RAD Studio\9.0\include\dinkumware\xlocale line 443: | { // convert C string to _Elem sequence using _Cvtvec | size_t _Count = _CSTD strlen(_Ptr) + 1; |> _Elem *_Ptrdest = _NEW_CRT _Elem[_Count]; | | for (_Elem *_Ptrnext = _Ptrdest; 0 < _Count; --_Count, ++_Ptrnext, ++_Ptr) Error 00004. 0x300010 (Thread 0x179C): Resource leak: The memory block (0xBA05A0) was never freed The memory block (0x00BA05A0) [size: 48 bytes] was allocated with malloc | operator_new3.cpp line 20: | void* operator new (size_t size) throw(std::bad_alloc) | { |> void *p = std::malloc(size ? size : 1); | if (p == NULL) throw std::bad_alloc(); | return p;
193 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:29:51.56 ] Error 00005. 0x300010 (Thread 0x179C): Resource leak: The memory block (0xB99270) was never freed The memory block (0x00B99270) [size: 540 bytes] was allocated with malloc | operator_new3.cpp line 20: | void* operator new (size_t size) throw(std::bad_alloc) | { |> void *p = std::malloc(size ? size : 1); | if (p == NULL) throw std::bad_alloc(); | return p;
194 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:53:35.70 ] ______ r〃〃〃 f7⌒ろ) l‖‖‖ || f灯 |‖‖‖ || | | |儿儿儿._」⊥厶 〔__o____o_≦ト、 . i / ⌒ ⌒ ヽ ) !゙ (・ )` ´( ・) i/ | (_人__) | \ \ `ー' / / ー- 、 . ,ィ(⊆≧リ≦⊇)〃 / rク\ . / | ̄r少}¨ ̄〃 / /′ ヽ 〃 l | l| | l| 〃 / / └ヽ / l |l | |l/″ / ! 厂 \ く, Y ! l」fレト! / | / 1 丿 | | 丿} じ’ / | / | / l | `¨ / レ′ | 真の思考停 (在位 2009年9月16日〜2010年6月8日) 民主朝の初代考停、言行不一致、虚言、脱税、 そして外交において巨大な負の遺産を築いた。
195 名前:片山博文MZ ◆0lBZNi.Q7evd mailto:sage [2012/01/04(水) 15:55:12.76 ] できた。これで帰れるぞぉ、はあ。 codepad.org/3Rwidmma
196 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 15:57:12.60 ] >>195 今度こそエラー無しだな おつかれ
197 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 17:22:52.87 ] >>190 関数の引数ではchar[]を渡せずchar*になることが多い。サイズ不明になる。
198 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 17:41:34.06 ] >>197 話をそらすなよ 関数の引数の話なら別パラメータでsize_tを渡せばいいし
199 名前:141 mailto:sage [2012/01/04(水) 21:02:54.35 ] >>195 感謝です
200 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 21:49:07.46 ] class Object { ObjectManager * pObjMng; // ry }; class ObjectManager { Container<Object *> cpObj; // ry }; こんな感じの相互参照があるんだけど スマポにするならどっちがshared_ptrでどっちがweak_ptrにするのが一般的ですか?
201 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 22:08:30.42 ] 所有権を持たない場合にweak_ptrを使う
202 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 22:15:03.46 ] 集約してるならsp 参照しているならwp ということでしょうか
203 名前:デフォルトの名無しさん mailto:sage [2012/01/04(水) 22:34:57.06 ] 戻り値にするようなモノはsp というか削除する責任者が 居なくなりそうならsp 自分は削除に感知しないと思う オブジェクトはwpだろ
204 名前:デフォルトの名無しさん [2012/01/05(木) 06:45:42.41 ] STLの安全性は保障されていないということでよろしいでしょうか?
205 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 08:46:48.44 ] C系列で保証なんて何も無いよ
206 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 15:36:00.48 ] 中身の短いメンバ関数って、積極的にヘッダでインライン化するべきですか? それとも、大した恩恵は無く、ソース内に入れておくべきですか?
207 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 15:41:12.11 ] >>206 呼び出す回数に凄く依存する。 インライン化されずに時間掛かったとして、全体0.01%だったらしなくても変わらず。 出来上がってから実測。
208 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 15:42:46.14 ] >>206 自分はコンパイラさんにお任せするのでinlineキーワードを使ったことがない。
209 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 15:52:54.35 ] クラス定義内に書いたらinline付いてるのと同じ。 どんなに短くても、ループ内で何回呼び出されようと 自動的にインライン化されることはほとんどないので 自分でインラインにするべきかどうか判断した方がいい。 短ければ関数呼び出しよりもサイズ小さくなる場合もあるし。
210 名前:208 mailto:sage [2012/01/05(木) 15:57:58.20 ] >>209 あれ?そうなの?? 昔最適化で勝手にインラインになるから気にするなって言われたのをずーっと信じてたんだけど。 まー、個人的にはカリカリチューンはきらいだからねぇ。。。 むむむ・・・。
211 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:14:54.06 ] ボトルネックが確定してから変更すれば良い。 それまでは自分の書きやすい方法で。
212 名前:208 mailto:sage [2012/01/05(木) 16:17:14.64 ] おk!
213 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:49:01.18 ] 昔はコンパイル単位をまたがる最適化とか一般的じゃなかったけど GCCは4.5からVCは8から出来たと思う だから今は関数に別名を付けたいときやヘッダで完結させたいときしかinline使わないな
214 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:52:25.27 ] インライン使うと、同じ関数が他所に分断され配置されキャッシュの効果が薄まる。 なるべく使わない方がメモリと速度に良い。
215 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 16:58:37.20 ] AMDがVC++ならO2よりO1使ってキャッシュに詰め込めと言ったり大変な世界だな
216 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:07:24.77 ] プライベートメンバのラッパとか 関数呼び出しよりも軽い処理は積極的に インラインにすればいいんじゃねーの
217 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:12:01.61 ] Javaとc++どっちやろうか迷ってます。 プログラミングは初めてです。 両方やったことある人に聞きます。 最初はどっちから手を出した方がいいですか?
218 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:14:25.52 ] >>217 初見でC++は死ぬと思うがな 割と適当でもなんとかなるJavaにしたら? まぁホント言うならC#(ry
219 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:18:43.63 ] C++はマルチパラダイムかつ値のセマンティクスがある言語だから、初心者がやると(プログラムが)爆死しやすい。 オブジェクト指向一本に絞ってるJavaのが無難。 メモリ上の扱いとか覚える気ならC++。
220 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:20:22.01 ] >>217 マルチPOSTすんなカス
221 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:31:58.83 ] 実用面で、PHP(C++のスクリプト言語化のようなもの) Groovy(JAVAのスクリプト言語化のようなもの) C# をすすめてみた。
222 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:37:58.84 ] Groovyってどんな言語? JavaプログラマのためのGroovy入門(2/7):CodeZine codezine.jp/article/detail/3757?p=2
223 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:42:28.04 ] >>213 ヘッダだけで完結させるならstaticじゃね どちらでも内部結合になるし、 そんな場合は大して長くない処理を書くことが多いからinlineでも 全然問題ないと思うけど
224 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:45:02.44 ] C++からやれよ。AOJとかの結果見ると、Javaがどんだけメモリバカ食いで実行速度遅いか、がく然とするぞ。
225 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:48:40.31 ] >>223 下駄雪駄もstaticで書くのか?w
226 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:49:15.64 ] >>223 下駄雪駄もstaticで書くのか?w
227 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 17:53:10.30 ] >>225 普通の関数の話だった セッターゲッターはstaticの意味が変わってしまうがな てか下駄雪駄の意味がわからずしばらく考えたじゃないか
228 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 18:56:59.60 ] 内部結合のstaticはC++11で廃止されたから使わない
229 名前:206 mailto:sage [2012/01/05(木) 19:03:11.22 ] みなさんどうもです。 セッタやゲッタの中にも数行必要なものもありますし、 そうなるとますますソースとヘッダどちらに書くかの境界線が判断できない上に、 「このセッタはヘッダ」「このセッタはソース」みたいになると、 個人的には読みにくいと感じるため、>>211 さんの言われるように、 ボトルネックだと感じるまではすべてソースに書いておこうと思います。
230 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:34:46.07 ] >>218 べつにC++からでいいだろ。 Java勉強しなくても、C++知ってりゃ書ける。 その逆はない。
231 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:38:36.01 ] オブジェクト指向言語からやるとC++の変なところを学習しにくい C++を便利に使ってしまう
232 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:44:00.84 ] >>214 それはない。インライン展開しまくったとしても、 今時のキャッシュメモリなら1次キャッシュに収まるからな。 それと、96bit画像の描画したときは、インライン展開した方が、 関数外と関数内の式が結合され7割まし早かった。
233 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 20:51:23.46 ] OO勉強したいなら、PythonやSmalltalkから入ったほうがマシだろ。 参考書の大半が引数書き換えを邪気に扱ってるし、 オブジェクトの委譲によって、オブジェクトを組み立て、 オブジェクトの振る舞いを作ることによりプログラムの動作を 決めるというOOの基本を実践してるサンプルが少ない。 SwingでGUIをつくるのにJFrameを継承するとかバカな解説ばっか。
234 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:12:28.04 ] 実はオブジェクト指向ってしっくりこないんです!
235 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:13:37.27 ] そうですか。それはスパゲティですね。
236 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:33:57.78 ] 私はIS部門の人間なんです。SIerの客なんですよ。私に嫌われたらどうなりますか? 皆さん生きていけないですよ!
237 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:38:35.52 ] 優柔不断なのが悪い 他の女とどうなるか解からんが 素直にシャルルを選んどけ
238 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:39:08.77 ] >>236 >私に嫌われたらどうなりますか? おまえの仕事をする奴がいなくなるだけじゃない?
239 名前:デフォルトの名無しさん mailto:sage [2012/01/05(木) 21:42:45.09 ] みながわさんはいまだにオブジェクト指向の話で持ち出されるのか
240 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 02:02:23.80 ] >>223 inline に内部結合にするなんて効果は無いよ。
241 名前:デフォルトの名無しさん [2012/01/06(金) 02:07:20.94 ] すみません、C++初心者です 例えば、Objクラス型のオブジェクトを、引数なしで作成・初期かする場合、 Obj obj; とするだけで、デフォルトコンストラクタがよばれるのでしたっけ? それとも、 Obj obj(); でないといけないのでしょうか。
242 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 02:08:53.29 ] >>241 なんで試さないんだよ ちなみに前者が正解。後者はアウト。
243 名前:241 [2012/01/06(金) 02:12:05.64 ] >>242 すみません。。 どうもありがとうございます。 デフォルトコンストラクタに、適当なpublicメンバ変数aに定数を代入する 操作が入ったHogeクラスを作って、 Hoge obj; のあと、obj.aの内容をみて確かめてみます。
244 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 07:22:00.98 ] >>228 見たけど別に廃止されてなかったが (3.5-3)
245 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 10:15:13.53 ] >>244 deprecatedじゃね
246 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 10:30:20.35 ] C++だと相互参照が網の目状に散らばるのとある程度アクセス制御されたグローバル変数とどっちがいいの?
247 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:02:49.28 ] >ある程度アクセス制御されたグローバル変数 具体例頼む。
248 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:33:20.05 ] class shared { protected: static int n; }; class hoge : public shared {}; class fuga : public shared {}; みたいに丸出しよりましかな程度のものだけど
249 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:36:26.76 ] 関係ないけどこれの方がnをcppで定義しなくていいから楽。 class shared{ protected: static int &n(){ static int value; return value; } };
250 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:37:03.63 ] >C++だと相互参照が網の目状に散らばるのとある程度アクセス制御されたグローバル変数とどっちがいいの? どっちでもいいんじゃない?マルチパラダイムなんだし。
251 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 11:56:25.41 ] >>246 「いい」の基準が不明だな。どっちにも文句を付けられるだろう。
252 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:25:32.88 ] >>248 どっちも無し。 int n; new hoge( &n ); new fuga( &n ); で十分
253 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:41:32.84 ] template<typename T> struct temp_type{ typedef const T &t; }; template<typename T> struct temp_type<T*>{ typedef T *t; }; template<> struct temp_type<int>{ typedef int t; }; template<typename T> void hoge(typename temp_type<T>::t v){} int a = 1; int *b = &a; struct HOGE{} h = {}; //C2783 hoge(a); hoge(b); hoge(h); テンプレートで指定された型に応じて 値を渡すか、const参照を渡すかを決めたいのですが 「テンプレート 引数を 'T' に対して減少できませんでした」 となります。 関数hogeでは引数を書き換える予定はないです。 テンプレートでない関数の場合は 例えばconst int &やint *const &など渡さないと思うし 参照を関数内でデリファレンスするのも無駄だと思うので アドレスとおなじサイズの整数やポインタを渡す場合は 値渡し選択したいのですが、どのように書いたらいいですか?
254 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:47:54.36 ] hoge<int>( 10 ); // おそらくOK
255 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 13:51:12.06 ] >>253 template<typename T> void hoge(const T &v); template<typename T> void hoge(const T *v); template<typename T> void hoge(int v); これでは何故ダメなのか?
256 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:25:35.67 ] ideone.com/sKJtY
257 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:29:15.48 ] 複数のクラスが互いに参照しあって連携してるケースは難しいね メディエーターパターンを使ってシステムの連絡路を一本化するのがいいと言われてやってみたけど メディエーターのインターフェースが凄まじく大きくなってしまった
258 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:30:20.02 ] それはどういう意味があるコードなの? オーバーロードとは何が違うの?
259 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:31:41.96 ] >>254 型を書けばいけました。でも呼び出し側の書き方は変えたくないです。 >>255 hogeの処理は共通なので定義は1つにしたいです。 hogeのような関数がたくさんあって、呼び出しも多いので 関数を型の個数分書いたり、呼び出し部分の記述量を増やすことなく 実現するにはどのようにしたらよいですか? 条件後出しですいません。
260 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:38:49.00 ] template<typename T> void hoge(const T &v); template<typename T> void hoge(const T *v); 処理の内容が同じならこの2つでいいよ。 後者は、前者を呼び出すだけでいい。 速度はコンパイラが勝手に最適化するから気にすんな。 うんな事より、プログラムを1つ完成させることに力を入れろ。 どうしても気になるなら最適化後のアセンブリコード見て確認してみ。
261 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 14:41:42.27 ] >>257 Mediatorを分割すりゃよかったんじゃね。 別に1つの依頼者クラスが1種類の調停者にだけ 依頼せにゃならんわけでもないだろう。 そもそも何をしてるのか知らんから Mediatorが適した課題かどうか怪しいが
262 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:41:49.47 ] @ bool Load() { return false; } A void Load() { new throw Exception() } 関数のエラーをboolかthrowどっちで検知すればいいのだろうか
263 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:44:12.88 ] 1
264 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:48:23.09 ] 正解: optional
265 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:55:09.37 ] >>241 C++11からは、一様な初期化構文を使って、デフォルトコンストラクタ呼び出しを明示できるよ ttp://d.hatena.ne.jp/faith_and_brave/20111221/1324394299 X x; // ok X x(); // error X x{}; // ok (C++11)
266 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:57:37.01 ] X x {} って気色悪いな
267 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 20:58:50.74 ] C#ではよくある事。
268 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:17:49.32 ] class IHoge { public: virtual ~IHoge(void) { } virtual void Method(void) = 0; }; class HogeBase : public IHoge { public: void Method(void) { } }; class HogeEx : public HogeBase { }; こうやっていちいち分けるのが流行ってるのはなんで? どうせポリモーフィックなクラスはほぼ全てがHogeBaseを継承するんだし class HogeBase { public: virtual ~HogeBase(void) { } virtual void Method(void) { } }; class HogeEx : public HogeBase { }; でいいじゃないですか?
269 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:30:19.69 ] >>268 IHogeって事はCOMか?COMは実体を持てないからな。 それは別として、最上位に完全抽象化クラスを置いとくのは、 HogeBaseの全てをオーバーライドするクラスを作ったとき、 HogeBaseの実装がデッドウエイト(容量食うだけのゴミ)になるから。
270 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:32:37.36 ] >>262 Function( source.Load() ); // Loadはsourceから読み出した情報を返す こういうコードを書こうとしたとき、どっちを取るべきが正しいか考えろ。
271 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:39:14.50 ] >>269 なるほど
272 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:48:34.28 ] >>262 Loadが失敗する状況がふつうにありえそうなら1。 (プログラムの実行自体が怪しくなるような)ハードやOSの異常による状況でしか失敗しないようなら2。
273 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 21:51:30.44 ] bool Load(...) { // ファイルフォーマットエラーなど return false; // ハードウェアエラーなど throw unko(); // 成功 return true; } これで決まりや
274 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 22:01:26.36 ] 東京にある6つのキー局の内、製作から財務まで一貫して朝鮮人が行ってるテレビ局が1つ 中国共産党から毎年大量の反日工作費が流れているテレビ局が2つ もろに北朝鮮と繋がっているテレビ局が1つ 年寄はまだまだテレビという外国人に騙され続ける
275 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 22:03:02.69 ] 例外とはまさしく例外であり必ずキャッチされなければプログラムを終了するしかないものに対して使うのがいいだろう。 一方、返却値は返却値。失敗してもいかなるリソースの破壊、開放忘れも発生しない場合に使える。
276 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 22:05:46.18 ] 事前に書いたフローチャートに書いてないことは例外
277 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 22:07:59.24 ] 例外ってフローチャートに書いてないの?
278 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 22:13:05.48 ] 普通は書かない 書いてあるならどんなエラーでも想定の範囲内だから例外ではなく返り値などで判断
279 名前:デフォルトの名無しさん mailto:sage [2012/01/06(金) 23:42:39.91 ] 二重キャストって意味あるんだね はまって痛い目見たよ こんなん template<class T> struct Base { Base(){ unko = reinterpret_cast<__int64>(this); } void OK(){ T *t = static_cast<T *>(reinterpret_cast<Base<T> *>(unko); } void NG(){ T *t = reinterpret_cast<T *>(unko); } __int64 unko; }; struct Derived : Base<Derived> {}; int main() { Derived d; }
280 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 00:19:45.06 ] void NG(){ T *t = reinterpret_cast<Base<T> *>(unko); } これだけで十分そうだが? reinterpret_castで直接reinterpret_cast<T*>してんのが引っかかっただけじゃないの? void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、 オフセットが違うから位置がずれて異常が起きる。
281 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 00:54:17.62 ] >>280 >void*的なものに突っ込んだ時は、突っ込む前の型と全く同じ型じゃないと、 >オフセットが違うから位置がずれて異常が起きる。 ありがとう、目から鱗だわ ポインタ値とアドレス値は同じものだと思ってたけど違うのか
282 名前:デフォルトの名無しさん mailto:sage [2012/01/07(土) 01:39:13.10 ] >>245 廃止ってのはexportみたいなのを言うんだ