1 名前:デフォルトの名無しさん [2007/07/26(木) 00:33:07 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 テンプレその他 >>2-15 付近参照 前スレ class C++相談室lt;part56gt; pc11.2ch.net/test/read.cgi/tech/1170343752/l50
587 名前:register mailto:sage [2007/09/12(水) 23:56:06 ] おいらのこともたまには思い出してくれないか?
588 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 00:25:43 ] >>587 そう言えばconstも、今はプログラマ側の変更不可、副作用不可という側面が際立って紹介されてるけど K&R読むとキャッシュへの最適化を促すregisterの様に、殆ど読み込みしかしないメモリに配置されて速度的に有利になる様な 最適化を、コンパイラへ促す効果があると記述されてたね。今のハードウェアの観点から考察すするとどうかは知らないけど。
589 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 16:50:41 ] 初期化された const T[] がROM化可能な領域に配置されるのは 昔のコンパイラには良くある振舞い。まぁ今でも似たようなものか。 プロセス間で場合共有可能なページという感じで。
590 名前:,588 mailto:sage [2007/09/13(木) 21:06:23 ] なんか趣旨が伝わりにくい文章ですが、要するにregisterもconstもに多様な位置づけだよね、ってことです。
591 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:26:55 ] >>590 いいえ。
592 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:33:35 ] それはトムです。
593 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:43:15 ] tomcat
594 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 00:01:10 ] わろた
595 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 00:03:35 ] べ、別にわろてなんかいません!勘違いしないでください!
596 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 11:29:42 ] トムも仏も無い
597 名前:デフォルトの名無しさん [2007/09/15(土) 19:56:06 ] ところで作りかけのソースあっぷしたら虐めてくれますか?
598 名前:デフォルトの名無しさん [2007/09/15(土) 21:39:52 ] うん
599 名前:デフォルトの名無しさん [2007/09/17(月) 03:19:16 ] あるテキストファイルを行の順番を逆にして出力したいんだけど、 スマートなやり方が思いつきません。 今は vector<string> str; テキストファイルから1行読み込み str.push_back(読み込んだ文字列); for(int i=str.size()-1;i>=0;i--) cout << str[i] <<endl; こうしてるんだけど、これだとファイルが数百MByte以上になったときにバッファを大量に食うので避けたい。 打開策として、インプットファイルを終端からReadするって手があるのですが、 これ以外でいい方法はありませんか?
600 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 03:29:23 ] ファイルを分割して読み込む
601 名前:599 [2007/09/17(月) 03:41:50 ] >>600 あーなるほど! それも一つの手ですね!
602 名前:599 [2007/09/17(月) 04:01:35 ] >>600 お礼を言い忘れました。 どうもありがとうございました。
603 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 05:15:30 ] あとはまぁ、行頭位置のインデックスを作るとか。 元ファイルを調べて、「改行の次の位置」をvector<ifstream::pos_type>型のコンテナにでも詰め込めば、 あとは好きな行を取り出せる。 同じテキストファイルを、毎度毎度ひっくり返して表示する仕様の場合、 そのインデックスを、a.txtに対してa.indexとか名前付けて保存しておけば、2度目以降は速いよね。
604 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 07:14:59 ] 数百MB単位のファイル読むときはちゃんとmemory mapped file使おうぜ。 このスレの範疇からは外れるが。
605 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 08:23:03 ] >>604 でもさ、>>599 の場合だと、 結局は、一度は最初から最後まで全部読み込まないといけないことには変わりないし、 先頭から読んでいくのと違いあるのかな。 普通のモダンなOSはディスクアクセスから予測した先読みのキャッシュぐらいあるだろうし
606 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 09:16:07 ] つ[tail -r]
607 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 12:10:29 ] $ tail -r tail: オプションが違います -- r 詳しくは `tail --help' を実行して下さい.
608 名前:デフォルトの名無しさん [2007/09/17(月) 13:31:44 ] つか、テキストファイルを逆順に表示する必要があるのか?
609 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 13:34:05 ] 実用的な場面はあまりないかもしれないけど、言語の勉強のための課題としては 手ごろな内容なんじゃないかな。
610 名前:デフォルトの名無しさん [2007/09/17(月) 13:35:00 ] tail -f /var/log/messages でいいでね?
611 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 14:05:18 ] 馬鹿はすっこんでろ
612 名前:デフォルトの名無しさん [2007/09/17(月) 14:18:17 ] 言語の勉強ならなぜにstd::vectorを使う?
613 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 14:26:42 ] C++の勉強ならSTLが適当だろう。C++スレだし
614 名前:デフォルトの名無しさん [2007/09/17(月) 14:32:09 ] 勉強が目的なんでしょ?
615 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 14:35:55 ] 「言語文法の勉強」って限定してないなら標準ライブラリの使用法も範疇だろ
616 名前:デフォルトの名無しさん [2007/09/17(月) 15:17:22 ] c++の質問じゃないかもしれないけど 0x00000F00 こってどういう意味なんでしょうか? 16進法かなと思うんですが
617 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:27:26 ] 明らかにC++じゃないしプログラムの質問でもないぞ 0x00000F00は10進数の3840だ。
618 名前:デフォルトの名無しさん mailto:age [2007/09/17(月) 15:29:33 ] .
619 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:31:05 ] >>616 数値のリテラルを16進数で書きたいときの書き方。 その数値自体の意味までは判らんよ。
620 名前:デフォルトの名無しさん [2007/09/17(月) 15:37:41 ] 3840ってことはF00ってことでおk?
621 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:39:47 ] >>620 何がOKかさっぱりわからん。3840(10)=F00(16)ってだけだ。 わからんならWindows標準の電卓でも使ってくれ。
622 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:44:17 ] >>617 一応C++の質問になるなじゃない? CやC++など一部の言語では16進数を表記する文法として0x〜を採用しているだけで、 一般的に16進数を0x〜と表記するという規則はないでしょ。
623 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:50:12 ] いやー、どこの言語でも0xか\xのプリフィックスが付いたら 16進数だと思うけど。
624 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:56:26 ] "0x"が仮にC++特有だとしてもそれ以降はただの16進数だしな
625 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:58:36 ] 数字の混ざったトークンにa - fが入ってたら接頭子がなんであれ16進と解釈できるだろ。
626 名前:599 mailto:sage [2007/09/17(月) 16:00:52 ] >>603-615 どうも、ありがとうございました。 勉強になります。 学校の課題とかではないです(私はもう学生ではないので…) 株と為替の時系列データを処理するプログラムを書いているのですが、 データの入手先によって、系列の時間が上り順のものと下り順のものの2種類あるので、 一方を並べ替えることで1つの書式にそろえようとしたわけです。
627 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:04:36 ] >>625 17進数〜36進数という可能性も。
628 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:13:47 ] 1バイト文字コードなら256進数までありうる
629 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:52:10 ] >>616 死ね
630 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:57:01 ] そこは気を利かせて 0xDEAD とか書かないと
631 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 17:01:14 ] >>630 0xDEAD=57005 実はお前さんの書き込み時間は、57分00.5秒だったのでは…
632 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 17:29:46 ] 0xDEADBEEF
633 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 19:23:11 ] 0xBADCAFFE
634 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 19:51:52 ] 0xBACA
635 名前:デフォルトの名無しさん mailto:C++でOOPらしいコードを書くにはどうすればいいだろうか [2007/09/18(火) 19:54:44 ] 0xCPLASPLASDEOOPRASIIKODEWOKAKUNIHADOUSUREBAIIDAROUKA
636 名前:デフォルトの名無しさん [2007/09/18(火) 20:19:58 ] どうせなら CPLUSPLUS ってかけよ
637 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 20:21:27 ] >>635 C++はマルチパラダイム言語だ。そんな意味のない目標は捨てて身軽になろう。 OOPなんて所詮たくさんある道具の内の一つに過ぎない。
638 名前:デフォルトの名無しさん [2007/09/18(火) 20:25:01 ] >>636 気づかなかったわ >>637 okそうするよ
639 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 22:36:41 ] そういやどっかのサイトにあったけど、「OOPは呼び出し元を再利用するための手法の一つ」 というのはかなり納得した。特にC++のはそうだよな。
640 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 22:40:04 ] 定義なんぞどうでもいい
641 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 22:43:20 ] 定義?定義じゃネーヨ 概念だろ
642 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:03:17 ] テンプレート関数にテンプレートクラスを渡したいのですが、可能でしょうか 具体的には std::list<int> a; std::list<double> b; func( a ); func( b ); のようにしたいです
643 名前:642 mailto:sage [2007/09/19(水) 00:12:49 ] 自己解決しました
644 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:17:08 ] template <typename T> void func(std::list<T> x) { }; こんな感じ?
645 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:17:59 ] そんなちょっと考えたら解決するようなことをいちいち・・・
646 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:30:38 ] 馬鹿だからなんだぜ?
647 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 12:05:47 ] KODE
648 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 12:15:12 ] 氷結しよっ!
649 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 12:43:44 ] >>639 それはOOPっていうか、古くは各種アプリのプラグイン(DLL)に始まる インタフェイス抽象とかコンポーネント化とかの特徴のような気が・・・
650 名前:デフォルトの名無しさん [2007/09/19(水) 20:34:13 ] >>649 それは呼び出される側の再利用でなくて?
651 名前:デフォルトの名無しさん [2007/09/19(水) 21:28:47 ] 今ポインタの宿題をしていて 数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?
652 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:48:45 ] その質問を訊く身にもなってください。 今流行りのアスペルガーですか?
653 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:48:59 ] 意味がわからんし、C言語スレへ池
654 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:49:31 ] 俺に免じて許してやってくれ。彼は5歳なんだ。
655 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:54:15 ] 俺アスペルガーだけどこんな奴と一緒にしないで欲しい
656 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 05:03:48 ] 「数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?」 とはどういういみですか?
657 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 05:09:02 ] 数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか? What abhorring is of of display of the value before it executes it by the guy of exchanging numerical values it? 憎悪が交換数値の奴でそれを実行する前の価値の表示のものであること、それ? (゚Д゚)?
658 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 06:20:59 ] >>651 お前があほという意味じゃ
659 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 07:09:57 ] ある仮想関数が、メンバ変数を書き換えないと想定されている場合、constを付けた方がいいんでしょうか? 例えばこんな感じ↓ class A { public: virtual int GetX() const = 0; }; class B : public A { public: virtual int GetX() const { return x_; } private: int x_; }; const A*型を使う場面があるのかが気になります。
660 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 07:20:55 ] >>659 そうですね。
661 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 07:31:21 ] >>659 つけられるconstは全てつけるべき。 非constである必要ができたら、非const版を追加するかconstを外すか熟考すべし。
662 名前:659 mailto:sage [2007/09/20(木) 07:36:33 ] ありがとうございます。
663 名前:kkptcnZciZ mailto:ekeskb@bokqzg.com [2007/09/20(木) 12:34:39 ] KOMUgI <a href="vunuddokfscm.com/">vunuddokfscm</a>, [url=pliwysnvpdex.com/]pliwysnvpdex[/url], [link=uquzjkpzhomt.com/]uquzjkpzhomt[/link], hukythasnspn.com/
664 名前:マターリ ◆AbENcvTP5o mailto:sage [2007/09/20(木) 14:27:35 ] いきなりですみませんがこのスレに協力してくれる人を探しています。 ttp://sports2.2ch.net/test/read.cgi/entrance2/1190215633/l50
665 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 14:57:12 ] >>664 マルチすんな。
666 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 15:16:10 ] >>650 ん? プラグインやインタフェイス抽象は主として呼び出す側の再利用に繋がると思うけど。 呼び出される方の利用の仕方がまちまちだと、 呼び出す側はいちいちそれに合わせなくてはならないわけだけど、 インタフェイスや呼び出し規約(API)という形に抽象化し共通化しておくことによって、 呼び出し側を変更せずに機能を追加してゆくことができる。 もちろん呼び出される側を再利用する仕組みでもあるんだけど、 呼び出される側の再利用だけのためであれば単にAPI公開で十分なわけで。
667 名前:デフォルトの名無しさん [2007/09/20(木) 16:37:16 ] template<class T> class A { public: void (A<T>::*func)(); }; template<class T> class B { public: static void (B<T>::*func)(); }; template<class T> void (B<T>::*B<T>::func)() = NULL; template<class T, class U> class C { public: void (U::*func)(); }; template<class T, class U> class D { public: static void (U::*func)(); }; template<class T, class U> void (D<T, U>::*U::func)() = NULL; クラスDのようにしたいんですけど、どなたかわかる方いませんか? Visual Studio2005 SP1
668 名前:デフォルトの名無しさん [2007/09/20(木) 16:38:31 ] ちなみにクラスD以外はビルドOKです
669 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 16:49:48 ] template<class T, class U> class D { public: static void (U::*func)(); }; template<class T, class U> void (U::*D<T, U>::func)() = NULL; こうだろ?
670 名前:デフォルトの名無しさん [2007/09/20(木) 17:19:20 ] うぉ、ビルドとおった〜 ありがとう!! 昨日からずっと考えてたよ。
671 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 18:48:48 ] 横からごめん template<class T, class U> void (U::*D<T, U>::func)() = NULL; ってどういう意味?
672 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 19:04:46 ] >>671 単なる、staticなメンバー変数funcの定義だよ。 NULLで初期化してるだけ。
673 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 19:05:53 ] void (U::*)() 型のstaticメンバ変数 D<T, U>::func を定義して NULL で初期化している
674 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:44:48 ] 最近某入力デバイス共有ソフトのソースと某モデリングソフトのプラグインサンプルのソースと 見る機会があったんだけど そのどっちも、どう考えても継承ツリーの最底辺、絶対継承されっこないし実際されてない javaだったらfinalがついてもおかしくないクラスのメンバで 継承元の仮想関数をオーバーライドしている関数にvirtualがついてた 薄々感じてはいたんだけどどんな状況でもオーバーライドした関数にはその目印にvirtualをつけるっていう 暗黙のコーディングルール(というかおまじない?)のようなのが流行してるのかな? それともvirtual修飾子の意味をほとんどの人が誤解している?
675 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:51:49 ] かなり昔から流行ってるよね。
676 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:56:41 ] C#のvirtual, overrideキーワードを見るよろし
677 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 20:58:33 ] >>676 C# なんか存在しない頃から流行ってるよね。
678 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:24:07 ] 別にはやってないだろ
679 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:26:07 ] 文法的にはどっちでもいいんだっけ?
680 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:27:37 ] 多分継承元のクラスから関数宣言コピペして、面倒だからvirtual削除してないだけだろ。
681 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:40:33 ] virtualつけてもoverrideかどうかは分からない ということに最近気づいた
682 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:41:32 ] overrideする側はvirtual要らないんだっけ 俺はいつもコメントにoverrideって書くけど C#がうらやましいぜ
683 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:53:43 ] 基本クラスがvirtualなら十分でそれ以降は任意だったと思うがドキュメントが出てこない。 継承が深くなるとvirtualかどうか確認するのにいくつもヘッダーファイルを遡ることになるから、 overrideしたところにもvirtualがあるとわかりやすい。 いま基本クラスと書いたが途中からvirtualっていうのもありなんだよな。 #include <iostream> using namespace std; class A { public: void Say() { cout << "hello A" << endl; }}; class B : public A { public: virtual void Say() { cout << "hello B" << endl; }}; class C : public B { public: void Say() { cout << "hello C" << endl; }}; int main(){ A *a = new C(); a->Say(); B *b = new C(); b->Say(); return 0;} 結果 hello A hello C
684 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 21:59:49 ] 一度virtual付ければ後は無くておk。 俺はドキュメントなんか鼻から探すつもりもありませんがw
685 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:01:01 ] あ、でもvirtualはいつも付けてる。 理由は>>683 と一緒。
686 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:01:12 ] sealedが欲しい。途中から隠蔽w
687 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:06:18 ] #define public protected
688 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:26:15 ] とにかく、C#なんかより前から流行ってるよね。
689 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:35:25 ] >>686 sealedは継承禁止じゃね?
690 名前:デフォルトの名無しさん [2007/09/20(木) 22:36:54 ] void func(const T& param) { T.Hoge(); } っておかしい? 型Tは何かわからないからそのメソッドHoge()を呼ぶのはおかしい?
691 名前:デフォルトの名無しさん [2007/09/20(木) 22:37:32 ] void func(const T& param) { param.Hoge(); } の間違いでした
692 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:38:24 ] 継承される事を前提に作ってないクラスはデフォルトでsealed(final) って仕様だとうれしいんだけど 小規模で作ってる分にはいらないけどさ
693 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:42:09 ] 大規模開発なら「派生型を作らないこと」とドキュメントに書けばいいような・・・ オープンソース物みたいにソースがドキュメントって感じのだと、 そういう言語によるディレクティブは役に立つとは思うけど。
694 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 22:56:14 ] >>689 メソッドに対するシールド。 class A { public virtual void Say() { .. ; }} class B : A { public override sealed void Say() { .. ; }}
695 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:03:45 ] >>694 それ上書き禁止で隠蔽とはいわないんじゃねーかと。
696 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:09:03 ] >>695 やりたいことはこうよ。 class A { virtual F class B : A { sealed F // Aに対するoverrideだが、この後の継承は上書き扱い(非virtual)になる。
697 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:10:36 ] こんなのはどうだっけ? class A { public: void a() {}; }; class B : public A { public: template<typename> void a(); /*not implement*/ };
698 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:13:04 ] >>696 それは隠蔽とは言わんだろ。 AやBにキャストしたら そのまま使えるんだし。 Javaだと覆い隠し(shadowed)とか言ってるような。
699 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:18:46 ] 目印なんだったらコメント使えばいいのになんでそれをトークン使って プログラムそのものを変質させてしまう形でやってしまうのだろう いったい誰がこんな風習を広めたのか気になって眠れない
700 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:19:09 ] >>672 ぁーなるほど。 void (U::*)()の、D<T,U>::funcを。ってことね。 了解しますた。さんくす
701 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:19:49 ] >>698 C#だとこれのことを隠蔽と言うだけどね。VBだとShadows。 sealedといったのは例えが悪かった。このnewがC++に欲しいという話。 class A { public virtual void Say() { .. ; }} class B : A { public override void Say() { .. ; }} class C : B { public new void Say() { .. ; }}
702 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:20:25 ] >>690-691 問題ない。 もしTがメンバHogeを持っていなければ、エラーになる。 それなんて動的言語と言いたいところだが、 そこはC++なんでコンパイルエラー。
703 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:43:21 ] >>701 悪い、それ隠蔽だわ。カプセル化の文脈で出てくるデータ隠蔽と勘違いしてた。
704 名前:デフォルトの名無しさん mailto:sage [2007/09/20(木) 23:58:00 ] >>703 死ね
705 名前:デフォルトの名無しさん [2007/09/21(金) 00:28:53 ] >>702 サンキュ
706 名前:fIIPJstQwl mailto:woptyu@mail.com [2007/09/22(土) 03:23:44 ] zghXa7 <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0484.html">big cock</a> [URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0484.html]pussy[/URL] <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0531.html">big cocks</a> [URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0531.html]pussy[/URL] <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0682.html">big dick</a> [URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0682.html]pussy[/URL] <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0731.html">big dicks</a> [URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0731.html]pussy[/URL] <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0874.html">big naturals</a> [URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0874.html]pussy[/URL]
707 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 06:54:59 ] void func(int n) { void *a = (void*)new char[n]; /*...*/ delete[] (char*)a; } これってメモリリークを起こさずにうまく開放されるんでしょうか?
708 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 06:57:27 ] 日本語がおかしい。 メモリリークは開放処理を試みた後に発生する。
709 名前:Kusakabe Youichi mailto:sage [2007/09/22(土) 07:16:59 ]
710 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 10:27:23 ] >>707 途中で例外が投げられてfuncを抜けるなどといった事態が起これば、 メモリリークするね。
711 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 11:06:37 ] 間違って pc11.2ch.net/test/read.cgi/tech/1188748806/770 に書き込んでしまいました。 宜しくお願いします。
712 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 11:22:09 ] お断りします
713 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:05:23 ] >>661 >つけられるconstは全てつけるべき。 自分が読んだ本ではconst使いましょうという感じだったので 今までconst使っていたのですが、会社でconstを使うなといわれました。 const推奨派とconst禁止派みたいなのがあるのでしょうか?
714 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:18:58 ] 「(たまたま)変更されてない」って理由でつけると結局あとでconst外しまくる羽目になる。 「(概念や仕様から考えて)変更しない」って理由でつけるべき
715 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:23:08 ] 外しまくる羽目になってでも現在付けられるものは 全部付けた方が分かりやすいという考え方もある。
716 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:34:26 ] >>713 const禁止とかどれだけ低脳なんだwww 取り合えず禁止になりうる理由として考えられるのは、 ・API等に非constポインタを渡す必要があり、キャストの排除が最優先ルール ・クラスのconstメンバ関数にコンストラクタで代入できない (↑もちろんメンバ変数の初期化は代入じゃなく初期化子並びを使うべきだが C転向者が多くて教育コストがかかる) ・宣言が長くなるのでちょっと読みにくくなる ・メンバ関数の適切なconst指定も必要になってくるが、C転向(以下略 ・既に非constで作り上げてしまった社内ライブラリを作り直せない。 ・論理バグはコーディング工程で見付ける(コンパイルえらー)のではなく、 デバッグ工程で評価チームが見付けるものとして スケジュールやら人員配分やらが組まれていて直せない。 ・上位の人が勉強嫌い
717 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:39:23 ] >>711 実際にはnew[]するときに、sizeof (T) * 要素数よりも もう少し余分に確保されている可能性がある。 主にデストラクタを呼ぶ回数を記録するため。 もちろん、delete[]ではそれも含めて解放される。
718 名前:NXRoXAzeEmJXNM mailto:doutiregdou@mail.com [2007/09/22(土) 12:50:13 ] IpHLIP <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0942.html">big nipples</a> [URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big0942.html]pussy[/URL] <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1022.html">big tits</a> [URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1022.html]pussy[/URL] <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1155.html">big tits round asses</a> [URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=big1155.html]pussy[/URL] <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0124.html">black lesbians</a> [URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0124.html]pussy[/URL] <a href="www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0284.html">black pussy</a> [URL=www.pic.ucla.edu/~nathan/cgi-bin/moin.cgi/Dirioly?action=AttachFile&do=get&target=black0284.html]pussy[/URL]
719 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:51:29 ] >711 >delete[] は type* (この場合 char* )から >sizeof(type) * (プログラマからは見えない、確保された要素数) >の分だけのバイトを開放するという挙動でしょうか? 確実に言えるのは new[] で確保された領域が解放される、ということだけ。 サイズについては例えば 16 バイト単位とかに切り上げられてるかもしれない。 なお、delete[] については、静的な型と動的な型が一致することが要請されている。 > 14882:2003 5.3.5/3 >In the second alternative (delete array) if the dynamic type of the >object to be deleted differs from its static type, the behavior is undefined. で、気にしているだろうキャストについては、一度 void* にキャストした後、 元の型に戻した場合、値が一致することは保証されているので問題ない。 > 14882:2003 5.2.9/10 >A value of type pointer to object converted to “pointer to cv void” and >back to the original pointer type will have its original value.
720 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 12:53:50 ] 静的な型と動的な型の一致とは?
721 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:01:43 ] >>720 静的な型とはソースコード上の型、 動的な型とは実際の型のこと。 例えば、クラスDがクラスBを継承していたとして、 こういうことはやめてということ。 B* p = new D[n]; delete[] p;
722 名前:713 mailto:sage [2007/09/22(土) 13:05:16 ] >>714 >>715 >>716 なるほど、参考になります。ありがとうございます。 私のところではconstは一切禁止のようです。 「constを使うとコードの量が増えて読みにくい」 「constを使わずに読みやすいコードを書けば、コーディングミスも少ないから効率がよい」 という理由だそうです。
723 名前:デフォルトの名無しさん [2007/09/22(土) 13:09:35 ] このスレッドがふさわしいかどうかわかりませんが、 質問させてください。 C++でリングバッファを作成しようと思っています。 Read PointerとWriter Pointer、そしてBufferを用意し、 Bufferから"複数バイト"を取得する、という処理です。 for(int i = 0; i < num; i++) if(ReadPointer != WritePointer){ value = Buffer[ReadPointer]; ReadPointer = (ReadPointer + 1)%BufferSize; } else break; } 上記のように1バイトずつ読み込むならこれでいいとおもうのですが、 これでは1バイトごとに条件文+インクリメントが入るため避けたいです。 一気に複数バイトを読み込むことを考慮した場合、 "ReadPointerがWritePointer"を 越えないことを判断して、バッファを参照することが必要です。 複数バイトを読み込む場合を考慮したリングバッファを実現する スマートなアルゴリズムはあるのでしょうか? ReadPointer < WritePointerの位置関係からバッファ読み込みを 一気に行うことは容易ですが、ReadPointer > WritePointerの 位置関係からバッファ読み込みを一気に行う処理で詰まっています。
724 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:11:12 ] なんだか前世紀からタイムスリップしてきたみたいな職場だな。 組み込みでCを使ってるって言うのならまだ分かるが、 それでC++かよ。
725 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:15:23 ] #define N 7をconst N = 7;にしたところで コードの量が増えるとは思わないけど。 constにも色々とあるけどさ。
726 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:32:05 ] >>707 auto_ptr 使えば。
727 名前:723 [2007/09/22(土) 13:33:38 ] >724 ご返信ありがとうございます。 特に組み込みなどではありません。 通常リングバッファはどのようにして実装するのが通例となっているので しょうか?セオリーなどが確立しているのでしょうか?
728 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:42:40 ] >>726 new[]したものをdelete[]しないのは駄目だろ。 scoped_arrayとかshared_arrayとか結局Boost頼み。
729 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 13:46:48 ] >>727 BufferSize-ReadPointer 分だけ memcpy してから、 ReadPointer をゼロにして続きを処理すればよい。 C++ では普通テンプレートベースの汎用クラスを用いる。 高速化の必要がある場合には自前で書く。 (ココに高速化の必要がある場合には、リングバッファから取り出して 別の場所へコピーなどしないでバッファを直接読んで処理する方が 良いことが多いけど)
730 名前:デフォルトの名無しさん [2007/09/22(土) 13:52:42 ] 普通に一バイトずつ読み込めばいいだろが 一度に20バイトずつコピー出来ても大して変わらないだろ
731 名前:723 [2007/09/22(土) 13:57:09 ] >727 ご返信ありがとうございます。確かに2回に分けてBufferを取得すれば 可能です。 テンプレートベースの汎用クラスを用いる、というのはdequeなどを 使用するということでしょうか? 高速化を目指しております。 >(ココに高速化の必要がある場合には、リングバッファから取り出して >別の場所へコピーなどしないでバッファを直接読んで処理する方が >良いことが多いけど) 汎用クラスを用いず、地道にmemcpyなどを使ってデータを取得したほうが よいのでしょうか?繰り返しの質問になってしまいますが。
732 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:00:44 ] >>721 >B* p = new D[n]; >delete[] p; これダメなの? これに対応する為にvirtualデストラクタがあるんだと思ってたけど。
733 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:04:13 ] >>731 そうではなくて、ココをチューニングする必要があるのは おそらく数M〜数十Mバイト毎秒の処理を行う場合なわけで、 そんなものをメモリ上でこっちからあっちへコピーする処理自体 無駄なのでやらないようにする、ということです。 例えば映像のデコーダの入力段でリングバッファを用いるような場合、 read(buf, n) などとしていちいちバイト列をコピーして取り出すのではなく、 char* peek(size_t n) のように直接内部のバッファを覗くための関数を用意して、 リングバッファ終端以外では直接バッファ内のバイト列を処理するようにする、等。
734 名前:デフォルトの名無しさん [2007/09/22(土) 14:09:24 ] N 最後のナンバー n番 からdバイトコピーするとする if ( n + d - 1 > N){ memcpy(*,*, N - n - d); memcpy(*,*, n + d - N);} else memcpy(*,*, d); のようにすれば良い
735 名前:723 [2007/09/22(土) 14:11:23 ] >731 ご返信ありがとうございます。理解が乏しいかもしれないので 確認させてください。 readはmemcpyにより格納されたほかのバッファを利用する、ということで peekはmemcpyで移さずにそのまま参照するということですね。 そして、リングバッファ自体はC++の汎用クラスを使って問題ないという ことでしょうか? >リングバッファ終端以外では直接バッファ内のバイト列を処理するようにする、等。 リングバッファ終端以外はpeak()、終端ではmemcpyなどを使って処理する、 ということでしょうか? リングバッファの実装が初めてでなかなかイメージがわいてこない状況です。 何度も質問してしまって申し訳ありません。
736 名前:713 mailto:sage [2007/09/22(土) 14:13:21 ] 低スキルなので>>723 の質問の意味が分からなくて >>724 は私(>>722 または>>713 )に対するレスかと思ってしまいましたw 違ったのですねw >>725 仮引数とかにconstをつけるとコードの量が増えて読みにくいから禁止なのだそうです。
737 名前:724 mailto:sage [2007/09/22(土) 14:13:58 ] >>727 いや、ひとつ上にレスしただけ。
738 名前:723 [2007/09/22(土) 14:18:17 ] >734 実際のサンプルを教えてくださってありがとうございます。 ぜひ参考にさせていただきます。
739 名前:デフォルトの名無しさん [2007/09/22(土) 14:19:42 ] >>738 コードは間違ってる所あるけど、 終端を乗りこえていたら、分割して先頭からコピーすればいいだけ
740 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:30:07 ] >>735 Q1.前半 Yes. 後半 No. Q2. 用途によります。動画のデコーダなどの場合は一度にリニアに アクセスするのは高々数十バイト程度なので、一時的なバッファに コピーしてそこのポインタを返す、あるいは内部バッファを余分に 確保しておいて、バッファ先頭にある続きのデータをそこに複製して リニアに読めるようにする、等。 読む側の処理が簡単なものなら、終端をまたぐケースだけ 前半、後半に分けて処理するようにしても良いでしょう。 Q1. の後半とも関連するのですが、ただひとつ言えることは ここを自前で実装すべきなのは、レアケースであって、その場合には プロファイラやテストなどを行って確かめつつ最適なコードを書く必要があり、 定石みたいなものは無いということです。 ただまぁmemcpyは各社最適化されていて早いコードで実装されてるので、 チューニングしたいんだけど時間がないとかいうときには便利。
741 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:32:00 ] 言い切ってやる。高速化すべきポイントはそこじゃない。
742 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:33:50 ] >>736 >724はあんた宛だと思うよ。 で、正直そんな会社は私の仕事関係なら出入り禁止にします。
743 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 14:34:05 ] >>736 >コードの量が増えて読みにくい 本当にこれだけの理由なら↓これらに当てはまりそうだ。 pc11.2ch.net/test/read.cgi/prog/1139753744/ pc11.2ch.net/test/read.cgi/prog/1179420838/ pc11.2ch.net/test/read.cgi/prog/1169432098/ constがない→何らかの変換が行われる、と予想してそのつもりで読むからな。 constがあることは読み手への助けになるのだよ。
744 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:14:29 ] >732 仮想デストラクタがある場合に OK なのはこっち。 B* p = new D; delete p;
745 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:19:04 ] >で、正直そんな会社は私の仕事関係なら出入り禁止にします 内容の是非はともかくこういう言い方ってDQNじみてると思うんだが
746 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:21:32 ] スルーしる
747 名前:デフォルトの名無しさん [2007/09/22(土) 15:23:02 ] >>744 これは仮想デストラクタがなくても領域自体は確保されるんですよね? Dのデストラクタが呼び出されないのでコンストラクタとかでnewしててそれをデストラクタでdeleteしてる場合はだめだけど
748 名前:713 mailto:sage [2007/09/22(土) 15:28:43 ] >>737 >>742 やはり私に対するレスなのですか。 では改めて・・・ >>724 組み込みではないけど、昔はCを使っていたそうなのでその名残でしょうか? const以外にもいろいろ禁止されました。 私はfor文を for(int i = 0; i < size; i++) { } と書いていたのですが、これもダメで int i; for(i = 0; i < size; i++) { } とか書かなければならないそうです。 理由は、私の書き方だと「速度が遅くなる」「使用するメモリが増える」からだそうです。私にはなぜそうなるのかよくわかりません。 >>743 確かに辞めたくなりますが・・・ いろいろダメだと言われても私は低スキル(頭が悪い)なので理由が良く理解できなくて それでここで質問してみようかと・・・。 スレ違いでしょうか?
749 名前:デフォルトの名無しさん [2007/09/22(土) 15:31:23 ] >>748 おめーと同僚や上司は頭悪いよ 空白は無視されるのが規則なんだよ 速度に違いは出ない
750 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:34:57 ] >>748 >理由は、私の書き方だと「速度が遅くなる」「使用するメモリが増える」からだそうです。私にはなぜそうなるのかよくわかりません。 寧ろ、あなたの書き方の方が速くなったりメモリが減るかも知れません。まぁ、大抵は同じでしょう。 いずれにしろ、一概には言えません。そんな根拠もないようなことを言っているようではお郷が知れると言うものです。 >確かに辞めたくなりますが・・・ 私と一緒に働きませんか?w >スレ違いでしょうか? まぁ、宜しいのではないかと。
751 名前:デフォルトの名無しさん [2007/09/22(土) 15:35:53 ] 空白じゃなかった intの定義する位置か
752 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:37:51 ] >>749 >空白は無視されるのが規則なんだよ 速度に違いは出ない i の宣言場所の違いが判らん香具師は黙ってらっしゃい。
753 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:41:37 ] 関係ないけど VCだと for(int i = 0; i < size; i++) って書いても int i; for(i = 0; i < size; i++) こう書いてるように動くね
754 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:42:21 ] >>763 それはVC6とかの話じゃないのか
755 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:48:42 ] >>744 レスサンキュー まじかー、紛らわしいというか不便だな。 B* p = new D[n]; delete[] dynamic_cast<D*>(p); めんどくちゃいけど、これなら大丈夫だろうか。 まあ、ことさら >>732 みたいに敢えて基底クラスのポインタで確保/解放する意味もないんだろうけどなぁ... >>748 ちなみにそのfor文は上と下で i のスコープが変わると思うが、 for文に入る度にiが確保しなおされるとしたら速度変わるカモな。 使用メモリが増えるかどうかは分からん。
756 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:51:13 ] for文のiとかjってやっぱり仕事なんかで使うときもiやjなの?
757 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:54:34 ] >>755 >>753 はVC(6以前)でスコープが同じになる事を言ってるんだよ メモリ・速度云々は関係なく
758 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:57:58 ] >>756 i, jで何か文句あんのか?
759 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 15:59:46 ] >>756 単なるループ変数にたいそうな名前が付けられると かえって読みにくくなるよね。
760 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:04:07 ] >>758 実際こんがらがって間違える事例を数件目撃したことがある。 慣れてくりゃなんともないが初学者にiやjで教えるのはどうかと思うんだよなぁ
761 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:07:07 ] >iとj 俺は目視デバッグでチェック項目の一つになってるわ
762 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:10:24 ] iやjにも元は意味があったろう 今じゃお決まりの変数として定着しているが
763 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:10:26 ] >>755 それだけなら動くだろうけど、 p経由で扱えるのは先頭要素だけ。 メモリ上にDのインスタンスが連続して並んでいるので、 p[1]が指す位置は、先頭の次の要素ではなく、 おそらくDの配列の先頭要素内の中途半端な位置。
764 名前:723 [2007/09/22(土) 16:14:51 ] >740, 741 ご返信ありがとうございます。 やりたいこととしては、参照用のリングバッファを書き込み用のリングバッファに 定期的に10KB〜300KB程度のデータを移したいと思っております。 (まず初めに最終的にやりたいことを書かなくてすいません)。 この場合は、終端をまたぐケースを考慮して(734さんのコードを参考、 2回の処理に分けるなどをする)、memcpyを使う、という方向で 考えたいと思います。 ただ一点、やはりC++の汎用クラスを使うのがいいのか、単純に 配列を使ってリングバッファを実装すればいいのか悩んでいるところです。 >ここを自前で実装すべきなのは、レアケースであって、その場合には ここっていうのはreadとかpeak()のことですよね? >言い切ってやる。高速化すべきポイントはそこじゃない。 この部分ばかりに注目するのではなく、 他の処理アルゴリズムをもっと最適化しろってことでしょうか? 確認ばかりのレスになってすいません。
765 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:15:05 ] >747 > これは仮想デストラクタがなくても領域自体は確保されるんですよね? はい。 > Dのデストラクタが呼び出されないのでコンストラクタとかでnewしててそれをデストラクタでdeleteしてる場合はだめだけど 規格上は delete しちゃうと未定義動作。 >755 配列は polymorphic に扱わないというのが基本。理由は >763
766 名前:713 mailto:sage [2007/09/22(土) 16:16:59 ] >>750 >私と一緒に働きませんか?w そう言われるとなんだか嬉しいですwでも私は足引っ張りまくると思いますよ?w >>755 >for文に入る度にiが確保しなおされるとしたら速度変わるカモな。 なるほど、私の上司は速度についてはそれを言っていたのかもしれません。 私はiのスコープをループの中だけに限定するつもりで そのように書いていました。(これも本で読んだので・・・) >>756 私はiやjを使っています。
767 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:25:30 ] for (int iとint i; for(で最適化しても 速さに違いが出るようなコンパイラなんて 窓から投げ捨ててしまえ。 そんなことで速さに違いが出るのだったら、 設計思想的に、はなからこんな機能導入されていない。
768 名前:デフォルトの名無しさん [2007/09/22(土) 16:28:36 ] 基本的に for ( int i= )の方が速いのでは? その都度変数を確保すればレジスタに乗りやすいが、確保してあったままではHDDやメモリに乗っている可能性が高い
769 名前:755 mailto:sage [2007/09/22(土) 16:31:58 ] >>757 >>755 は>>753 に対して何か言ったつもりはないけど、 その話は(他のスレだったかで)聞いたことがアルよ。 >>762 多分 i = index のi じゃないかな。配列で使うことが多い気がする。 jは単にiの次の文字。 >>763 ,>>765 なるほど、このスレ見なければそのまま使ってたところだ。 勉強中でg++では問題なさそうに見えたからね。情報ありがとう! >>767 ,>>768 まあ実際には気にするほどな差が出るとは思わないよね。
770 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:34:23 ] >>768 いつの時代のコンパイラ使ってるんだ? お前は。
771 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:36:43 ] intで差が出るのは糞コンパイラ未満だが、 intでは無くiteratorだった場合差が出ても果たして糞コンパイラ未満と言えるだろうか。
772 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:36:58 ] しかし、ある言語の常識を別の言語にまで持ち込むバカっているんだなぁ。 C(とCが全盛だった時代の貧弱なコンパイラ)ならまだ分かるかもしれないが、 今の時代のC++でやることじゃないだろ。 絶対に関わりあいたくないから、どこで働いているのか晒してくれないか?w
773 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:38:09 ] 大丈夫 君には入社できないから
774 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:39:42 ] >>771 前提を変えるなアホ。 そのイテレータのコンストラクタが100MBぐらいメモリを確保するんだったらどうだろうかとか、 いくらでも話を広げられるじゃないか。
775 名前:713 mailto:sage [2007/09/22(土) 16:41:07 ] >>772 >絶対に関わりあいたくないから、どこで働いているのか晒してくれないか?w 私の会社ですか?それは勘弁してくださいw
776 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:42:05 ] ぶっちゃけ日本のC++PGの何割がEffective C++とか読んでんだろうな 板違い気味だけど >>771 俺だったら滅茶苦茶速度に過敏なコードだったら 例え速度が全く等しくてもポインタにする
777 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:47:58 ] i,j については↓の「暗黙の型宣言による伝統的・慣習上の変数命名規則の誕生」の項を参照。 ja.wikipedia.org/wiki/FORTRAN
778 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:52:18 ] >>768 基本的に、C/C++ではローカル変数は全てスタックに確保される。 その場合、その確保作業は関数突入時にのみ行われる。 従って、次のようなコードはどちらも確保に伴うコストに変わりはない。 但し、後者の場合は最初のiと後のiで違うメモリを確保する可能性は、ある。 -- void func() { int i; ...; for (i = 0; i < N; ++i) ...; ...; for (i = 0; i < N; ++i) ...; } void func() { ...; for (int i = 0; i < N; ++i) ...; ...; for (int i = 0; i < N; ++i) ...; } -- # 勿論、後者もiの有効範囲が重ならないことは容易に判る訳で、真っ先に最適化の対象にはなりそうだが。
779 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:53:29 ] >>776 私だったら、滅茶苦茶速度に過敏なケースにコンテナは使わないな。
780 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:57:00 ] >>778 >後者の場合は最初のiと後のiで違うメモリを確保する可能性は、ある。 つまり関数突入時に二つのiを確保するということかな? だとすれば、速度/メモリ量共に影響があるじゃないか!
781 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:58:44 ] >>776 可読性も決して軽視出来ない要素だろ・・・条項
782 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 16:59:53 ] >>780 馬鹿だな、全く最適化を考慮しない場合の話だぞ。 それに、速度には全く影響ないじゃないか。
783 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:03:16 ] >>782 >馬鹿だな、全く最適化を考慮しない場合の話だぞ。 その場合のつもりで言ったんだ。 >それに、速度には全く影響ないじゃないか。 すまん、勘違いだった。
784 名前:713 mailto:sage [2007/09/22(土) 17:04:42 ] >>776 >ぶっちゃけ日本のC++PGの何割がEffective C++とか読んでんだろうな Effective C++は持っていますが難しくて分からないところがたくさんありました。 私の会社ではconstのことを考えるとEffective C++とか読んでるのは私だけですかねぇ・・・。
785 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:06:27 ] >>780 お前の環境についてはしったこっちゃないが。 俺様の環境ではスタックポインタを4つ減らすか8つ減らすかの違いでしかないな。 あと俺様のコンパイラはお前以上に頭がいいので、ひとつしか使わないがな。
786 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:08:22 ] 頭のいいコンパイラなら そもそも使わない分までスタックポインタを移動しない。
787 名前:713 mailto:sage [2007/09/22(土) 17:39:37 ] あと、他にも会社で禁止にされたことがあります。 ブロック内でfor文やif文など以外のブロックを作成してはならないと言われました。 理由は「行数が増えたりして読みにくくなる」「変数は関数の先頭で宣言したほうが読みやすい」からだそうです。 私はこんな感じで { } を使うことがたまにあります。 void hoge(void) { { } } 私の会社では禁止なのですが、この書き方は一般的なのでしょうか? 皆さんはこのように { } を使うことはありますか?
788 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:45:51 ] >>787 デストラクタの実行タイミングを細かく制御したいとき(セマフォなどの共有リソースを使ったりとか)には よくそういう包み方することはあるな。
789 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:46:42 ] >>787 変数を使う範囲を明示するために頻繁に使うよ。 その会社には仕事を頼みたくないな…。
790 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:47:53 ] >>787 俺はあまりやらない。その内側のブロックを関数化するかもしれない。
791 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:49:02 ] >>713 そんな会社辞めちまえ、ダメプログラマにされるぞ
792 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:49:28 ] やっぱり出入り禁止だw >>787 >理由は「行数が増えたりして読みにくくなる」「変数は関数の先頭で宣言したほうが読みやすい」からだそうです。 この辺でお郷が知れる。 こう書く人が多かったりしない? -- FILE * fp; fp = fopen(...);
793 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 17:55:17 ] >>713 尻穴みたいな井の中の蛙になりたくないなら 学習の意欲のあるうちに辞めちまったほうがいい あるいは部署変えてPG以外の業務勉強したほうがためになりそう
794 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:01:32 ] >>787 それは禁止されてていい
795 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:03:07 ] ある意味そのレベルでC++使ってるっちゅーのが感動的だナ C++といいつつ実質Cとして使ってる制御系か? VC++6.0以前とMFC使ってる業務系か? 制御で「const使うな」はありえんか
796 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:14:00 ] これで「クラスって何、おいしいの」だったら傑作なんだが。
797 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:16:17 ] どこが?
798 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:20:00 ] >>787 関数内の { } は変数などのスコープを限定するツールとして役に立つよ。 スコープを限定するのがどういいのかは、話すと長いが... グローバル変数がよくない(誰がどういうタイミングでアクセスするのか 把握できなくなる・しにくくなるから)のとおおよそ同じ理屈。 根拠のない(しかもわりと間違っている)ローカルルールが多いね。 チーム内で1人で反抗してもしょうがないとは思うけど、 ちゃんとしたプログラマになるつもりなら、 後学のためにまず初学者向けの良書を読んでおくことをお勧めする。個人でね。 Effective C++よりももうちょっと易しいものから読んだ方がよさげ。 ...って何がいいんかね。C++ Coding Standardsってのも良書でお勧めできるけど、 やっぱりちょっと早いような。
799 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:21:02 ] そんな長い関数を書くなよ
800 名前:713 mailto:sage [2007/09/22(土) 18:24:51 ] 皆様、レスありがとうございます。 >>792 いいえ、C++ Builderを使っているのでファイルにアクセスするときは みんなVCLを使っていると思います。 VCLに関連して「Delphiを使うかもしれないからC++のライブラリに依存してはならない」 という理由でSTLも禁止になりました。 STL禁止は守れそうにありません。 >>794 その理由は 「行数が増えたりして読みにくくなる」「変数は関数の先頭で宣言したほうが読みやすい」からですか? >>795 前述のようにC++Builderを使っています。 パソコンからいろんなものを制御しています。
801 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:29:48 ] >>800 悪いことはいわんからとっとと逃げ出したほうがいいんじゃないか、その会社。 正直言ってアホしかいねーだろ、どうみても。
802 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:34:13 ] なんか凄いことになってるな。 >>773 これなら刺身の上にタンポポを乗せる仕事のほうがまだマシだ。
803 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:36:11 ] 標準ライブラリを使っちゃいけないってどんだけー
804 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:40:08 ] まあ、仕事でやってるとわけ分からんルールは多いね。 なぜそするの? → 以前からそうだから。 こう変えたほうが良いのでは? → 今までこれでうまく言っているのだから変えるべきではない。 ということが多すぎ(--; とりあえず社内ルールだからと割り切ってるが、本来どうあるほうが良いのかという勉強は欠かさないつもり。
805 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:40:12 ] STL禁止か……もはやC++じゃないな。 テンプレートは使えるんだろうか。 というかなぜC++を使っているんだ。 もういっそのこと全部Delphiでいいだろ。
806 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:45:25 ] この手の社内ルールというのは、 それを決めた時点では妥当だったりそれなりの理由があったりするものだが、 その後状況が変わってもそれを盲信して変えないという状況に陥りがちなんだよな。 なぜそうするのかが忘れさられて、ただルールだからという理由で守られ続ける。
807 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:47:45 ] STL禁止や標準ライブラリ禁止って組み込みだったらそれなりにあることだと思ってたけど?
808 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 18:54:41 ] >「Delphiを使うかもしれないからC++のライブラリに依存してはならない」 コピペ改変コーディングしか出来ない奴が大半と見た
809 名前:713 mailto:sage [2007/09/22(土) 19:04:23 ] >>805 >テンプレートは使えるんだろうか。 テンプレートは上司が知らないので使いすぎると また禁止になる可能性があると思います。 >というかなぜC++を使っているんだ。 >もういっそのこと全部Delphiでいいだろ。 これは私の推測ですが、 C言語は知っている ↓ Windowsの時代になりGUIのソフトを作成しなければならない ↓ Visual C++は難しいのでDelphiを使う ↓ C++Builderが発売 ↓ 慣れたC言語を使いたくてC++Builderを使う と、こんな感じではないかと・・・。 >>807 私の会社では組み込みのプログラミングはありません。
810 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:16:04 ] っていうか組み込みの仕事だっていうから、コンパイラをさらしてくれないと何とも言えない。 上司や同僚が親切に「(このコンパイラでは)〜の方が速くてコンパクトなコードが出る」と 教えてくれてるのかもしれないし。
811 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:37:16 ] その上司は各種ライブラリのリファレンスもconstウゼーな、 とか言いながら読むんだろうな。
812 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:38:53 ] だんだん「ム」ではなく「マ」の話題になってきたような気がする。
813 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:44:27 ] あとでっかい機能といえば例外処理と名前空間だろうか。 Delphi移植論でいけば例外処理はありとなってほしいところだが。
814 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:45:11 ] コーディング規約やその他のコーディングスタイルは、本来プロジェクトごとに決めるべき。 企業としての品質を維持するために共通ルールを設けるのは構わないが、ある程度の幅を持たせておき その幅をプロジェクトごとにきめる形にするのがいい。 設計段階でのレビュー作業や、コードレビュー、プロジェクト完了時点での反省会議などをきちんとやれる会社でさえ、 コーディングルールは決まっていないことが多いから仕方ないことなのかも知れないが。
815 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 19:48:48 ] その辺のC++の「新機能」って初出はARMだっけか? 1990年だからもう20年近く前になるんだが
816 名前:713 mailto:sage [2007/09/22(土) 20:27:49 ] >>810 え?>>810 は私に対するレスですか? 私はパソコンで使用するソフトを作成しているので 組み込みの仕事では無いと思います。 ついでにコンパイラはC++Builderのそれです。 >>813 名前空間は使っているところをまだ見られていないと思うので分かりません。 上司が名前空間という機能を知っているかどうかも分かりません。 例外処理は勉強不足で私自身分かっていないのでなんともいえません。すみません。 >>814 私の会社はプログラマが少ないせいなのか、決まったルールは無いようです。 入社して間もない私が今まで誰もしなかった書き方をしていたので 上司は他の人も読めるようにしたかったのではないでしょうか。 また、コードレビューや反省会議といったものは特に無いようです。
817 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 21:01:47 ] レビューもなく環境的な制限もないのにあれ使うなこれ使うなとか言われるのはやだな。
818 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 21:05:08 ] 完全に言語/技術の話じゃなくて「いかに俺の会社の上司がドキュソか」っつー 話になってるな そういうのはマ板でやってくれんか
819 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 21:29:57 ] const_<int> i(0);
820 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 21:45:55 ] なんかこの流れキモくね?
821 名前:713 mailto:sage [2007/09/22(土) 21:59:46 ] 納期に間に合わないので明日は出勤します。 >>818 >>820 すみません。 >>819 それはconstのかわりにということですか・・・。 見つかるとそれも禁止になると思います。 スレ違いになってきたようなのでこの話はこのへんで止めます。 レスして下さった皆様、今日はありがとうございました。
822 名前:デフォルトの名無しさん [2007/09/22(土) 22:23:46 ] std::ostreamに空白文字 ' ' をn個出力する処理の、素敵な、シンプルで高速な書き方を教えてください。
823 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:25:24 ] for(int i=0;i<n;i++) { os << ' '; }
824 名前:デフォルトの名無しさん [2007/09/22(土) 22:27:55 ] >823 現状はそれですが、プロファイラが遅いと言っています。
825 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 22:28:04 ] こうかな cout << setw(n) << ' ';
826 名前:デフォルトの名無しさん [2007/09/22(土) 22:32:57 ] >825 ソレダ どうもありがとうございました。
827 名前:デフォルトの名無しさん mailto:sage [2007/09/22(土) 23:20:47 ] emacsでc++開発をするときの環境に関するサイトってないでしょうか? meta-x なんちゃら でDebugからclass構造のブラウズ、リファクタリングまで なんでもできちゃう環境とか作れるのでしょうか? elispは最近おぼえました
828 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:28:45 ] Cの基本的な知識はありますがC++を独学するとしたらお薦めの本はありますか?
829 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:32:30 ] Cの本は独習C、新・詳説C言語です。
830 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:33:30 ] じゃあ独習C++でいいんじゃないの?
831 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 00:50:31 ] 独習C++は勉強になるけどつまらないっていう評判が多いけど、個人的には面白かったよ。 愛だね。
832 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 01:37:41 ] 独習にします。ありがとうございます。
833 名前:デフォルトの名無しさん [2007/09/23(日) 01:39:20 ] そのあとでいいから Effective C++, Effective STL, Exceptional C++, Exceptional C++ Style くらいは読んでね。同僚の迷惑にならんよう。
834 名前:デフォルトの名無しさん [2007/09/23(日) 01:43:32 ] 今から独習C++なんて読み始めてる人なら Effective C++, Effective STL, Exceptional C++, Exceptional C++ Style を読めるようになるまで5年はかかる
835 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 01:45:46 ] >>833-834 オマイラなんでそんな意地悪なことばっか言うわけ?
836 名前:デフォルトの名無しさん [2007/09/23(日) 01:46:46 ] 平均的なプログラマってそんなもんですかね。安心するなぁ。
837 名前:デフォルトの名無しさん [2007/09/23(日) 01:48:24 ] なんで意地悪????? 3番めのはちょっと難しいかなとは思うけど、読まないとダメダメなコード 書いちゃうのがC++なんだから読むしかないべ。 新入社員に読ませてるけど、あんまり脱落しないよ?
838 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 01:52:49 ] つーか、何で書籍スレでやらないの?
839 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 01:53:41 ] イエテル
840 名前:デフォルトの名無しさん [2007/09/23(日) 02:12:25 ] C++を本当にC++らしく書ける奴なんてみたことないぞ 日本人だとエピスがちょっと書けるかな? 程度
841 名前:デフォルトの名無しさん [2007/09/23(日) 02:14:49 ] プッ
842 名前:デフォルトの名無しさん mailto:sage [2007/09/23(日) 02:25:07 ] 上司「俺の知ってるCの一部の機能だけで書け」 ってことか・・・