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
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の一部の機能だけで書け」 ってことか・・・