04/05/01 22:03
>>174
どういうところが限らないんですか?
内容無しの反論なら誰でも出来ます。
176:デフォルトの名無しさん
04/05/01 23:49
>>175
>高級言語は、多かれ少なかれどこか影でこそこそやってます。
証明できないからじゃない?
177:デフォルトの名無しさん
04/05/02 00:51
>>175
「高級言語では」何が「影でこそこそ」に当たるの?
たとえばa = b + c * d; が
tmp = c * d;
a = b + tmp;
とかに分解される事?
マクロアセンブラでも、
ラベルがアドレスに展開されたりする事は
影でこそこそに当たらないの?
たとえば、Cでは何が影でこそこそしてる?Pascalでは?
どっちも高級言語じゃないのか、スマンな。
178:デフォルトの名無しさん
04/05/02 01:04
>>177
GCの話じゃねーのか?
179:デフォルトの名無しさん
04/05/02 02:50
言語が高級になればなるほど、コンピュータがやってくれることが増えるってだけだろ。
コンピュータは元から人間の手間を省く道具。だからそれは自然なこと。
それが嫌いならアセンブラ(よりも機械語のほうがいいか?)を使えってことだろ。
180:デフォルトの名無しさん
04/05/02 05:06
>>178-179
影でこそこそが気持ち悪いって言う人間に
考えもなしにアセンブラで組めなんていう煽りを何のするなということだ。
177で正論ぶってるから、更に気になっただけだ。
181:デフォルトの名無しさん
04/05/02 05:07
×考えもなしにアセンブラで組めなんていう煽りを何のするなということだ。
○何の考えもなしにアセンブラで組めなんていう煽りをするなということだ。
編集ミスった。
182:デフォルトの名無しさん
04/05/02 05:07
×177
○175
、、、orz
183:デフォルトの名無しさん
04/05/02 11:50
アセンブラは全く知らないんだけどメモリ解放はどうするの?
やはりプログラマによる手動解放?
184:デフォルトの名無しさん
04/05/02 12:51
>>183
mallocに相当するコード自分で買い解け
185:デフォルトの名無しさん
04/05/02 14:25
brkとかHeapAllocとかOS提供のAPIを呼ぶ
あとは、cのライブラリをリンクするとか。
186:デフォルトの名無しさん
04/05/03 23:09
C++を覚えるっつーか、使いこなすレベルになるころには
管理職をやらされるのが日本のコンピューター業界。
そして新人は今日もまたメモリリークしまくりのコードを量産する。
187:デフォルトの名無しさん
04/05/03 23:15
>>186
年取ると新しい考え方を受け入れられくなったり、徹夜の仕事
がとても続けられなくなるからそれでいいのよ。
188:デフォルトの名無しさん
04/05/04 09:42
>>187
若い頃から徹夜仕事しなかったし、この歳になっても睡眠時間3時間ですが何か。
あーでも、役職はついてるし部下もいるなぁ。
189:デフォルトの名無しさん
04/05/04 11:47
>>188
過労死すんなよw
190:デフォルトの名無しさん
04/06/12 19:50
過労死しそうな人が出るほど C++は難しすぎ
191:デフォルトの名無しさん
04/06/15 06:24
>>190
激しく同意
192:デフォルトの名無しさん
04/06/18 14:54
c++の何が難しいのかがわからない。
難しいこともできるって話じゃないのか?
俺的にはVBの方が難しい(めんどい)ような
あと、パールとかはキャストがきもい。
193:デフォルトの名無しさん
04/06/18 15:26
Perlのキャスト?
194:デフォルトの名無しさん
04/06/18 18:52
俺も、Javaや、VBのほうが、よっぽど難しい。
195:192
04/06/18 21:30
>>193
いや、だいぶ前にちょろっとやっただけだからうろ覚えだが、
c++なら明示的にキャストして、キャストできないようならコンパイル時にエラーでるしょ?
パールって何でもかんでも、暗黙的に型変換してるイメージあって、怖い。
196:デフォルトの名無しさん
04/06/18 21:37
perlがCGIの筆頭であり続けるのは、そのきもいキャストのおかげなのだが。
197:デフォルトの名無しさん
04/06/18 21:39
perlに型はありませんよ
198:デフォルトの名無しさん
04/06/18 21:43
コード中に型宣言が無いだけで実行時にはどの言語には型判断されてるでしょ
バリアント型ってそういうもんだと思われ
199:デフォルトの名無しさん
04/06/18 21:45
×言語には
○言語でも
200:デフォルトの名無しさん
04/06/18 21:49
なぜそこでVB?
201:デフォルトの名無しさん
04/06/18 21:50
バリアント型ってVBだけか?jsとかのvarもそれだろ?
202:192
04/06/18 22:10
いや、そのキモイキャストがいやだってだけ・・・。筆頭であろうが気にしない。
実行時判断っていうのが怖いわけで、例外とかめんどくさ。
俺が個人的にVB嫌いなのは、ポインタ取得とかめんどくさいから。
あと、まぁ、なんか色々めんどくさい。とc++になれてるとそう思う。
203:デフォルトの名無しさん
04/06/18 22:11
>>201
その気になればC++だってValiantクラスとか作れるだろう
class Valiant
{
public
operator (int)();
operator (char)();
operator (short)();
operator (long)();
operator (long long)();
operator (float)();
operator (double)();
operator (long double)();
operator (char *)();
operator (wchar_t *)();
・・・
204:192
04/06/18 22:17
>>203
boost::anyとかあるけどね。
ATL系とかでも。
でもboost::anyの場合、
代入するときはともかく、値を取得するときは明示的にキャストして
失敗したら例外送出だからなぁ。
なんつか、この明示的にって段階踏まないといやなわけでして。
205:デフォルトの名無しさん
04/06/18 23:59
boost::variant
206:192
04/06/19 00:10
>>205
そういや、それもあったなぁ。
いまだ使ったこと無いが。
なんに使うと効率てきなのかいまいちわからん。
ビジターパターンに使えるっていうが、ビジターパターン自体まだ使ったこと無いや。
207:デフォルトの名無しさん
04/06/19 00:15
C++が難しくないなんて言えるなんてすごいな。
今までVB,C,C++,Dehphi,Java,PHPなどで業務アプリを作って来たけど、
一番生産性が低いと感じたのはC++だった。
もちろん、それなりに習熟すれば生産性はあがるのだろが、
習熟するまでの時間がかかりすぎる感がある。
今の職場では多分俺が一番C++に詳しいけど、C++をマスターしたなんてとても言えないし、
積極的にC++を採用したいか?と聞かれれば可能な限り他言語を選択したい。
C++マンセーになる理由が俺には解らん。。。
208:デフォルトの名無しさん
04/06/19 00:27
>>207
WindowsのServiceアプリ組むときなんかはC系の言語が一番便利なわけで
人によってはCでそのまま組むよりもC++の方が開発時効率が上がる
少なくとも私はそう
CよりもC++の方が一度に考えなければいけない要素が少なくて済む
209:デフォルトの名無しさん
04/06/19 01:10
>>207
C++以前にCに十分習熟していないせいだと思うよ
210:デフォルトの名無しさん
04/06/19 01:26
生産性の低い言語=習熟しにくいだからな
熟練者が生産性高いよって言ってもサンプルにはならへんのが実情
個人的にはDに一番期待している
211:デフォルトの名無しさん
04/06/19 01:31
つーか、業務系なんてどの言語で書いたって同じだろ。
C++のメリットが活きるのは寧ろ制御系だからな。
212:デフォルトの名無しさん
04/06/19 01:36
てか、俺的イメージだが、
c++からcを省いたようなもんがJAVAって感じだが・・・。
VBで生産性あがるっていっても、簡単なもんだけでしょ?めんどいことになるとできなそうだし。
デルファイはいじったことないなぁ、簡単らしいって話はきくが。
PHPもまだないなぁ。
俺はc++2年ほどやったが、
後は、
アセンブラ、
ロケール、
メモリアロケータ、
modern c++ design 読んで、
デザパタ極めて、
マルチスレッドも極めるくらいかねぇ。
って先なげぇ。
まぁ、一部c++以外にもつかえるが・・・。
213:デフォルトの名無しさん
04/06/19 20:53
ISO C++の規格策定にかかわっている人にとっても、C++は難しいらしい。
現行の規格に内在するバグというか不都合な点がバラバラ出てきている。
URLリンク(www.open-std.org)
URLリンク(www.open-std.org)
214:デフォルトの名無しさん
04/06/20 11:10
C++もJavaも使ってる俺からすればJavaの方が圧倒的に簡単。
両者比較してJavaのほうが難しいなんていってる奴はオブジェクト指向理解して無いだろ(プププッ
せっかくC++コンパイラ使ってるのにCみたいな書き方ばっかりする宝の持ち腐れオオバカや郎なんだろうな(www
215:デフォルトの名無しさん
04/06/20 12:00
>>214
誰も「Javaのほうが難しい」なんていってないと思うが。
216:デフォルトの名無しさん
04/06/20 12:07
Javaしか出来ないJava厨の思考回路は意味不明過ぎて難しい
217:デフォルトの名無しさん
04/06/20 17:25
Cしか出来ないJavaを使った事のないような時代遅れの無能親父の煽りはもう沢山
218:デフォルトの名無しさん
04/06/20 20:40
Javaしかできない連中はただいま大量生産中です。
正直言ってヤバいっすね。
219:デフォルトの名無しさん
04/06/20 21:02
ほとんどc++しかできないです。
まぁ他の覚えるのはそれほど苦労はしないけど。使わんからすぐ忘れる。
220:デフォルトの名無しさん
04/06/20 21:05
次の本命はD言語だな
メモリリークを起こさない上に任意のタイミングでGCできる優れもの
2chブラウザもDで作れば無駄にメモリ取らずに済むよ
221:デフォルトの名無しさん
04/06/20 21:23
>メモリリークを起こさない上に任意のタイミングでGCできる優れもの
大抵のGCはメモリリーク起こさないし、任意のタイミングでコレクトできると思うんだけど
>2chブラウザもDで作れば無駄にメモリ取らずに済むよ
なんで?
222:デフォルトの名無しさん
04/06/20 21:37
>>221
>>メモリリークを起こさない上に任意のタイミングでGCできる優れもの
>大抵のGCはメモリリーク起こさないし、任意のタイミングでコレクトできると思うんだけど
ランタイムなしでそれを実現できるのさ
>>2chブラウザもDで作れば無駄にメモリ取らずに済むよ
>なんで?
2chブラウザは起動初期の倍近くのメモリリークが起こってるからね
223:デフォルトの名無しさん
04/06/20 21:45
>>222
ランタイムなしでそれを実現出来るから何?
2chブラウザって沢山あるけど、そもそもどの2chブラウザなの?
224:デフォルトの名無しさん
04/06/20 22:03
>>223
ランタイムが無いって事は早いって事じゃん!
ちなみに俺にブラウザはLive2ch、最強だぜ
225:デフォルトの名無しさん
04/06/20 22:17
Live2ch って VB製じゃなかったか?
速さとか軽さとかを追求したものではないだろう……。
226:デフォルトの名無しさん
04/06/20 22:22
というかVBランタイムってGC無いんだと今知ったのは内緒w
227:デフォルトの名無しさん
04/06/20 22:29
ネイティブでGC作る言語は強力だとは思うが
資産が無い上にMSがC#発表したばかりでのってくるとも思えないのが痛い
228:デフォルトの名無しさん
04/06/20 22:38
おまいら、自分のケツぐらい自分でふけよ。
その内、下の世話までM$におながいすることになるぞ。
229:デフォルトの名無しさん
04/06/20 23:09
てーか、GCいらない。
メモリ取得、解放するときの動作早くしろ。
自分でメモリアロケータをカスタマイズしなくても、
コンパイラオプションの設定で超高速で動くようにしてくれ。
230:デフォルトの名無しさん
04/06/20 23:20
GC使ったほうが長時間安定した速度で動くから、
非GC環境が速いとも言い切れないらしいよ
231:デフォルトの名無しさん
04/06/21 00:12
今ホットゾヌ2使っているけど、メモリリークひどすぎ。Delphiなんだけどなぁ。
スレをどんどん見ていくとあっという間に500MBほどに未使用メモリが膨れあがる。
正直一番気に入っているので、C#で書き直して( ゚д゚)ホスィ…。
232:デフォルトの名無しさん
04/06/21 00:21
>>230
できれば根拠が知りたい。
233:デフォルトの名無しさん
04/06/21 00:55
>>232
良く>>230の言っている意味がわからんが、非GC環境で「メモリリーク」が
どんどん起こったとして、メインメモリを食いつぶしてスワップ起きまくりに
なるから遅くなる、とかそういう次元の話なのだろうか。
234:デフォルトの名無しさん
04/06/21 01:07
メモリリークは非GC環境に限った話じゃないんだが。
235:デフォルトの名無しさん
04/06/21 01:25
>>232-233
URLリンク(www.kmonos.net)
より
C/C++ プログラマは明示的なメモリ確保と解放に慣れていて、
ガベージコレクタの効率や利点については懐疑的なようです。
私は、 一からガベージコレクションを念頭に置いて書いたプロジェクトと、
既存のプロジェクトを GC を使うように方向転換した経験のどちらも持っていますが:
ガベージコレクトされたプログラムの方が高速です。 これは直感に反するかもしれませんが、その理由は:
236:デフォルトの名無しさん
04/06/21 01:25
●明示的なメモリ管理の際によく使われる手法は、参照カウントです。
代入があるたびにカウントを増やしたり減らしたリソースを挿入するのは、 速度低下の原因になっています。
スマートポインタクラスでラップしても、 速度的な解決にはなりません。(
またいずれにせよ、 循環参照を削除できない参照カウント方式は、 一般的な解決策ではありません。)
●オブジェクトによって獲得されたリソースの解放には、 デストラクタが使用されます。
多くのクラスでは、このリソースとは 割り当てられたメモリのことです。
GCを使えば、 ほとんどのデストラクタが空になり、完全に削除してしまえます。
●メモリ管理のためのデストラクタは、 オブジェクトがスタックに置かれたときに影響が顕著になります。
例外が発生したときに、全てのスタックフレームでデストラクタが呼び出され、 メモリを解放するような仕組みが必要となるのです。
もしデストラクタが関係しなければ、例外を処理する特別なスタックフレームを 設定する必要がなくなり、コードは高速に実行されます。
●メモリ管理に必要なコードは全てを合わせるとちょっとした量になります。
大きなプログラムになるほど、キャッシュに入らない部分が増え、 ページングが多く発生し、 プログラムが遅くなります。
●GCは、メモリが残り少なくなってきたときのみ実行されます。
メモリに余裕があれば、プログラムは全速力で実行され、 メモリ解放に一切時間を取られません。
●モダンなGCは、過去の遅いものより遙かに発展しています。 世代型のコピーGCには、 昔のマーク&スイープアルゴリズムの非効率さはありません。
●モダンなGCはヒープの詰め直しを行います。 これによってプログラムが活発に参照するページの数を減らし、 キャッシュヒット率を高め、 スワップ回数が減ります。
●GCを使うプログラムは、メモリリークの積み重ねで次第にパフォーマンスが悪化、 という事態に縁がありません。
237:デフォルトの名無しさん
04/06/21 09:34
> ●GCを使うプログラムは、メモリリークの積み重ねで次第にパフォーマンスが悪化、
> という事態に縁がありません。
これはウソだな
238:初期不良
04/06/21 10:07
まあ、突っ込みたいのはわかるがメモリリークになる可能性は低くなっていると言う事でいいんじゃねーの?
239:232
04/06/21 10:57
>>235
提示してくれたページ、GC周りをさらっと目を通した。ありがとう。
●スマートポインタは使いたいケースに応じて選ぶことができるから、
参照カウントだけと比べるのはどうかなぁと思う。
●デストラクタが空になるのはスマートポインタでも同様。
●例外に関しては同意。
●メモリが少なくなって来た時にごっそりメモリ解放するんだと
むしろその一瞬非常に不安定になるのではないか。(これは欠点に書いてあったな)
自分は例外バンバン投げたいのでデストラクタが重くならないなら
それはありがたい。
ただ、Dって面白そうだね。autoを使ってscopedに解放もできちゃうようだし。
きめ細やかな言語だと感じた。GCの話題から外れてゴメン。
240:デフォルトの名無しさん
04/06/21 12:00
まあ、スタイルにも依るんでしょうけど。
●明示的なメモリ管理の際によく使われる手法は、参照カウント...
shared_ptrってそんなに頻繁にコピーってする?
俺は所有権のはっきりしないリソース(ファイル・ハンドル等)の管理に
使うことが多く、参照カウンタが変化するのってタスク相当の粒度の
オブジェクト間の構成を初期化するときぐらい。
●またいずれにせよ、 循環参照...
上記のような使い方をする場合は、保持するオブジェクトと
保持されるオブジェクトの関係が階層的になり、参照がループすることは
無い。むしろGC導入によるdtor呼び出し遅延のほうが俺的には大問題。
●メモリ管理のためのデストラクタは、 オブジェクトがスタックに...
俺の場合、Appレベルでは例外って殆ど使わないし。
つうか、GCスレってないのね。
241:デフォルトの名無しさん
04/06/21 18:54
>>240
「コンパイラ・スクリプトエンジン」相談室が失速気味なので
良かったら使ってやってください。
スレリンク(tech板)
242:デフォルトの名無しさん
04/06/21 20:27
>>239
>●デストラクタが空になるのはスマートポインタでも同様。
同様じゃないよ。C++だと書かなくてよくなるだけで、実際はコンパイラが生成してる。
GCがあると、「完全に」削除できる。
243:デフォルトの名無しさん
04/06/21 20:40
脳内コンパイラキタ------
244:デフォルトの名無しさん
04/06/21 20:47
?
245:デフォルトの名無しさん
04/06/21 21:33
>>242
dtorに書いてなくても暗黙的にメンバ変数のdtorが呼ばれるつう
意味ならその通りだけど。
ていうか、236の2番目のはどういうメリットなんだろう。
記述忘れてメモリリークって意味ではauto_ptr/shared_ptrで書けば
ありえないし。まともなC++erならメンバにauto_ptr等を含んだ
オブジェクトを頻繁に(例えばsortの比較関数オブジェクト内で)
生成・破棄するようなコードはかかないだろうし。
サイズが減ってキャッシュが云々ってのもいまいち説得力に欠ける。
246:デフォルトの名無しさん
04/06/21 22:00
>>242
オブジェクトのデストラクタは空
スマートポインタのデストラクタは空でない
ということがいいたいのだろう
オブジェクト内にスマートポインタをもつなら
結局オブジェクトのデストラクタも空でなくなるが
247:232
04/06/21 22:06
>>242
デストラクタについては、
1. ソース上書かなくて良くなる
2. スコープが切れた瞬間に呼び出されるわけではなくなるから例外が効率良くなる
と言っているように見えた。だから1についてスマートポインタと同様と書いたんだが、
文意は違ったのかもな。でも、把握した事実は変わらないと思う。
完全に削除って表現が微妙だな。デストラクタが呼ばれなくなるわけじゃなくて
呼ばれるタイミングがスコープから抜けるタイミングではなくて、GCのタイミングになるよ
という意味だよね。
…C++から離れてる。そろそろやめたほうが良さそうだ。名無しに戻ります。
248:デフォルトの名無しさん
04/06/21 22:50
>>235
一般論としてGC付のが速いって言うなら
理屈はいいから実際のベンチ出せといいたい。
249:デフォルトの名無しさん
04/06/21 23:15
>>248
お前もGC無しの方が早いというならベンチ出せコラ
つか、どういうベンチプログラムならうまく計れるんだコレ
250:デフォルトの名無しさん
04/06/21 23:17
オブジェクトの生成と破棄(スコープアウト)をひたすら繰り返すベンチだな
251:デフォルトの名無しさん
04/06/21 23:20
計るんならゴミ回収遅延によるシステム全体の
ディスクキャッシュ効率の低下も考慮しとけって。
252:デフォルトの名無しさん
04/06/21 23:24
>●GCは、メモリが残り少なくなってきたときのみ実行されます。
>メモリに余裕があれば、プログラムは全速力で実行され、 メモリ解放に一切時間を取られません。
これを素直に読むと
GC有りのプログラムを多数常駐させると互いにメモリ圧迫しあって
パフォーマンスががた落ちになりそうに聞こえるわけですが
253:デフォルトの名無しさん
04/06/21 23:27
言語とは関係ないとはいえ、現実的に
メモリが不足しがちだとOSまで不安定になるしねぇ。
254:デフォルトの名無しさん
04/06/21 23:30
あとDのコンパイラの最適化ってどの程度やってるの?
もともとコンパイラ屋だから能力的にはできるんだろうけど
言語仕様決めてライブラリガリガリ書いてその上最適化もやるって無理っぽくない?
255:デフォルトの名無しさん
04/06/22 01:47
・メモリが不足したらGCが走る
・メモリが不足するとOSが不安定になる
ということは、これに
・論理メモリよりも物理メモリの方が小さい
をプラスすると
・GCが走るときはOSが不安定なとき
・OSが不安定になるまでGCが走らない
ってなことになるんじゃないかしら?
256:デフォルトの名無しさん
04/06/22 01:59
コンパイラ屋だけど、実際GCの方が総合的には速いと思う、
コンパイラ側が全部管理できればオプティマイザに特別なアプローチが出来るからね。
ただC++には似合わないと思う、最小限の機能強化でGCはライブラリにして今流のtemplateでエレガントに実装すべきだ!
と主張してみたかったりもする。
C/C++は、組み込みから汎用までいかなる環境にも耐えられる言語であって欲しいです。
言語本体は最小限の機能のみをもつ機械語翻訳機がいい。
ところでDはGCを自作で置き換えるとかできるのかな?
日に日に強力になってきているDに興味が沸きつつある今日この頃。
257:デフォルトの名無しさん
04/06/22 05:44
Cは恥かしすぎ
258:デフォルトの名無しさん
04/06/22 10:13
>>256
>総合的には速いと思う
GCの最適化で?それともコードの実行時最適化?
もっともC++でもそういう総合的に早くするって考えは
あるよね。例えばvectorにpush_backする時にサイズを
2倍ずつ増やすとか。C++erでもそういうトレードオフを
理解しないでSTLとか使ってる奴っているだろうし。
259:デフォルトの名無しさん
04/06/24 17:21
vectorが完全に連続したメモリを確保するのに対して、
dequeがブロック単位でしか連続したメモリを確保しない事を知らない香具師が多すぎ
260:デフォルトの名無しさん
04/06/24 17:25
突然なんだ?
261:デフォルトの名無しさん
04/06/24 17:29
で、ベンチはまだか?
262:デフォルトの名無しさん
04/06/25 00:25
>>259
バッファ用のバイト配列をvectorで確保すると
知らない人間は面食らうよね
263:デフォルトの名無しさん
04/06/25 01:43
C++の難しさって殆んどtemplateが占めてんじゃねーの?
と思ったら>>144みたいなのも居るのね。。。
264:デフォルトの名無しさん
04/06/25 10:04
vector v(x);
read(&v[0]);
なんてやるなら、素直にscoped_arrayや、
それが許されないならコピペや自作で対応した方が
見た目にも易しいし。
265:デフォルトの名無しさん
04/06/25 10:27
>>264
同意しかねる。
その用法はvectorの設計コンセプトに合致するものであり、何の不満も無いよ。
266:デフォルトの名無しさん
04/06/26 12:49
同じく同意しかねる。ただ不満はある。
C++の言語が難しくて聖書のようにあげられる代表的な数冊の本を
読破理解しないと使いこなせないような言語になっちゃうのは
見た目に直感的じゃないからと思う。
267:デフォルトの名無しさん
04/06/26 13:02
でも全体としての言語仕様の大きさはともかく、
すぐ上で挙げられている「テンプレート」や「STL」といった個々の要素に関しては、
習うより慣れろを地で行ってると思うよ。本はリファレンス的に使えばそれで。
268:デフォルトの名無しさん
04/06/26 14:42
C++の難しさは言語仕様よりも使用方法のノウハウの難しさのような気がする
個々はたいした事はないのに組み合わさったときの威力は大きく、それを利用するためだと思う。
template <typename H,typename T> struct TypeList
{
typedef H head ;
typedef T tail ;
} ;
と書かれれば、これがどんな定義なのかはC++をちょっと知っていれば判るが
これをどう活用するのかとなると急に難しくなる。
分りやすい書籍を作るのに従来通りの言語仕様の本とライブラリの本だけでは補えない部分があるのに
その部分を上手く解説した本はあまり無い気がする。
269:デフォルトの名無しさん
04/06/26 15:16
>>268
それ、発想が Lisp 的なんよね。
Lisp 知ってる人からすると、そのコードも見ただけで何がしたいかすぐ分かる。
template を使ったメタプログラミングって関数型言語と似てるらしくて、
Lisp 的表現が良く使われる。
270:デフォルトの名無しさん
04/06/26 15:29
実際のコードは逐次処理的にかいてTypeList等で
それらのコードを組み合わせる構造を記述して
GenScatterHierarchy等で実際にコードを組み合わせて
実装を生成する。
関数型言語だと構造だけでなく実際に実行されるコードも
関数型っぽく記述しなきゃいけないってのが、慣れてない人間
にとっては厳しい。
そういう意味でC++でのMPっての有難いんだよな。
271:デフォルトの名無しさん
04/06/26 21:29
馬鹿は馬鹿なりの使い方すればいいし、
頭いい奴は頭いいなりの使い方すればいい
ってだけの話なんじゃないの?
272:デフォルトの名無しさん
04/06/26 21:40
>>271
両者が一緒にいるときはどうしたらいいのでしょう。
273:デフォルトの名無しさん
04/06/26 22:12
一番はバカにコードを書かせないで頭いいヤツに全部かかせることかな。
そっちの方が早く、優秀なモノが出来るだろう。
274:デフォルトの名無しさん
04/06/26 22:21
根幹にあたる部分を、頭いい奴にザッと作らせる。
頭悪い奴には、ただひたすらそれを使うか、応用する部分を作らせる。
プログラミングに限った話じゃないがナ。
275:デフォルトの名無しさん
04/06/27 02:40
>>272
ベアプログラミングで鍛えるべし。
勉強するきないやつなら、いじめるべし。
276:デフォルトの名無しさん
04/06/29 15:53
ネタふり
C++のグローバル変数初期化タイミングは難しすぎ。
dynamic initilizationなグローバル変数にいたっては
main前に呼ばれることすら保証されてない。
dynamic initilizationなグローバル変数の初期化の
スレッド安全性とか考えると頭痛くなる。
また、main前の初期化順序もある程度は制御したい。
翻訳単位のモジュール性を向上させる意味でも。
こればっかりはjavaが羨ましいよ...。
277:デフォルトの名無しさん
04/06/29 17:37
グローバル変数使うなよ
278:デフォルトの名無しさん
04/06/29 17:46
データメンバ ≒ グローバル変数
279:デフォルトの名無しさん
04/06/29 17:54
Cをやってきた人はC++が出来ないと嘆く人が多いですよね?
自分はC++から入ったんでCの理解はさほど困らなかったんですが、
教授でもそういう人が居ますよ。駄文失礼しました。
280:デフォルトの名無しさん
04/06/29 17:57
出来ないんじゃなくてやる気が無いだけだろ。
CとJavaがあればC++いらないし。
281:デフォルトの名無しさん
04/06/29 19:19
>>279
多い?そんなに聞かないけど。。
プログラムスタイルの違いに始め戸惑うだけじゃない?
282:デフォルトの名無しさん
04/06/30 00:13
>>281
現場では意外に多いよ。テンプレートや継承を勉強せずにいきなりソース見るから理解できるわけもないんだけど。
283:デフォルトの名無しさん
04/06/30 04:34
>>276
そういうのは処理系依存になる事も多いね
#pragma で明示的に指示できる処理系もあるよ
組み込み向けでは、コンパイラメーカーにリクエストだすと機能追加してくれる事もあるし
判り難い標準仕様よりも、そっちに頼っていたりする事が多いです。
284:276
04/06/30 10:14
>>283
確かに、処理系依存では有るけど・・・。
言語内でそういうのを保証しようとするとstaticなlocal変数とか
利用する羽目になるけど、スレッド安全性とかコストとかの問題も
あるし。main先頭でいちいちリソース初期化等の処理を書くってのも
モジュール性の観点から考えるといまいちな気がするしなぁ。
285:デフォルトの名無しさん
04/07/02 00:35
>>279
C++よりもCのほうが難しいだろう。
C++なら簡単にできたことがCだといくつかの要素に還元せねばならず、
しかも全部横並びの関数になるため凝集度が低くなってしまう。
あとからメンテするのが大変。
C++を極めた人間のC++ソースと
Cを極めた人間のCのソースなら
前者のほうが分かりすい。
286:デフォルトの名無しさん
04/07/02 00:39
>>285
ソースの分かりやすさと言語の難しさは違うと思われ。
287:デフォルトの名無しさん
04/07/02 22:26
>>282
ヴァカみたいにテンプレートや継承使いまくってるタコソースなんか見る気がしないということでは ?
288:デフォルトの名無しさん
04/07/03 01:27
>>285
C++で本格的にプログラムを書いた事が一度もありませんね?
289:デフォルトの名無しさん
04/07/03 09:06
>>288
煽っているつもりだろうが、それはむしろ逆だろ、本格的に書けばC++の方がやさしい
C++の言語仕様は厄介だから、ちょこっと書く分には難しい。
変な煽りはヤメレ
290:デフォルトの名無しさん
04/07/03 23:43
>>289
別に、C++でも、C風に書くこともできる
291:デフォルトの名無しさん
04/07/04 04:21
おじさんはextern "C" {}のトリコ
292:デフォルトの名無しさん
04/07/05 02:14
C++の仕様準拠率がもっとも高いコンパイラって、
現時点では何になるのでしょうか?
もしかしたらスレ違いかもしれないけど、
これだけ「難しい言語」だと
仕様に準拠するのも大変そうだなぁということで…。
293:デフォルトの名無しさん
04/07/05 14:53
準拠度そのものを比較したってのは知らないけど、
Boostのレギュレーションテストは参考になるね。
URLリンク(boost.sourceforge.net)
294:デフォルトの名無しさん
04/07/05 18:25
本格論議はよくわかんないけど、std::map なんかがやっぱり便利だから、
よく初心者の勉強用に用いられる「単語の出現頻度を調べよ」みたいな
プログラムは、C の場合より著しく簡単になるよね・・・
295:デフォルトの名無しさん
04/07/10 14:16
>>282
それはソース云々より設計がタコ
どんな言語で書いてもタコはタコ
まC++はタコさ加減が露呈しやすい言語ではあるが
VBなんかだとみんなタコだからカモフラージュになるしな
タコじゃないほうが浮いて目立って困る
296:デフォルトの名無しさん
04/07/10 14:20
295=タコじゃないつもりのタコ
297:デフォルトの名無しさん
04/07/10 16:32
いきなり設計云々が出てくる辺りがとっても蛸。
298:295
04/07/10 18:48
>>287と>>282を間違えたあたりがタコorz
299:デフォルトの名無しさん
04/08/07 19:46
言語仕様がタコなC++の時代は終わった
これからはtemplateを使う必要がないJavaの時代です
300:デフォルトの名無しさん
04/08/07 19:50
>>299
ウゼーあげんなボケ 程度の低い釣りは秋田
301:デフォルトの名無しさん
04/08/08 01:33
>>293
やっぱりboostなんて使えないってことかな。
302:デフォルトの名無しさん
04/08/08 01:34
>>301 意味がわかりません。
303:デフォルトの名無しさん
04/08/08 01:45
>>302
移植性が低いってことでは
304:デフォルトの名無しさん
04/08/08 09:08
boost が使えなくて泪目で boost なんて必要ないんだぁぁぁっ
て事ですな。
305:デフォルトの名無しさん
04/08/11 03:38
>>299
>templateを使う必要がないJavaの時代です
1.4でがんばってね。
306:デフォルトの名無しさん
04/08/12 06:24
現場だと継承、テンプレート一切使わないってこと多いな。
テンプレートなんてそんな難しいか?
boostはともかく、STLと簡単なテンプレートぐらいなら誰でも理解できるだろ?
テンプレートが難しいってのは、一部の天才が作った
ジェネリックプログラムとかのこと?
307:デフォルトの名無しさん
04/08/12 06:55
サイズが10倍になるのでプロの現場では使われません。
308:デフォルトの名無しさん
04/08/12 07:00
テンプレートが難しいんじゃなくて、テンプレートを使って書かれたコードに、
テンプレートパラメータの名前省略されたものが多かったり
traitsとかpolicyに分解されてコードが細切れの散り散りだったり
その上、#ifdef等で切り刻まれていて全体像を把握しづらいコードが多いというだけのこと。
309:デフォルトの名無しさん
04/08/12 07:38
そりゃぁセンスのない奴が書けばテンプレートに限らずね。
>>307
仮令10倍であっても作業効率が上がるのであればプロだからこそ使いますが。
#サイズ云々する現場なんて寧ろ限られるって。
310:デフォルトの名無しさん
04/08/12 17:09
DinkumwareのSTLはセンスの無い奴が書いたのか?
311:デフォルトの名無しさん
04/08/13 05:03
C++の仕様はセンスの無い奴が書いた
312:デフォルトの名無しさん
04/08/14 01:18
>>310
コンパイル時のリソース消費を少しでも軽減するためらしい。
あとは、真似防止か。
313:デフォルトの名無しさん
04/09/03 12:27
Loki を理解するよりも、STL のソースを読むほうが難しいと思う。
314:デフォルトの名無しさん
04/09/03 13:54
実装によるだろ(ry
315:デフォルトの名無しさん
04/09/04 23:55
>>313
じゃあ、M$版の奴。
316:デフォルトの名無しさん
04/09/06 13:52
C++使えると豪語する奴=本当はCしかできない低脳
スレリンク(prog板)
317:デフォルトの名無しさん
04/09/06 22:56
漏れはC++よりもVBが難しい
318:デフォルトの名無しさん
04/09/08 11:03
C#やっとけ。嫌ならDやっとけ。嫌なら(ry
319:Ruby!!
04/09/08 17:09
Ruby!!!!!!!!!!!!!
320:デフォルトの名無しさん
04/09/08 19:10
C++って使いどころがない。
for_eachとかいつ使うんだこんなの、forの劣化版でしかない。
321:デフォルトの名無しさん
04/09/08 20:10
例の「ほげ言語のパラドックス」の意味がよくわかるねw
322:デフォルトの名無しさん
04/09/08 22:51
>>302
inline
323:デフォルトの名無しさん
04/09/08 23:25
>>320
お前、あれだろ。車を「こんなの地球温暖化の原因になるだろ」って難癖つけて
乗らないだろ。
324:デフォルトの名無しさん
04/09/08 23:44
車と地球温暖化って?
なに言っての、このボンクラ
どこかで聞きかじったのかしらん?w
325:デフォルトの名無しさん
04/09/09 00:47
車と地球温暖化の二つの単語から
「聞きかじった」とかいう発想が出てくるのが凄いw
「なに言っての」のあたりといい、かなり必死なようで。
理由はわからんが。げらげら
326:デフォルトの名無しさん
04/09/09 01:29
↑またまた新手の厨が出現w
327:デフォルトの名無しさん
04/09/09 01:30
>>325ってきっと、偉そうなこと言っときながら、GUIなPCしか触ったことないんでしょうね。
DOS時代を知らないんだな、こういう香具師。
328:デフォルトの名無しさん
04/09/09 02:02
悔しいからって二つも書かなくていいぞ、324w
329:デフォルトの名無しさん
04/09/09 03:01
C++は使いまくりだろ。俺はCの方がよく使うけど。
一番使うとこがないのはRubyとJava。
330:デフォルトの名無しさん
04/09/09 03:35
言うまでも無いけど、仕事によって使用頻度が違ってくるからなあ。
普通は使わない言語の方が多いだろ。
逆に、まんべんなく使用するとなったら、それ部署たらいまわしにさ(ry
331:デフォルトの名無しさん
04/09/10 22:07:23
Java言語仕様も包含してC+++ つーのはどう?
えーい、こうなったら、VBやDelphiも許してしまう
てんこもり言語「C+++++」のお出ましだ!
・・・もうマニアしか使えねぇな
332:デフォルトの名無しさん
04/09/10 22:21:24
class C+++++: public C++, public Java, public VB, public Delphi, protected C#;
333:デフォルトの名無しさん
04/09/10 22:26:06
最強言語Ruby!!!!!!!!!!!!!!!
334:デフォルトの名無しさん
04/09/10 22:46:31
class 最強言語: public C+++++, private Ruby;
335:デフォルトの名無しさん
04/09/11 13:34:55
>>332-334
(゚Д゚ );;; <スゲェ・・・
336:デフォルトの名無しさん
04/09/11 13:39:36
private Rubyという言葉に笑った。
言いえて妙
337:デフォルトの名無しさん
04/09/11 14:07:08
C++って、何でもできるのがいいよね。
ビットフィールドとか共用体をCから引き継いでるから
エンベディッドのきつい環境でも、メモリを節約しつつ
ある程度見やすく書けるし。
メンバ関数ポインタを配列に突っ込んだりやりたい放題。
一人で組むんなら最高の言語だよ。
338:デフォルトの名無しさん
04/09/11 15:32:40
>>337
>一人で組むんなら
人数が何か関係してるのか?
339:デフォルトの名無しさん
04/09/11 19:22:16
>>338
多人数で組むなら、あんまりトリッキーなコードは書けないじゃん。
それならJavaでも大差ない。
340:デフォルトの名無しさん
04/09/12 00:43:44
俺、最近<boost/preprocessor.hpp>の利用による繰り返し処理を勉強中何だけど
もしかして、これって、perlなどの言語でちょちょいと書いて、出力して、コピペ
したほが可読性の面からもいいんじゃないかと気づいてしまったんだけど
まだまだ理解が足りないというかとなのかな。
341:デフォルトの名無しさん
04/09/12 01:32:06
C++ってそんなに難しいか?
STLが超便利でCなんてやってらんない体になってしまった
342:デフォルトの名無しさん
04/09/12 02:08:55
>>341
幸せな時期だね。
343:デフォルトの名無しさん
04/09/12 05:17:05
286上のQuick C、MASMの時代からC、C++一筋で趣味、仕事でやってきて
他の言語はいらないとまじめに思ってたんだが・・・最近、C#をCつながりで
やってみるかと覗いてみたら・・・もうC++の時代は終わりかもしれんな。
C++を身につけた人間があえて乗り換える必要はないが、新人にC++を教えたり
薦めたりする気はなくなったよ。これからやる人はC#やった方が良いな。
.NET→WinFXと進んでいこうとするならなおさらだな。
344:デフォルトの名無しさん
04/09/12 05:55:31
URLリンク(www.square-enix.co.jp)
小さすぎて見えんがな('Д`)
112 名前:名前が無い@ただの名無しのようだ :04/09/09 21:07 ID:s4msPAUO
URLリンク(www.ffcompendium.com)
URLリンク(www.ffcompendium.com)
345:デフォルトの名無しさん
04/09/12 17:33:17
>>343
C#は絶対にC++は超えらんないと思うよ
C#って実質Windowsでしかつかえねーじゃん
WindowsでもDLL内の関数なりクラスを使うとなると
面倒だし・・・
挙げだすと枚挙に暇がない
WindowsではVC++&MFCこれ最強
ま ち が い な い!
346:デフォルトの名無しさん
04/09/12 18:51:02
オトトイ、キ・ヤ・ガ・レ!
347:デフォルトの名無しさん
04/09/12 19:26:19
Windows + C言語のみでMFCも使わずWin32APIネイティブ。
自分でWinProcからMSGをディスパッチしる! <これ最強。
348:デフォルトの名無しさん
04/09/12 20:10:59
>>345
> C#は絶対にC++は超えらんないと思うよ
それはそうなんだ、言語の汎用性という意味からするとあなたの言ってる事は
非常に正しいんだ。
> C#って実質Windowsでしかつかえねーじゃん
これもまさしくそうなんだ。
でも、仕事って、まぁ俺の場合はそうなんだけど、9割方Win絡みなんだよね。
でもって、次の世代のWindowsが06年に出るかどうかは別として何時か、近い
将来は必ず出るんだよね。で、そのWindowsからはWin32Apiはネイティブじゃなくて
WinFXでエミュレートされるんだよね。となると、これから始める人があえてwin32api
に精通する必要はなくなるんだよなぁ。むしろ、今は.NETのクラスライブラリの使い方
に精通した方が良いと言える。
> WindowsではVC++&MFCこれ最強
> ま ち が い な い!
現行ではね。Win32Apiがその存在意義を失うであろう、ここ2~3年の間わって話し
だよな。OSのネイティブAPIがWinFXのクラスライブラリになれば話しはがらっと変わるよ。
まぁ、ハードに近い分野をMSがどうやってクラスライブラリにのっけてくるか、お手並み
拝見だけど、.NETの最適化も1.1→2.0βで大幅に進んでるからね。画像処理のコードを
1.1と2.0βで同じようにコンパイルしたら5倍ほど速度アップしてた。1.1上で約16秒
要してた処理がコンパイルし直すだけで3秒程で終わるようになってたからね。
ただ、間口を広げるという観点からは他のプラットフォームでも使えるC&C++を知っとく
ってのは悪くないとは思うけどね。
349:デフォルトの名無しさん
04/09/12 21:27:02
じゃあ、その画像処理処理コードをC++で書き直してみたら?
C#がC++を凌げない答えがそこにあるから。
350:デフォルトの名無しさん
04/09/12 21:27:08
>>348
> まぁ、ハードに近い分野をMSがどうやってクラスライブラリにのっけてくるか、お手並み
> 拝見だけど、.NETの最適化も1.1→2.0βで大幅に進んでるからね。画像処理のコードを
> 1.1と2.0βで同じようにコンパイルしたら5倍ほど速度アップしてた。1.1上で約16秒
> 要してた処理がコンパイルし直すだけで3秒程で終わるようになってたからね。
ま、まじっすかそれ?
351:デフォルトの名無しさん
04/09/12 21:52:58
>>349
やりましたよ。C++だと.3秒で終わりました。テスト用に作ってる
画像処理用ライブラリなんですけどね。巨大なサイズのビットマップを
読み込んでフィルタ処理するって奴です。
現行だとC++の方が10倍程速いですね。しかしですね、ここが大きな問題
なんですが、C#でもbitmapクラスを使わずにそのままメモリに展開して
ポインタ使ってアクセスすると.4秒程度で終わってしまうんですね。ファイル
読み込みにはもちろん.NETのクラスライブラリを使用してます。
個人的にはC#でunsafeなコードを書くのは邪道だとは思うんですが、やろうと
思えば問題ないって話ですね。dll呼び出しするほど手間でもないですし。
インラインアセンブラ使うような感じですね。となると話しはややこしくなってきます。
C#に対するC++の現行での利点は、
・ポインタを駆使出来る。
・win32apiへのアクセスが容易である。
・ネイティブコードを吐ける。
とまぁ既存のライブラリ資産の問題を抜きにすればこんなところです。後ろの2つは
ここ2~3年で利点でもなんでもなくなってしまう訳です。で、1つ目に関してもボトル
ネックとなるような肝い部分ではC#でも問題なく使用出来る、となればほとんど差は
なくなってしまうんですね。やはり考え込んでしまいますね。ただ、プロジェクトの規模
が非常に大きくなってきた時のGCの挙動というのがどの程度パフォーマンスに影響を
与えるのか現時点では読めません。コードでの工夫のしようはありますが、最終的には
VM任せですから。まぁこのあたりもMSが最適化していくような気はしますが。
一つはっきりしときたいのは私はC++を否定するつもりは毛頭ありません。ただ、スレタイ
にもあるとおり「C++は難しすぎ」と感じる人がいるのだとすれば無理して今から覚える
必要は、Win上での開発を念頭に置いているのなら、ないんじゃないかなと思っただけです。
>>350
ほんとです。ソースはそのままコンパイルやり直しただけでその程度のパフォーマンスの
向上が見られました。βがとれた時はそれなりに期待しても良いのかなという気にはなり
ましたね。
352:デフォルトの名無しさん
04/09/12 22:14:50
俺はc#がVBSのような運命を辿るような気がして成らないんだけど・・・
353:デフォルトの名無しさん
04/09/12 23:16:22
> C#に対するC++の現行での利点は、
> ・ポインタを駆使出来る。
> ・win32apiへのアクセスが容易である。
> ・ネイティブコードを吐ける。
C#はどれもできるぞう。
ところで、最初のはあんまりうれしくないなあ。
354:デフォルトの名無しさん
04/09/12 23:23:24
Ruby最強言語
Ruby!!!!!
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>> Cω
355:デフォルトの名無しさん
04/09/12 23:59:55
>>353
脊髄反射?
ポインタ使える事は >>351 も知ってるようだぞ?
ポインタは確かにアレなんだけど、本流になるには絶対必要だと思うね・・・残念ながら。
Native 呼び出しはモノによっては結構面倒。単にアクセスの容易さだけなら C++ のが当然上だよ。
確かに普通の Win32 API はそれほど面倒なのに突き当たった事はないけど、
COM だとラッパー作るのが大変なの多いね。TLB とか無い場合は。
もちろん JNI みたいなのよりは全然マシだけど。
それから、C# で直接ネイティブコードは吐けないんじゃない?
インストールしたマシン上で変換はできるけど。
356:デフォルトの名無しさん
04/09/13 00:10:56
まぁ何にせよ楽なのはC#だわな。
別に両方使えれば問題ないさね。適材適所。
357:デフォルトの名無しさん
04/09/13 01:36:37
>>355
本流ってよくわからんが、洗練されたC++コードにはポインタは登場しないよ。
ポインタが飛び交うなら、それはC++の顔をしたCだと思う。
358:デフォルトの名無しさん
04/09/13 01:38:54
っつうか355みたいなのは若い(よね?)ならいいけど
年くってたらヤバいと思いなされ。
359:デフォルトの名無しさん
04/09/13 01:47:40
>>358
何か言いたいならはっきり言えよ
360:デフォルトの名無しさん
04/09/13 02:06:50
>>357
それはおまいがC++が書けないからだよ w
361:デフォルトの名無しさん
04/09/13 02:13:48
>>357
すまん。自分はポインタつかいまくり。
スタックに積むオブジェクトとヒープに確保する
オブジェクトは明確に区別している。
それでヒープに確保するためのオブジェクトはどうしても
ポインタになる。スマートポインタはつかっているけど
生のポインタのほうが適切だと思う場所もあるので
それで生のポインタをつかっている。
362:デフォルトの名無しさん
04/09/13 09:04:59
>>361
> 生のポインタのほうが適切だと思う場所もあるので
そういう場所がほとんどなくなるのが、最近のC++のやりかただと思うのよ。
特殊な例を特長なんかにしないほうがいいよ。
363:デフォルトの名無しさん
04/09/13 14:18:22
>>362
どうやって?
364:361
04/09/13 16:54:41
自分の場合、ヒープに確保するタイプのインスタンスは
以下のような管理の使い分けをしている。
(依存、関連、集約、コンポジションぐらいは理解しているよね)
[依存]
ケース1 :
あるメソッドローカルでつかわれるインスタンスで
メソッドをぬけるとインスタンスが不要になる場合。
auto_ptrかscoped_ptrをつかう。
ケース2 :
あるメソッドの引数として渡されるインスタンス。
渡されたインスタンスはそのメソッドの中でしかつかわれない。
この場合は生ポインタ。理由はインスタンスの寿命にメソッドは
関知しないためスマートポインタにする意味がない。
[単項関連]
ケース1 :
格納するクラスがインスタンスの寿命の管理をしないといけない場合。
この場合はauto_ptrかscoped_ptrかshared_ptr。
ケース2 :
格納するクラスがインスタンスの寿命に関知しない場合。
この場合は生ポインタかweak_ptr。
365:361
04/09/13 16:55:34
[集約]
基本的な方針は単項関連と同じ。集約のコンテナにはSTLコンテナ
をつかい、スマートポインタをつかう場合にはshared_ptr
(これじゃないとコンテナに格納できないから)をつかう。
[コンポジション]
問答無用にSTLコンテナ+shared_ptr。
こんな感じ。依存のケース2のような場合はスマートポインタを
つかう意味がないし、別に特別なケースでもなくてよくあるんだけど。
366:デフォルトの名無しさん
04/09/13 17:01:42
洗練されたC++の流儀とは、boostを使う事だったようです。
最近使えるようになったんでしょうね、うれしくてたまらないみたいです。
367:デフォルトの名無しさん
04/09/13 17:08:53
↑Boost分かってない香具師の僻みキタ━━━(゚∀゚)━━━!!
368:デフォルトの名無しさん
04/09/13 17:17:20
標準がしょぼいせいでいろんなもんが乱立する事態になってる
369:デフォルトの名無しさん
04/09/13 17:23:25
なんたらptrとかほにゃららptrとか確かにウザィよね。
ライブラリレベルでやるもんじゃねえよ。
370:デフォルトの名無しさん
04/09/13 17:29:55
>>367
と言う事にしたいのですね。
自分の場合とか言いながら、長々と何を言うかと期待すれば
boost入門ページの最初の方に書いてある事を書いてみただけ。
ヤレヤレ
そんな事はboostの名前を知ってるような人間は誰でも(活用しているかはともかく)承知している事で、
それでもあえて生ポインタを使っているケースは多々あるのに、それを否定するだけの説得力(代案)が
先の文章には無い。
371:デフォルトの名無しさん
04/09/13 17:37:11
とりあえず否定だけしてみて自分の意見は無い香具師キタ━━━(゚∀゚)━━━!!
372:361
04/09/13 17:44:29
だからスマートポインタ最大限に利用したとしても
生ポインタをつかうケースがあるって例をあげてみた
んだけど。
>そんな事はboostの名前を知ってるような人間は誰でも
>(活用しているかはともかく)承知している事で、
>それでもあえて生ポインタを使っているケースは多々あるのに、
>それを否定するだけの説得力(代案)が先の文章には無い。
361の発言みれって。自分も生ポインタつかいまくりだって。
373:デフォルトの名無しさん
04/09/13 18:01:12
>>372
使いまくったらダメだろw
374:デフォルトの名無しさん
04/09/14 00:56:19
>>364
依存のケース2で生ポインタ使ってるところは参照が適切だと思うが、いかがか?
375:デフォルトの名無しさん
04/09/14 00:58:55
話の途中で悪いが、今の「ポインタを使いまくる」の意味は、
自力でnew/deleteしまくるって意味だよな?
376:デフォルトの名無しさん
04/09/14 00:59:47
>>375 ちがうだろう。
377:デフォルトの名無しさん
04/09/14 00:59:58
void******** (********a)(void******** (********)(void********));
なんて普通に使ってますが、何か?
378:361
04/09/14 01:19:12
>>374
ヒープに確保するオブジェクト限定の話なので、生ポインタです。
個人的にヒープに確保したインスタンスの参照をとるのは
抵抗があるかな。
たしかにスタックに積むオブジェクトや構造体ならむしろ参照の
ほうが望ましいと思います。
379:デフォルトの名無しさん
04/09/14 01:49:54
>>378
その抵抗には何か根拠がある?
まるで意味の無い区別だと思うが。
ヒープ上の(動的)オブジェクトを引数に取る関数と
スタック上の(自動)オブジェクトを引数に取る関数とで
オーバーロードでもするつもりか?
380:デフォルトの名無しさん
04/09/14 02:44:40
いつのまにかスレタイに沿った話題になってる
381:デフォルトの名無しさん
04/09/14 02:47:18
>>375
「生の」な。
生のポインタを渡したり、受け取ったり、コピーしたり、
インクリメントしたり、引き算したり、足し算したりすることかなあ。
そういうCみたいなコードはさすがにメンテするのも疲れる。
382:デフォルトの名無しさん
04/09/14 02:48:46
それはおまいが`使えない'香具師だからだYo
383:デフォルトの名無しさん
04/09/14 02:50:29
む、「Cみたいな」は禁句か?
384:デフォルトの名無しさん
04/09/14 04:32:03
>>382
話についていけないお馬鹿さんが
無視して書き込まなくてもいいのでは? ;-)
385:デフォルトの名無しさん
04/09/14 05:22:30
無視して書き込む? ;-)
386:デフォルトの名無しさん
04/09/14 07:03:25
つーかね、
システムコールがiteratorに移行しない以上、
ポインタ(アドレス渡し)は永遠に不滅です。
387:デフォルトの名無しさん
04/09/14 09:05:47
システムコールなんてwrapされる最たるもんだろ
主パスの処理にシステムコールが出てきたりするなら、C以前だなそりゃ
388:361
04/09/14 09:53:58
>>379
設計の段階でヒープに確保するオブジェクトとスタックに積む
オブジェクトは「明確に区別している」ので、同じクラスの
インスタンスがヒープに確保されたりスタック積んだりとまちまちに
なることはないので、オーバーロードする必要はない。
クラスによってヒープに確保かスタックに積むかが決定している。
ヒープに確保するオブジェクトの例をあげればポリフォーリズムが
必要なクラス、スタックに積むクラスは通貨型やベクトル型、
複素数型、クォーターニオンなど。
C++ではオブジェクトをヒープで確保することを強制できないので
とりあえずコピーコンストラクタや代入演算子をprivate属性に
するぐらいはやっているが、最終的にはドキュメントに書いている。
Compositeパターンのように子ノードの削除の責任が親ノードにある
場合、delete演算子かスマートポインタで破棄するんですが、
これがスタックにつまれていると親ノードの都合で削除できない
ので問題になる。こういうのは仕様できっちりきめるしか
回避方法がないのはC++の欠点だと思っている。
...というか、こういうガイドラインって一般的ではないのかな。
とりあえずつかいわけとしてはC#の値型と参照型に近い
感じなんですが。
389:デフォルトの名無しさん
04/09/14 10:15:27
>>388
> 設計の段階でヒープに確保するオブジェクトとスタックに積む
> オブジェクトは「明確に区別している」ので、同じクラスの
クラスを使う側のローカルな操作なら自分の決定を前提とできるだろうけど、
クラスや関連関数を提供する側では、どちらに確保されるかと言う前提は持てないだろう。
> ヒープに確保するオブジェクトの例をあげればポリフォーリズムが
"polymorphism" な。
> C++ではオブジェクトをヒープで確保することを強制できないので
コンストラクタを protected にして、ヒープに確保するstaticな
生成関数を用意すればできるよ。
> これがスタックにつまれていると親ノードの都合で削除できない
> ので問題になる。こういうのは仕様できっちりきめるしか
> 回避方法がないのはC++の欠点だと思っている。
他の言語なら仕様でキッチリ決めないで回避できるの?
> ...というか、こういうガイドラインって一般的ではないのかな。
> とりあえずつかいわけとしてはC#の値型と参照型に近い
C#は詳しくないけど、それを表したいなら、
C#:値型 → C++:メンバを並べたクラス型
C#:参照型 → C++:実装へのスマートポインタひとつをメンバに持つクラス型
こんな感じの対応付けにならないか?
390:361
04/09/14 10:40:07
>"polymorphism" な。
すんまそん。typoです。マジで恥ずかしい。
>コンストラクタを protected にして、ヒープに確保するstaticな
>生成関数を用意すればできるよ。
そういえばそうだった。忘れていました。
C#だと構造体は必ずスタックにつまれる(ボキシングするとヒープに
移るけど)し、クラスはヒープに確保される。まあC#の場合はも
ともとGCがあるからインスタンスの破棄のことは考えなくていいんだけど。
391:361
04/09/14 11:13:37
>C#:参照型 → C++:実装へのスマートポインタひとつをメンバに持つクラス型
これって俗にいうHandle-Bodyだよね。これも設計ポリシーによってはアリですね。
昔の(今は知らん)xerces-cもそうだったような覚えがある。
392:デフォルトの名無しさん
04/09/14 14:17:40
横槍ですが...
>>388
>Compositeパターンのように子ノードの削除の責任が親ノードに
>ある場合
むしろ私の場合は、Compositeパターンによる関連性と寿命管理を
分離する設計が殆どです。Compositeパターンにより関連付けられた
オブジェクト群を利用するオブジェクトと同じ寿命を持った
オブジェクトを用意し、それに保持させるって感じです。
そういった意味では、ライブラリがクライアントの用意するオブジェクト
の寿命を管理する設計よりも、ライブラリはあくまでもそのオブジェクト間の
関連性だけを利用するようにし、その関連性の利用期間を外部に通知できる
ようなインターフェースを用意します。オブジェクトの寿命が本質的に
あいまいな場合のみshared_ptrを使いますが、稀なような気がします。
393:361
04/09/14 14:48:48
>むしろ私の場合は、Compositeパターンによる関連性と寿命管理を
>分離する設計が殆どです。Compositeパターンにより関連付けられた
>オブジェクト群を利用するオブジェクトと同じ寿命を持った
>オブジェクトを用意し、それに保持させるって感じです
イメージとしてはFlyweightのようなオブジェクトプールを
つかうって感じでしょうか?ちがったらすみません。
一応、GoFの本を確認したところ「component を削除するのは誰か」
という段落で「通常は親ノードが子ノードを削除するのが最もよい」
とは書いてありますが、そうでなければいけないとは書いてないですし、
例外のケースもあげられています。
>あいまいな場合のみshared_ptrを使いますが、稀なような気がします。
個人的にもshared_ptrをガーベージコレクションのかわりに
つかうことは殆どないです。thisポインタ問題(shred_ptrの
thisポインタはスマートポインタで管理されていない。
一応回避策はありますが)や循環参照でメモリリークが
発生したりするので意外とつかいにくいです。むしろ
コンテナに入れることができる唯一のスマートポインタ
というつかいかたが多いです。
クライアントが生成したインスタンスをライブラリ側で
寿命を管理する必要があるかどうかは議論の余地がありますね。
394:デフォルトの名無しさん
04/09/14 14:49:56
とりあえず、俺に責任は無い。
395:デフォルトの名無しさん
04/09/14 23:50:16
C++でポリモーフィズムを使う時って、ヒープに実態確保して、ポインタ使うしかないの?
396:デフォルトの名無しさん
04/09/14 23:56:41
スタックに確保して参照を使うのもアリです。
397:デフォルトの名無しさん
04/09/15 01:24:57
で、361よ。
> 個人的にヒープに確保したインスタンスの参照をとるのは
> 抵抗があるかな。
これは具体的な根拠があるわけじゃない、ってこと?
398:361
04/09/15 12:58:23
ヒープに確保したインスタンスを参照にすると削除するときに&演算子で
ポインタに戻してやらないといけないのと、スマートポインタをつかう
ことも多いので、参照をつかっているところとスマートポインタを
つかっているところで表記がまちまちになって好きじゃない。
一貫性のある表記が好きという個人的な好みの問題。でも本当に
わざわざヒープに確保したインスタンスを参照にする人って
いるの?
ポリモーフィズムは別にスタックに確保したオブジェクトでも
できるけど、スタックに確保しちゃうとインスタンスの寿命の
管理の自由度が下がる。それにスタックに確保しちゃうと
Factoryメソッドのようなメソッド内部で生成したインスタンス
をメソッドの外部に提供するときにコピーコンストラクタが
必要になるのでそういうときに困る。例えばオブジェクトが
ビットマップのような巨大なデータをもつ場合、コピーコン
ストラクトのコストは大きいし、コピーコンストラクタを
書くのが難しいオブジェクトもある。なので必要のない
コピーコンストラクタはprivateにして使用禁止にして
つかわないようにしている。巨大なデータを持つオブジェクトは
前にもいった人がいるようにHandle-Bodyなんかでもいい
(実際にHandle-Bodyをつかっていたり、文字列クラスなんかは
CopyOnWriteをつかっている実装も多い)が、自分はHandle-Bodyを
つかうスタイルではない。これもスタイルの問題。
399:デフォルトの名無しさん
04/09/15 13:42:11
>>398
どこを縦読みすればいいのですか?
400:デフォルトの名無しさん
04/09/15 14:16:46
ポリフォーリズムをポリホと略すスレはここです
401:デフォルトの名無しさん
04/09/15 17:20:36
| ポリフォーリズム の検索結果のうち 日本語のページ 約 7 件中 1 - 3 件目 (0.54 秒)
あるからびっくりだ。
402:デフォルトの名無しさん
04/09/15 19:32:31
全部同一人物?
403:初期不良
04/09/15 21:23:16
>>400
モーフィングとフォーミングを勘違いするなら分かるけど
フォーリングと勘違いするというのは飛んでるなと思う。
3カウント入れちゃうよ
404:361=別名ポリホ
04/09/15 21:35:53
だからマジtypoだって...。まだいりじるのか...。
本気で恥ずかしいんだからいじめんなよ。
405:361=別名ポリホ
04/09/15 21:36:44
>>いりじる
いじるの間違いだ。またtypo。もう嫌...。
406:デフォルトの名無しさん
04/09/15 21:38:17
ていうか、ポリフォーリズムをモリモーフィズムと間違えるのって恥ずかしすぎ。
407:デフォルトの名無しさん
04/09/15 22:06:55
イリジウムのことね
408:デフォルトの名無しさん
04/09/15 22:12:54
はずかしすぎ。
アンテナでかすぎ。
409:デフォルトの名無しさん
04/09/15 22:24:30
どうtypoったらそうなるのか分からん
410:デフォルトの名無しさん
04/09/15 22:47:57
typoだけに突っ込んでいる人は、
そうやって話をはぐらかそうとしている
厨房なので無視するべし。
411:374
04/09/16 00:56:53
>>394
なんか、どちらかに誤解があるようだな。
>>364の [依存]ケース2 で言っていることは、
たとえば「あるメソッド」foo について、
foo(T*);
というふうに引数の型として生ポインタを使うということじゃないの?
それに対して、
foo(T&);
のほうが適切ではないかと言う突っ込みを>>374で入れている。
これは引数の型の話で、確保したインスタンスを
保持するための型は関係ないと思うんだけど、
漏れが>>364を誤読しているの?
412:374
04/09/16 00:58:09
レスアンカー間違えた。
>>411 は >>398 宛てね。
413:361=別名ポリホ
04/09/16 08:34:22
>>414
何度も同じようなことを書いてすまんけど、
1.クラス設計時にヒープかスタックか決めている
2.ヒープに確保するオブジェクトは常に(スマートポインタを含めた)
ポインタとしてつかいたい
3.参照をつかわないのは参照とポインタが混ざって表記の揺れに
なるからという好みの問題
別に参照をつかっちゃまずいっていう決定的な理由はない。
設計ポリシーとしてメソッドの引数は一貫して参照をつかうの
であればそれはそれでいいんじゃないでしょうか?っていうか俺が
文句いうことじゃないけど。
逆にちょっと質問。setterのようなあるインスタンスを引数の値とって
それをインスタンス変数に保持するメソッドで、かつ削除の権限が
そのsetterを持つインスタンスにある場合、これも参照で渡すの?
そうだとするとどこかの段階で参照からポインタに変換しないと
削除できないような気がするんですが。それともこの場合は
特別にポインタで渡すんでしょうか?
414:361=別名ポリホ
04/09/16 08:38:54
すまんレスの先が411だった。
質問の意図は指摘しているところで参照をつかうと、
setterうんぬんのケースと一貫性を保とうとすると
無理がある場所がでるんじゃないかってことです。
415:374
04/09/17 09:34:20
>>413
最初に突っ込みいれた箇所(>>364の[依存]ケース2)では
「渡されたインスタンスはそのメソッドの中でしかつかわれない」状況となっている。
「インスタンス変数に保持するメソッド」なら状況が違うんじゃないの?
これらの異なる二つの状況の間で一貫性なんてあるはずがない。
生ポインタ使う場所の例として挙げられた箇所に
参照のほうが適切だと突っ込みいれたのに、
スマートポインタ使う場所を挙げて反論されても困る。
416:デフォルトの名無しさん
04/09/17 12:25:53
> 削除の権限が そのsetterを持つインスタンスにある場合
どういう状況だかよく分からんが、std::auto_ptrみたいなものを
作ろうとしてるなら、素直にコピーを作成したオブジェクトが責任を持って
オブジェクトを破壊すべきだ。
参照渡しされたものを受け取った側で破壊するのは、分かりづらい。
とりあえずスマートポインタ勉強してから出直せ。
417:デフォルトの名無しさん
04/09/17 12:56:51
漏れはリアルタイム画像処理をよくやるんだけど、
画像のピクセルデータにアクセスするときはなんとなく生ポインタ使っちゃうな。
あったり無かったりするものを引数にしたいとき、T* 型の引数にして 0 渡すと
「無し」みたいなこともたまにやるし。C# や Java のライブラリでも null 渡せる
メソッドは結構あるから、実装面ではポインタ型の使いどころはそこそこあるん
じゃねーの?
418:デフォルトの名無しさん
04/09/17 15:26:19
まあ、あれだ
参照渡しでもポインタ渡しでもコピー渡しでもなんでもいいけど、
参照剥しをするのは控えた方がいいな。
あとでdeleteするオブジェクトはポインタで保持しとけ。
419:ポリホ
04/09/17 17:46:25
>参照渡しされたものを受け取った側で破壊するのは、分かりづらい。
からポインタつかえっていってんだろ。
>「渡されたインスタンスはそのメソッドの中でしかつかわれない」状況となっている。
>「インスタンス変数に保持するメソッド」なら状況が違うんじゃないの?
>これらの異なる二つの状況の間で一貫性なんてあるはずがない。
状況が違うから一貫性がなくてもよいという判断なら別にいい。
自分はポインタにすると2つの状況で整合がとれるから好きなだけだ。
メソッドの引数はポインタうんぬんという話はヒープに確保した
インスタンスに限定の話だ。しかもコーディングスタイルの問題
だから人のことはとやかくいうつもりはない。
ヒープに確保したインスタンスの参照剥がしが好きじゃないといったら
根拠を求められるし、好きじゃない理由をいったらなぜか参照剥がしは
わかりずらいっていう謎のつっこみが入るし、わけがわかりません。
いったい自分にどうしてもらいたいんだろう。
420:デフォルトの名無しさん
04/09/17 20:42:41
>>411
foo を書いていて引数にnull 値のようなものを許したいとき、
foo(T*) にするか、foo(T&) にして T::Null を提供するかっていうと、
漏れはメンドクサイから大抵前者だけど。
421:デフォルトの名無しさん
04/09/17 21:28:32
>ポリホ
もうちっと日本語勉強しろよ
422:デフォルトの名無しさん
04/09/18 11:32:18
>>419
>いったい自分にどうしてもらいたいんだろう。
いじられ役に徹してくだちい。
423:デフォルトの名無しさん
04/09/23 02:34:10
とりあえずC++ではヒープではなく「フリーストア」って呼ぶんじゃなかったっけ?
まぁ、データメンバを「メンバ変数って呼んじゃダメなの?」くらいの勢いだけど。
424:デフォルトの名無しさん
04/09/23 22:05:22
int* a,b; と int* a; int* b; って違うんだな・・・
425:デフォルトの名無しさん
04/09/24 00:10:23
>>424
いや、それは違いすぎだから…。
両方ポインタにするなら
int* a, *b;
じゃないとね。
だけどこういう書き方になるから型の後にアスタを付けるスタイルは好きではない。
int *a, *b;
のほうが美しいじゃん。好みの問題かもしれないけど。
426:デフォルトの名無しさん
04/09/24 00:14:44
>>424
所詮C++はC言語のころの呪縛から逃れられてないのよ。
>>425
int* a;
int* b;
と2行に分けることを推奨。
427:デフォルトの名無しさん
04/09/24 04:48:24
>>426
>所詮C++はC言語のころの呪縛から逃れられてないのよ。
だがそれが(・∀・)イイ!!
というか、仕様変更するとコンパイルエラーが発生するレガシーコードが
混在してしまう可能性があるから仕方ないっしょ。
・・・レガシーという単語を使いたかっただけだ。気にしないでくれ。orz
428:デフォルトの名無しさん
04/09/24 08:39:01
int* をtypedefして違う名前を与える
さらにはintを変えられるようにtemplate化
429:デフォルトの名無しさん
04/09/24 09:23:41
C言語の型とは何か。
typedef int *iptr;
int *は ptr->int
iptrも ptr->int
int *[]はarray->ptr->int
int (*)();はptr->function as int
int *();はfunction as ptr->int
struct { int a,b;} *;はptr->struct{int a;int b;}
構造が同じなら互換性があると言う。
iptr a;
int *b;
a = b; // ok
しかし
struct { int x,y;} a;
struct { int x,y;} b;
b = a; // error '=' : 互換性のない型が含まれています。
これはいったい、どうしたことか。
430:デフォルトの名無しさん
04/09/24 10:25:14
>>429
b=a;
が
b.x=a.x;
b.y=a.y;
と同義であるとはいえない。
直感的にはそうであるが。
同義であるなら同義であるとoperator=なりで
コンパイラに教えなきゃわからん。
431:デフォルトの名無しさん
04/09/24 10:43:24
>>429
struct A { int x,y;} a;
struct B { int x,y;} b;
名前を省略しただけの扱いなんだろ。
別々の構造体で、たまたまメンバの並びが同じになっただけで代入ができたら困る。
432:デフォルトの名無しさん
04/09/24 11:45:46
C++スレでC虫臭い話を続けるな
433:デフォルトの名無しさん
04/09/24 17:58:58
>>424-425
こんな解決法もある。
typedef int *PINT;
PINT a, b;
434:デフォルトの名無しさん
04/09/24 18:03:42
それ終わってる。
とっくに。
435:デフォルトの名無しさん
04/10/07 00:13:22
>>429
基本的に別の型に代入はできない。当たり前だけど。Java だって C# だってそうでしょ。
typedef は単なる別名で、新しい型を作る訳では無いって、仕様で決まってますから。
436:デフォルトの名無しさん
04/10/26 17:24:17
メンバの並びが同じな別々の構造体を作る必要性はあるのか?
437:デフォルトの名無しさん
04/10/26 18:09:29
あたりまえ
438:デフォルトの名無しさん
04/10/26 19:18:18
>>436
「今はたまたま同じメンバだけど、将来的には拡張されるかも知れない」
ってことはありそう泣きガス
439:デフォルトの名無しさん
04/10/26 19:56:30
>>438
その場合、直接代入できる必然性はないよね。
440:デフォルトの名無しさん
04/10/27 11:48:39
>>439
ふむ。そりゃそうだ。
441:デフォルトの名無しさん
04/10/29 01:42:08
ふと思ったんだけど、構造体やクラスの(データ)メンバを
while文のようなループ文でくるくる回しながら順番に取れたら便利かも?
名前とか個数とかデータ型を意識せずにクルクル…。
そういうのってうまいこと出来ないかな?
442:デフォルトの名無しさん
04/10/29 01:46:03
>>441
意味が判らない
443:デフォルトの名無しさん
04/10/29 01:53:58
>>441
型の違うデータメンバのいったい何が取得したいのか? ってことだね。
たとえば各メンバの文字列表現が取得したいのなら
そのような関数を用意すればすむ。
444:デフォルトの名無しさん
04/10/30 03:34:49
うっ、わかりにくかったか…。orz 例えば擬似的なコードを書いてしまうと…。
struct TEST_STRUCT
{
int mInt;
long mLong;
char mChar[255 + 1];
};
void main()
{
vector<VARIANTのような型> dstArray;
^^^^^^^^^^^^^^^^^^^^^
TEST_STRUCT srcData; //適当に初期化済みの状態とする
int i = 0;
while( 1 )
{
dstArray.push_back( srcData.○[ i ] );
i++; ^^^^^^
}
}
こんな感じで、データメンバを「名前ではない方法」でアクセスできれば、
結構便利な使い方ができそうだなぁと思ったのでつ。
「○[ i ]」の部分って必ずデータメンバの名前で指定しなければならないから…。
dstArray.push_back( srcData.mInt );
dstArray.push_back( srcData.mLong );
…のように一つ一つ全部指定しなきゃいけないし、型に「VARIANTのような型」が無い以上、
そういうやり方すら出来ないではないでつか…。
関数にしても結局はすべて名前で指定しなければならないし…。
445:444
04/10/30 03:37:25
>>444
しまった、ループの脱出条件を書いてないから無限ループケテ~イだ…。orz
まぁ、その辺は突っ込み入れないでちょ。
446:r
04/10/30 08:20:36
>>444
offsetof
使った事無いけど。多分。
447:r
04/10/30 08:25:36
>>444
つーか
TEST_STRUCT srcData[] = ...;
for( int i = 0; i < ...; i++ )
dstArray.push_back( srcData[i] );
じゃなくて?
448:デフォルトの名無しさん
04/10/30 09:57:07
>>444
実体でなくポインタを維持すればいいなら、
std::vector<void *>dstArray;
dstArray.push_back(reinterpret_cast<void *>(&srcData.mInt));
dstArray.push_back(reinterpret_cast<void *>(&srcData.mLong));
dstArray.push_back(reinterpret_cast<void *>(srcData.mChr));
構造体のメンバの列挙は誰かがやらないといけないからねぇ。
static const unsigned sOffsets[] = {
offsetof(TEST_STRUCT, mInt),
offsetof(TEST_STRUCT, mLong),
offsetof(TEST_STRUCT, mChr),
};
for (unsigned i = 0; i < sizeof(sOffsets) / sizeof(*sOffsets); ++i) {
dstArray.push_back(reinterpret_cast<void *>(reinterpret_cast<char *>(&srcData) + sOffsets[i]));
}
これでもなんとかなるかな。
449:デフォルトの名無しさん
04/10/30 19:41:55
>>446
「offsetof」なんて初めて聞いた!
…と思ったらひょっとしてC++の言語仕様にはないものですよね?
ぐぐってみたらどうやら「.NET Framework」なのかな?
>>448
ふむふむ、ポインタを駆使すれば結構なことが出来そうですね。
しかしなんていうか難しいというかちょっぴり複雑に…。(^^;
基本的に私もメンバを一つ一つ指定することになんの抵抗も無かったんですが、
最近職場でBorlandC++Builderに慣れた同僚が、
「構造体のメンバって一つ一つ名前でアクセスしないといけないんですかねぇ?
面倒くさいですねぇ」
…などと話していたので、興味を持った次第でつ。
これができるとどういうメリットがあるかという話ですが、
(C++Builderの話限定になってしまうのですが)
DBの不特定なテーブルから、フィールド名を指定せずに
不特定の構造体のメンバにデータを突っ込めるため、
プログラムの汎用性が高まるということらしいです。
450:デフォルトの名無しさん
04/10/30 22:20:56
offsetofを知らないだけならともかく(それも問題だが)、C#って・・・
絞り込みも出来ない、googleのトップしか見ないで、2番目は無視する人かね
451:448
04/10/31 01:07:37
>>449
offsetofなんて、Cでもマクロで簡単に書ける代物なんだけど。
標準ヘッダを探してみることもできないのかな?
452:デフォルトの名無しさん
04/10/31 02:37:42
うわ~ん、そんなにいじめるなぁ~。ヽ(`Д´)ノ
簡単にできるというのがいいのだよ。
めんどっちいのはイヤ。
453:デフォルトの名無しさん
04/10/31 02:45:31
しかし、とりあえずoffsetofというマクロが
標準的に用意されてることを教えていただき、
ありがとうございますた。m(_ _ )m
454:r
04/10/31 17:05:43
クラスのメンバを、別々に、同じベクタに入れる意味がわからん
455:デフォルトの名無しさん
04/11/25 02:44:24
最近書き込みがないね。
456:デフォルトの名無しさん
04/11/25 04:01:13
重複スレだからな。
457:デフォルトの名無しさん
04/11/26 03:07:57
C言語とJavaとRuby使って,そこそこ書きました.
次はC++にチャレンジするかと,プログラミング言語C++を買ってきました.
難しいです.何書いてるのかわかりません.
俺の頭が悪いのが原因でしょうが,C++の難しさに挫けそうです
458:デフォルトの名無しさん
04/11/26 08:15:19
ヽ(冫、)ノズコーッ
何処が難しいか言ってみて。
十分習得出来る知識あるように見えるけど…
459:デフォルトの名無しさん
04/11/26 10:26:54
>>458
>十分習得出来る知識あるように見えるけど…
んな事が >>457 読んで解るのか!ESPer でつか?
460:デフォルトの名無しさん
04/11/26 10:52:23
>>459
Yep
461:デフォルトの名無しさん
04/11/26 14:05:17
>>457
CからC++に移ったばかりの人
for (int i = 0; i < 10; i++) {
v[i] = 1;
}
C++を使い慣れてきた人
for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++) {
*it = 1;
}
C++が「使える」と言えるレベルの人
std::fill(v.begin(), v.end(), 1);
これでやっと中級に入門です。先は長いです。くじけそうです。
462:デフォルトの名無しさん
04/11/26 14:07:40
C++のことがある程度わかってくると、++、--は前置にするもんです。
463:デフォルトの名無しさん
04/11/26 16:44:04
運置
464:デフォルトの名無しさん
04/11/26 21:17:08
>>462 どうして?
465:デフォルトの名無しさん
04/11/26 21:20:14
>>464
前置の方がコピーのコストがかからないから
466:デフォルトの名無しさん
04/11/26 21:27:04
>>465 どうして?
467:デフォルトの名無しさん
04/11/26 21:32:47
>>466
More Effective C++の項目6を嫁
468:デフォルトの名無しさん
04/11/26 21:36:34
>>467
読んでみた。ありがとう。
インライン展開されるような場合は別に気にしなくていいね。
469:デフォルトの名無しさん
04/11/26 22:23:28
>>461
それ見てC++の方がタイプ量多い割にたいしたこと出来ない。
Cの方が1000万倍マシと悟った。
470:デフォルトの名無しさん
04/11/26 22:24:18
>>469
それはちょっと勘違いだ。
C++ は C より便利だよ。
471:デフォルトの名無しさん
04/11/26 22:24:53
>>467
んじゃ、これから
Effective ++C
と書くことにしちくりマンボ
472:デフォルトの名無しさん
04/11/26 22:28:36
>>471
山田君、座布団一枚持ってっちゃって
473:デフォルトの名無しさん
04/11/26 22:32:14
>>468
テンプレートでの汎用プログラミングのために常に
前置にしておくと後々組み込み型をクラスにしたくなった
とき修正量が減る。
474:デフォルトの名無しさん
04/11/26 23:07:05
>>473
組み込み型かクラスかは別に関係ないような?
475:デフォルトの名無しさん
04/11/26 23:35:39
>>474
クラスだとテンポラリオブジェクトが生成されるよ。
インライン展開されてもね。
476:457
04/11/27 02:51:11
思ったよりレスが…ありがとうございます.
>>458
最初は俺も楽勝だろーとか思っていたのですが,何故か頭が受け付けません.
>>461
今の俺の書き方だと,モロ最初の書き方ですね…
477:デフォルトの名無しさん
04/11/27 03:07:44
>>461
C++を究めた人はアセンブリに戻る。
478:デフォルトの名無しさん
04/11/27 03:10:04
>>477
そういう内容のメガデモ作品があったな
479:デフォルトの名無しさん
04/11/27 06:47:22
>>461の二番目みたいに、全く抽象化されてもいないのに
無理やりイテレータ使う意義って、全くないように思えるんだが
480:デフォルトの名無しさん
04/11/27 09:02:51
インポラリ
481:デフォルトの名無しさん
04/11/27 09:22:04
>>457
> C++の難しさに挫けそうです
「プログラミング言語C++」の難しさに挫けそうなだけだろ。
482:デフォルトの名無しさん
04/11/27 09:34:42
>>479
そんなことはない。
少なくともコンテナを差し替えられる。
483:デフォルトの名無しさん
04/11/27 23:14:25
そんなこといったら、最初の書き方ならば
vectorを配列にさしかえれるという利点があるなw
484:デフォルトの名無しさん
04/11/27 23:16:08
>>483
vectorを配列に差し替えても、あまり嬉しくはないだろう。
485:デフォルトの名無しさん
04/11/27 23:37:44
速くなるやん
486:デフォルトの名無しさん
04/11/28 04:04:31
>>485
そういう用途なら、boost::arrayがあるから利点とはならない。
487:デフォルトの名無しさん
04/11/28 04:36:03
boost::rangeでcontainerとbuilt-in arrayが汎用に扱えるようにもなったしね
488:デフォルトの名無しさん
04/11/28 11:09:50
後からコンテナを差し替えやすいってのが利点。
489:デフォルトの名無しさん
04/11/28 17:27:41
コンテナの差し替えなんかするのか?ホントか?
テンプレート引数で型を受け取るときに、
どのコンテナでもOKなのは、確かに意義があるといえるが
前述の例はそういうわけでは全くないし、
正直、三つある例のどの書き方でも、優劣はないと思うが
490:デフォルトの名無しさん
04/11/28 20:57:16
前述の例だけみればたしかにどれでもいいレベルの話だけど、
意識の持ち方のことを言ってるんじゃないの?
できるだけSTLコンテナやSTLアルゴリズムを使おうという。
491:デフォルトの名無しさん
04/11/28 21:39:47
しっかし、組み込み型(intとかdoubleとか)のコンテナならSTLのアルゴリズムは
教科書通りに使えるんだが、クラスになると途端に使い物にならなくなるのは
どういうこと?
STLの範囲で済ます場合、メンバ関数ならアダプタでなんとかなるが、メンバ変数は
叙述関数・関数オブジェクトを用意しなければならない。
正直、boost::bindやboost::lambdaが無かったらやってられないよ。
でもこれも一長一短で、boost::lambdaは動かないコンパイラもあるし(bcc32)、
boost::bindは遅いし。
492:デフォルトの名無しさん
04/11/28 22:55:18
> boost::bindは遅いし。
なんで?
493:デフォルトの名無しさん
04/11/28 23:17:06
>>492
なんでだろう? 俺が聞きたいよ。
アセンブリコード見たけどよく分からん。あまり最適化されてない様子。
lambdaは早いんだけどな。
単純なlambda式なら、イテレータをループで回すより早かったりする。
494:デフォルトの名無しさん
04/11/28 23:47:31
>>493
テストコード出せる?
495:デフォルトの名無しさん
04/11/28 23:49:47
boostの一部のライブラリを見てると、素直にC++にクロージャを足した
新しい言語を作って使えよと言いたくなる。
496:デフォルトの名無しさん
04/11/28 23:55:10
boost使ってる時点で負け組み
497:デフォルトの名無しさん
04/11/28 23:57:22
>>496
何を使うと勝ち組みになれるの?
boost のめざそうとしているものを使わなくてもいいってこと?
498:デフォルトの名無しさん
04/11/29 03:52:25
>>495
C++Builder言語
499:デフォルトの名無しさん
04/11/29 08:41:38
C++が難しいのは、テンプレートのがポリモルフィズムより速いからだと思う。
500:デフォルトの名無しさん
04/11/29 08:55:56
URLリンク(pc5.2ch.net)
スレリンク(tech板)
501:デフォルトの名無しさん
04/11/29 09:53:18
>>495
templateの良し悪しはともかくとして、
言語のコアとしてそういった概念のシンタックスを
持つのではなく、メタプログラミングによって後から
追加できるのっていいなと思うけど。
502:デフォルトの名無しさん
04/11/29 11:15:07
このスレ見てるとげんなりしてくるなw
503:デフォルトの名無しさん
04/11/29 11:19:09
>>501
同感、クロージャーなどを突っ込むよりtemplate機能をもっと整理して
この種の機能はライブラリとして実装してもらいたい。
クロージャー以外にもデザパタ一式ガベコレ一式程度は自働ジェネレートできるくらいがいい。
言語のコアはあくまでシンプルで高速な物がいい。
504:デフォルトの名無しさん
04/11/29 12:55:33
VC++で計算した数値を引数で表示したいんですが、printfで表示されません。だからMessageBoxを使って表示したいんですがエラーがでます。どうしたらいいんでしょうか?どなたか分かる人教えてください。
505:デフォルトの名無しさん
04/11/29 13:10:08
( ゚Д゚)ポカーン
506:デフォルトの名無しさん
04/11/29 15:55:09
505うぜーよ!!
知らないならくるな!!!
消えちまえーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
507:モウモウ
04/11/29 21:13:40
>>504
とりあえず、現状のソース見せて。
508:デフォルトの名無しさん
04/11/29 21:15:44
質問した本人はそのスレ全てを覚えてるとは思えないが…(笑)
509:デフォルトの名無しさん
04/12/04 16:22:48
「ファイアーエムブレム」は難しすぎ
URLリンク(game.2ch.net)
Linuxは難しすぎ
URLリンク(pc.2ch.net)
三連複は難しすぎ
URLリンク(cocoa.2ch.net)
メモ帳は難しすぎ
スレリンク(win板)
510:デフォルトの名無しさん
04/12/13 13:46:51
C++はSTLと継承を使いこなし始めた辺りが
生産性・理解向上の分水嶺だった記憶がある。
511:釣られたか(w
04/12/13 14:01:00
>504
ConsoleとWinアプリは違うから。
デバイスコンテキストをキーワードに勉強しる。
あとこの手の質問はVC++のスレ・・・って適当なの無いな今は MFC限定しか
512:デフォルトの名無しさん
04/12/13 14:44:57
>>511
★初心者にVisual C++を教えるスレ★ Part16
513:デフォルトの名無しさん
05/01/01 23:35:39
C++には、他に類を見ない自由と絶対的な○○が与えられている。
514:デフォルトの名無しさん
05/02/15 18:08:52
C++の機能限定版とか無いの?
515:デフォルトの名無しさん
05/02/15 18:32:19
>>514
例外、クラス、関数オーバーロードや
デフォルト引数などの機能を取り除いた
C というものがあります。
516:デフォルトの名無しさん
05/02/16 18:00:21
>>514
EC++なんてものもある。
URLリンク(ja.wikipedia.org)
517:デフォルトの名無しさん
05/02/17 00:39:05
>>516
だがしかし、はっきり言ってウンコだ。
518:デフォルトの名無しさん
05/02/19 00:11:41
>>516
例外処理が省かれてるのが最大の問題だな。
519:361=別名ポリホ
05/02/19 00:26:05
>>518
テンプレートも名前空間もない。
実際にEC++環境があったのでコーディングしてみたことがあるけど、
全然C++らしくない。
520:デフォルトの名無しさん
05/02/19 06:54:53
まああくまでもembeddedだからねえ。
521:デフォルトの名無しさん
05/02/22 15:21:43
時々、ECMAScript をバイナリに落とすことが出来ればと考えることがある。
obj = new Object;
obj["Method"] = function( a, b )
{
echo("OK");
}
obj.Method(); // OK
441 がやりたいことも、プロトタイプ取得で簡単OK
522:デフォルトの名無しさん
05/02/23 14:30:47
漏れの考えはこうだ!
>461 様の例で「CからC++に移ったばかりの人」の書き方は
いかにも効率が悪そうな印象を受けるけど、
漏れが「仕事で」プログラムを作るなら、
迷わずこのやり方を取る。
(かなり馬鹿にされるだろうけど…。)
そして趣味で(個人的な事情で)プログラムを作るなら、
「C++を使い慣れてきた人」や「C++が『使える』というレベルの人」のような
書き方ができるように努力するだろう。
なぜなら仕事でプログラムを作り、それを他の技術者に引き継ぐ場合、
単純な書き方がもっとも無駄な手間を省くからだ。
そして多くの場合、理解しにくいバグの発生を予め抑制することができる。
また、改修を加えるときや、
不幸にしてプラットフォームの異なる環境へ移植する場合にも、
少ないコストで作業を終えることができるであろう。
スレ違いで申し訳ないけど、
引継ぎ作業によるコストって、
プログラムの書き方で随分変わるんですよ。
「凄いC++技術者」の書いたプログラムを引き継いだ場合、
「凄くないC++技術者の私」が改修を加えるのは大変なんですよ。
523:デフォルトの名無しさん
05/02/23 15:30:38
>>522
ごく普通なC++プログラマな私からすれば、他人のソースを引き継いだときに
ループが書いてあったらそれだけで要注意項目になります。
std::fillならそのまま読み飛ばせる分だけ、引き継ぎコストは抑えられるわけですな。
構造体も然り。初期化処理をその構造体を利用する側でやらなければいけないよりは
コンストラクタを書いておいてくれたほうがよっぽど確実。
まぁ、「凄くないC++技術者=C++をベターCとしてしか使えない技術者」というなら別ですが。
524:デフォルトの名無しさん
05/02/23 18:11:34
ようするに522が凄いC++技術者になればいいだけ。
525:デフォルトの名無しさん
05/03/12 16:40:27
なんで一時オブジェクトは非const参照に変換できないんだ
template<typename E, typename T, typename A, typename Value>
inline std::basic_string<E, T, A>& ToString(std::basic_string<E, T, A>& rstr, Value t) {
return rstr = static_cast<std::basic_ostringstream<E, T, A>&>(std::basic_ostringstream<E, T, A>() << t).str();
} //static_castしないとエラーを吐く。これはコンパイラのせいだと思う。
#define ToStr0(t) ToString(std::string(), t)
template<typename E, typename T, typename A, typename Value>
inline std::basic_string<E, T, A>& ToString(std::basic_string<E, T, A>* pstr, Value t) {
return *pstr = static_cast<std::basic_ostringstream<E, T, A>&>(std::basic_ostringstream<E, T, A>() << t).str();
}
#define ToStr1(t) ToString(&std::string(), t)
int main() {
cout << ToStr0(5) << endl; //エラー:一致するものが見つからない
cout << ToStr1(.125) << endl; //OK
return 0;
}
って書こうと思ったんだよ。
そしたらふと思いついてこうしたら動くんだよ。
#define ToStr0(t) ToString((std::string&)std::string(), t)
頼むからこんなのキャスト無しでも適当にやってくれよ。
そもそもオブジェクトを値渡しで返そうとするとインライン展開できない
ってのがなけりゃこんなことで悩む必要は無かったんだよ>Borland
526:デフォルトの名無しさん
05/03/12 17:34:19
それはインライン展開しない方がいいと思うが。
つうか、boost::lexcal_castとか素直に使った方がええんじゃないの?
527:デフォルトの名無しさん
05/03/12 19:06:53
>>526
lexcal_cast.hppをインクルードするとエラーになってしまうもんで。
528:デフォルトの名無しさん
05/03/13 04:15:03
>>525
> //static_castしないとエラーを吐く。これはコンパイラのせいだと思う。
ostream に対する operator << の戻り値は ostream& だから、
コンパイラに依らずエラーになるはず。
一時オブジェクトで処理しようとしているのが間違い。
529:デフォルトの名無しさん
05/03/13 11:35:07
>>523
for ( xxx i = foo.begin(); i != foo.end(); ++i.) {
nannka(*i, arg1, arg2, arg3);
kannka(*i, arg4, arg5);
}
こんなのは、NGで
一回しか使わんつまんねえファンクタわざわざ宣言して
for_eachなりつかわんとNGなんだよな?
アンタがそうゆう主義なのはかまわんが
それがごく普通かねえ?
つうか、実務経験なさそうなふいんき
530:デフォルトの名無しさん
05/03/13 13:12:54
>525
形式的には、一時オブジェクトは右辺値なので非 const 参照に変換できない。
非 const 参照→呼び出された側で変更される
+
一時オブジェクト→もともと定数だった可能性がある / すぐに破棄される
=定数のものを変更しようとしている / 変更された値が破棄される
ということでデフォルト安全側に倒してるんじゃないでしょうか。
531:523
05/03/13 15:09:14
>>529
んにゃ、一々ファンクタ書くまでもない処理ならループでもいいんでない?
ただ、ファンクタもいらんような単純な処理まで一々ループを書くなって話。
適切な比較オペレータを持っているクラスだというのに一々findループを書く神経は疑うってことね。
まぁ、>529の例ならファンクタ書かれるよりはループで書かれた方がよっぽどまし。
更に言えば、for (int i = 0; i < foo.size(); i++) なんて書かれるよりずっとまし。
532:デフォルトの名無しさん
05/03/15 02:44:42
そこでlambdaですよワラ
533:デフォルトの名無しさん
05/03/19 05:54:34
>>531
しょーもないことにこだわってるあたり覚えたての学生とみた(遠い目
534:デフォルトの名無しさん
05/03/19 10:29:39
「まし」とか繰り返して、さも自分にはもっといい案があるかのように匂わせておいて
結局そのまま書かずに退散するのが「らしい」ですよね ;-)
535:523
05/03/19 10:41:38
んー、ないよ~
単にどっちがいいかって書いただけだし。
ファンクタを作らなくてもalgorithmのfind使えるケースで自分でループ書くのや
iterator使わずに制御変数でループを回すのが要注意だって話で。
>529の例ならそれでなんも問題ないんでない?
#そもそも私自身がファンクタ作るの苦手だw
536:デフォルトの名無しさん
05/03/21 12:01:02
C++よりMLの方がいいよ。
537:デフォルトの名無しさん
05/03/24 05:34:21
まあバランスが大事だよな
538:デフォルトの名無しさん
05/03/25 07:52:46
C++はすさまじく肥大化した言語。しかし、慣れると機能が多くて便利なのも事実だったりする。
シンプルといわれていたJAVAもバージョンが新しくなるにつれて肥大化が進んでいる。
C#はC++から機能を削ったとはいえ、機能を付け加えているから最初から肥大化している。
機能が多い言語は必ず肥大化し、複雑になってしまう。
シンプルで初心者に優しいけど「不便な言語」よりは、複雑で便利な言語のほうが良いと思が、
複雑な言語は初心者には優しくない。
初心者にやさしい「複雑な言語」があれば望ましいけど、それは無理かもしれない。
539:デフォルトの名無しさん
05/03/25 08:59:47
>>538
(行き着く先は)自然言語。
そして曖昧さと冗長性が増える罠。
540:デフォルトの名無しさん
05/04/25 00:25:10
シーピーピー シーピーピー シーピーピー シーピーピー
シーピーピー シーピーピー シーピーピー シーピーピー
ろ く な も ん じ ゃ ね ー
541:デフォルトの名無しさん
05/04/25 08:41:55
負け犬?
542:デフォルトの名無しさん
05/04/26 23:11:19
int n;
n.~int();
これがコンパイルを通ってしまうのに驚いた。
こんな関数にint型の値を渡してもコンパイルが通ったからまさかと思ってやってみたら通った。
template <class T>
void Destroy(T& t)
{
t.~T();
}
543:デフォルトの名無しさん
05/04/26 23:52:59
>>542
VS.net2003だと下のテンプレ関数のみ通った。
n.~int();は error C2059: 構文エラー : ''<L_TYPE_ambig>'' って出る。
544:デフォルトの名無しさん
05/04/27 00:21:50
テンプレートじゃなくても通るのが正しいような気がする。
545:デフォルトの名無しさん
05/04/27 13:49:42
>>538
今ならまだD言語のライブラリは少ない…貧弱
546:デフォルトの名無しさん
05/04/27 14:17:59
C++もなにかしようと思ったら機能が貧弱だよ
GCもないし、拡張工事をせざるを得ない
良くも悪くもCなんだな
547:デフォルトの名無しさん
05/04/28 00:29:01
>>546
そうだね、あせんぶらにもGCつければべんりだね(わら
548:デフォルトの名無しさん
05/04/28 05:10:40
>>546
そうじゃなくて、君の頭じゃC++は無理なんだよ。
549:デフォルトの名無しさん
05/04/28 05:16:58
何見当違いの煽りをしてるんだか。
550:デフォルトの名無しさん
05/04/28 07:44:37
javaは.closeを書かせておいてGCがあると
主張するのは無理がある。同期のコードなんてCそのものだ。
そういえばGenericsもプリプロセッサで実装しているし
assertの実装は失笑である。javaは新しいCなのだろう。
DはRAIIというのがあるようだ
551:デフォルトの名無しさん
05/04/28 17:52:40
C++はむずかしいので、機械語で書いてます。
552:デフォルトの名無しさん
05/04/28 18:04:09
>551
俺にはそっちの方がムズい…
553:デフォルトの名無しさん
05/04/29 02:10:38
BCBのヘルプに
「alloca 関数の使用はあまりお勧めできません。」
って書いて有るんですけど、そうなんですか?
554:デフォルトの名無しさん
05/04/29 09:14:17
>>553
スタックを食い潰すし、移植性に乏しいからでは?
555:デフォルトの名無しさん
05/04/29 10:02:13
C99ならVariable Length Arraysを使ったほうが良いかと。
556:デフォルトの名無しさん
05/04/29 17:30:06
C++ならstd::auto_ptrを使ったほうが良いかと。
557:デフォルトの名無しさん
05/06/02 20:59:36
仮想関数を使えばswitch-caseの嵐から抜けられるわけで、個人的にはそれだけで大満足です。
558:デフォルトの名無しさん
05/06/02 23:37:01
>557
だね。場合分けをすることなしに、異なる振る舞いを事前に記述して、コンパイラ任せにできる
有利性、というか。
でも、その有利性を理解できない層というのも確実にあって、それは何かっつーと、
仮想関数という概念、というか言語仕様を知らない層なんだよね。C++はもちろん、
Javaも知らないという層。switch-caseで、あり得る場合分けが全部ソース上に
明記してあった方が判りやすいしデバッグしやすいじゃん、と主張してきそうな、
えてしてそういう層が実装仕様を決めやがるんだよなあ。おっとこれはグチだな。すまん。
誰か強力に布教してくんねーかな。俺はもー疲れた。