1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part61 pc11.2ch.net/test/read.cgi/tech/1205059063/
477 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:50:37 ] 俺は入門書とD&Eで2冊だった。あとはweb。
478 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:51:15 ] webって手もあるね。
479 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:51:55 ] 学校の図書館に散々リクエストしまくっている俺がいる。 卒業したらリクエスト出しづらくなるから、早く0xが出てくれないと困る。
480 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:54:06 ] 0xが2009年末くらいに出たとして、そこからそれに対応したコンパイラや 書籍が揃うまで、どのくらいかかるんだろうね。
481 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:55:03 ] webも含めて、他人のソースを見るのは結構効果的だと思う。 オープンソース系や、STLとかboostとか。
482 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 18:55:57 ] コンパイラの方はすぐだろ 書籍はそれから半年遅れてドバッと出てくるか まあC++でほとんどのプログラミングテクニックは 出尽くしているから文法本しか買わないと思う
483 名前:デフォルトの名無しさん [2008/06/29(日) 20:16:51 ] 知り合いの達人プログラマーに 何から始めたらいい?って聞いたら C++とロキやれって言われたけど ロキってなに?
484 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 20:18:27 ] Lokiは今更だなぁ。boostで良いと思うよ。
485 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:19:50 ] コンストラクタやデストラクタにinline指定をして、メリットって けっこうあるもん?
486 名前:デフォルトの名無しさん [2008/06/29(日) 21:23:55 ] >>485 inline は使いまくるほど最適化がかかりやすくなる
487 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:26:53 ] >>485 プロファイルしてみれ
488 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:35:44 ] するってぇと、もはやコンストラクタは一般に explicit inline 指定はデフォ?
489 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:37:19 ] 場合による。吐き出すコードのサイズと相談だ。
490 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:37:52 ] force inlineして結果変った場合だけつけろよ デバッグするとき泣くぞ?
491 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:49:44 ] >>485 最適化がかかりやすくなるかもしれんが、実装をヘッダに晒すようだとデメリットも大きい。 inline で向上する効率を確かめて、さらにそれが必要だといえる時だけ使うのがいい。
492 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:55:14 ] L2キャッシュに収まりきらないコード量をinline指定によって 吐くようになった場合はかえって性能が低下する事がある 実際に走らせてみるかプロファイル取ってみるかだな
493 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 21:56:36 ] アクセッサ程度のメンバ関数なら、無条件でinlineでおk?
494 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:11:51 ] おk
495 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:19:36 ] 逆にヘッダに実装書きつつ、inlineにしたくない場合って void hoge::hage(){...} ってクラス定義の後に分けて書けば良いんだっけ? ※コンパイラオプションはそのままで
496 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:23:45 ] >>493 491と同じではないかと思うけど。 C++ coding standardに載っている時期尚早な最適化(だったかな)じゃないかと思う。
497 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:24:26 ] ヘッダに非inline関数の実装を書いたら、そのヘッダを取り込んだ 翻訳単位それぞれに関数の定義ができて、重複エラーになるんでは?
498 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:30:16 ] >>497 普通なるね。
499 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:33:20 ] >>497 ならない。 inline 関数の定義が、リンクされるすべてのコンパイル単位間で矛盾して無い限りは問題ない。
500 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:33:33 ] 重複した同じ定義を一つにする方法って無いんだったっけ? テンプレートクラスとかの型毎のインスタンスはリンク後は一つになるよね?
501 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:34:08 ] >>499 非inline関数でっせ?
502 名前:499 mailto:sage [2008/06/29(日) 22:34:30 ] あれ?非inlineか。ごめん。
503 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:41:40 ] クラスの中に static int a[] = {} かけないんだっけ?
504 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:50:36 ] >>503 無理 static const int のみ初期化OK
505 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:52:14 ] もっというと整数型がOKってことみたいだね。long や shortも 初期化おk
506 名前:497 mailto:sage [2008/06/29(日) 22:57:12 ] よく考えたら、 メンバ関数ならOKで非メンバ関数だとNGじゃないかな。
507 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 22:59:55 ] >>506 どっちでも同じ。ただしメンバ関数をクラス定義内で定義した時は自動的に inline 扱いになる。
508 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:35:16 ] >>506 俺が497だwなりすますな
509 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:52:16 ] 最近のC++の流行では getter/setterはどうやって書くの?
510 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:55:30 ] マクロを使って読みにくく且つ簡潔に書きます
511 名前:デフォルトの名無しさん mailto:sage [2008/06/29(日) 23:55:57 ] 今までの話の流れからすると、実装はソースファイルに書くのが 基本みたいな話だね。ただ、inline指定してみて効果が顕著だったら inlineにするみたいな。 しかし、ほとんどの参考書では、GetやSetはクラスの型定義内に inlineとして実装されてるよね。あれが誤解の元なんだろうか。
512 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:00:23 ] 誰か>>500 教えて〜
513 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:02:22 ] リンカがよきにはからってくれるんじゃないの? それか明示的にインスタンス化しておくとか
514 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:06:04 ] inlineはコンパイラによってはデフォルトで無視されるし あまり気にしなくていいんじゃないの? CPUがリターンキャッシュ持ってれば
515 名前:デフォルトの名無しさん [2008/06/30(月) 00:17:18 ] >>492 P6のばやいL1じゃね?
516 名前:デフォルトの名無しさん [2008/06/30(月) 00:26:54 ] >>514 無視するコンパイラにも、なるべく広範囲のソースを見せたほうがいい 処理系には何がしたいのかを伝えよ、禿の格言にもあるぞ
517 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:27:04 ] なんか初歩的な質問かもしれませんが、変数名やクラス名ってどう名づけてます? 変数や関数、インスタンスは小文字から始まり、 クラス名は大文字からはじめるのが一般的なんでしょうか また、分かりやすい名前をつけると、クラス名とそのインスタンス名がかぶってしまうんですが、 何か分け方はありませんか
518 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:31:40 ] クラス名・変数名に迷ったら書き込むスレ。Part12 pc11.2ch.net/test/read.cgi/tech/1206118762/ ここで聞いてみるとか
519 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:36:48 ] >>517 クラス名の最初にcを付けてる
520 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:41:40 ] >>517 先生方のルールを参考にしてはどうかな www.boost.org/doc/libs/1_35_0/boost/multi_array.hpp
521 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:53:51 ] 一応>>520 のを書いておくと クラス名 :小文字+アンダーバーの組み合わせ(例:multi_array) ネームスペース名 :クラス名同様 ローカル変数名 :クラス名同様のルールで短めに メンバ変数名 :クラス名のルールに加えて最後にアンダーバー 短くなくても良い(例:allocated_elements_) 関数名 :クラス名同様 テンプレート型引数名:パスカルケース(例:NDims) マクロ名 :大文字+アンダーバーの組み合わせ (BOOST_STATIC_CONSTANT)
522 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 00:54:58 ] typedef enumはどうすれあいいの?
523 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:03:51 ] typedefはクラス名同様 enumはメンバ変数名と同じ ただ、boostの中で完全に統一されてるわけでもないみたい
524 名前:デフォルトの名無しさん [2008/06/30(月) 01:04:28 ] >>517 unko_t unko;
525 名前:デフォルトの名無しさん [2008/06/30(月) 01:16:04 ] Cの勉強をしているのですが、VCでスタティックライブラリを作ってみたりしました。 その後、似たものでシェアードライブラリ(.so)なるものがあるのを知ったのですが、 VCで作成することはできますか? 検索してもgccばかりが見つかってしまって。 ライブラリのファイルがないとexeの実行ができないようですが、dllと何が違うのか分かりません。
526 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:20:46 ] >>525 dll と同じようなものです UNIX系では shared object Windows系では dynamic link library
527 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 01:41:04 ] >>517 >438で出てたGoogleのルールのまとめ: ●ファイル名 ぜんぶ小文字で、単語は_か-で区切る。foo-bar.cc ●クラス名 各語の先頭を大文字にする。 FooBar ●名前空間名 ぜんぶ小文字。区切りについては明記してないけど、_? foo_bar ●変数名 ぜんぶ小文字で、単語は_で区切る。 foo_bar ●メンバ変数名 ぜんぶ小文字で、単語は_で区切り、最後は_にする。foo_bar_ ●関数名 クラス名と同じ。アクセサだけは変数名と同じ。 ●定数 先頭にkを付けて、単語区切りは大文字。 kFooBar ●マクロ名 マクロなんて使うな。 アクセサと定数が妙だなあ。
528 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:07:19 ] 定数の接頭語のkって何の意味?
529 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:13:43 ] konstant。なぜかこれだけドイツ語。
530 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:13:47 ] koteiのk
531 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 02:16:10 ] >>518-521 ,527 細かくありがとうございます いろいろな方法があるんですね 検討して、しっくりくる方法を選びたいと思います
532 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 03:23:02 ] constant でプレフィクス c だと、コーディング規約にも関わらず class と混同しそうだな マクロ禁止なら全部大文字でもよさそうだが・・・
533 名前:デフォルトの名無しさん [2008/06/30(月) 03:40:28 ] メンバはm_というつまらん駄洒落をまだやってる俺はどーせM$かぶれだい
534 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 07:48:41 ] >>533 boostにもあったりするよw www.boost.org/doc/libs/1_35_0/boost/regex/v4/regex_format.hpp > const traits& m_traits; > const Results& m_results; > OutputIterator m_out; > ...
535 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:36:05 ] 標準的な識別子のプレフィックス一覧みたいなのなーい? てか、どこの会社でもまちまちなんだろうけど。
536 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 12:41:49 ] プレフィックス一覧って? 命名ルールなら上で出てるgoogleかboostので十分だと思うけど。
537 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:27:37 ] なんか、なんちゃら記法みたいなのなかったっけ? ポインタはpを付けるとか。C言語の時代か?
538 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:49:34 ] ジャンガリアン
539 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 15:50:56 ] ハンガリアン記法 ja.wikipedia.org/wiki/%E3%83%8F%E3%83%B3%E3%82%AC%E3%83%AA%E3%82%A2%E3%83%B3%E8%A8%98%E6%B3%95 ただし、ポインタにpを付けたりするのは システムハンガリアンと呼ばれる間違ったハンガリアン記法。 本当のハンガリアン記法は アプリケーションハンガリアンと呼ばれてる。
540 名前:デフォルトの名無しさん [2008/06/30(月) 19:08:04 ] 禿リアン
541 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:30:34 ] >>539 おお、それそれ。なんか批判が多いみたいだね。保守が大変とか。 けっきょくプレフィックスなんてないほうがいいのかね……
542 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 19:44:44 ] プレフィクスの使い方を間違わなければ有用らしいよ 間違ったコードは間違って見えるようにする - The Joel on Software Translation Project local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
543 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 20:29:03 ] つまりアプリケーションハンガリアンてのは、識別子の補助的な意味を表す プレフィックスを付けるって感じ? システムハンガリアンはデータ型を表すプレフィックスを付けてるのかな?
544 名前:506 mailto:sage [2008/06/30(月) 21:13:12 ] >>508 ごめん。眠かったから間違えた。 by498
545 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:01:10 ] void hoge(const std::vector<foo>& foos); という宣言をヘッダ(hoge.h)に書いたとき,fooを宣言している ヘッダもhoge.hでインクルードしないといけないでしょうか? それともhoge.hでは class foo; と書くだけでおkでしょうか?
546 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:50:55 ] データを線形リストでアクセス可能かつキューのように 扱えるデータ構造ってありませんかね? data[3].hogeみたいにアクセスもしたいし dequeue(data)みたにもアクセスしたい
547 名前:デフォルトの名無しさん mailto:sage [2008/06/30(月) 23:58:57 ] >>546 std::dequeが火を噴くときが来たな
548 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 01:19:19 ] なんという出番w
549 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 08:09:47 ] >>545 標準ライブラリのテンプレート引数は基本的に完全型じゃないとダメ。 つまり class foo; だけじゃダメ。
550 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 10:33:31 ] forkについて 1プロセスで三回printfを実行して別プロセスを作成 そこからまた三回printfを実行して別プロセス 10プロセス実行完了したら最初のプロセスから終了していく そんな課題なのだけどforkが理解できなくて困っている… 申し訳ないですがバカな俺でも理解できるように解説してくださらんでしょうか?
551 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 10:59:33 ] >>550 まずスレ違い。OSの話で言語と関係無い。 で、もうちょっと端的に質問しないと、ググって出るような解説をするしかないよ。
552 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 11:05:57 ] >>550 fork → UNIX/Linux系のシステムコールで環境依存 printf → C言語 【初心者歓迎】C/C++室 Ver.55【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1213466622/l50 >そんな課題 C/C++の宿題を片付けます 111代目 pc11.2ch.net/test/read.cgi/tech/1214563642/l50 >解説して www.google.com/search?q=fork
553 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:25:56 ] 質問です。 newでメモリを動的確保する場合失敗するとNULLが返るのですが、 これを意図的に失敗させたい場合どのような手段があるでしょうか? どういう場合にnewが確実に失敗するのかがよくわかりません。 よろしくお願いします。
554 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:33:52 ] >newでメモリを動的確保する場合失敗するとNULLが返るのですが 返らないよ. newが失敗したらbad_allocって例外が投げられる ためしに以下の失敗するコードを実行してみるといいよ char *a = new char[0x7FFFFFFF]; if (a == NULL) printf("%s", "メモリ失敗"); // 標準準拠のコンパイラではこのコードは絶対に実行されない
555 名前:デフォルトの名無しさん [2008/07/01(火) 13:11:01 ] >>554 先生、失敗しないんですけど
556 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 13:24:11 ] ワロタ
557 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 14:00:19 ] struct test_type{ char mem[0x7FFFFFFF]; }; test_type *a = new test_type[0x7FFFFFFF]; if(a == NULL) printf("%s", "print format");
558 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 14:28:44 ] >>555 for (;;) で囲め。
559 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 15:19:53 ] コンパイラのバージョンを聞いたほうがいい 古いやつとか組み込み用は標準と違う動作をするだろ
560 名前:553 mailto:sage [2008/07/01(火) 16:19:49 ] ご回答ありがとうございます。 コンパイラはVC++2005付属のMSコンパイラVer 8.00.50727.42です。 >>554 のサンプルコードを試しましたが、確かにNULLでなく例外を投げていますた。 コンパイラが古いとNULLを返す仕様になっているのでしょうか?
561 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 16:27:37 ] 10年くらい前なら NULL を返したかもしれない 今はみんな bad_alloc を投げる
562 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:37:37 ] msdn.microsoft.com/ja-jp/library/kftdy56f (VS.80).aspx >In Visual C++ 2005, the C Runtime Library's new function will also >throw a std::bad_alloc exception if the memory allocation fails. >If you still want the non-throwing version of new for the C Runtime Library, >link your program with nothrownew.obj. However, when you link with nothrownew.obj, >new in the Standard C++ Library will no longer function.
563 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:54:03 ] 失敗時に NULLがほしいときは new (std::nothrow) じゃなかったっけ。
564 名前:デフォルトの名無しさん [2008/07/01(火) 19:52:48 ] >>557 数学的に破綻してるコード嫌い
565 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 19:57:04 ] 今、MSもVC++ Express Editionなる、無料コンパイラ配布してんだし、 最新の2008を使うべきでは。商用コンパイラ必要になるほどの 大プロジェクトじゃないならね。
566 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:00:24 ] >>564 数学的に破綻って?
567 名前:デフォルトの名無しさん [2008/07/01(火) 20:18:41 ] >>566 失敗しない環境がありうるだろ 7で始まるのがプゲラとか言う問題ではない
568 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:43:06 ] 大抵の環境で失敗するだろうから細かいことはいいんだお!
569 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:44:11 ] size_tの最大値じゃん。
570 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:56:07 ] >565 Express Edition は無料でいいんだが、MFCが使えん。 お偉いさんは、見た目が一番なんだよ。
571 名前:デフォルトの名無しさん [2008/07/01(火) 21:53:20 ] >>570 見た目を気にするなら、なおさらMFCはダメだろ
572 名前:デフォルトの名無しさん [2008/07/01(火) 22:11:16 ] >>569 何が?
573 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:35:10 ] size_tは符号無し整数だよ。サイズは処理系定義だけど。 それはともかく、普通に2Gも確保出来るってのが・・・w >>565 2008はWin2Kに入らなかったりしてなw 2Kをバカにすん(ry >>570 WTL+ATL使おうぜ
574 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:01:19 ] >>573 メモリ確保操作は、物理メモリのサイズが足りなくても アドレスだけ確保して返して成功してしまう場合がある。 実際に手元の2GBしかメモリ積んでないマシンで2.5GB確保してもなんなく成功する。 これは、デマンドページングといって、物理メモリの確保が 実際にメモリを踏んだ段階で初めて起こるような仕組みが存在するため。 C++のnewの場合は、コンストラクタでメモリを踏んでしまう場合があるから この仕組みがあったからといって実際に得はしないような気はするけどな。
575 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:04:33 ] UNIX系はそうなんだっけか まあVCには全く関係がないな 連続した大領域確保しようとするとよく失敗するし
576 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:11:04 ] >>574 デマンドページングが動いている状態で、実際には確保されていない(&できない)アドレスにアクセスしたらどうなるの?
577 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:12:46 ] >>574 単にスワップメモリで足りただけじゃね?