1 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 00:11:34.01 ID:nc/5PI4P0.net] 次スレを立てる時は本文の1行目に以下を追加して下さい !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part131 mevius.2ch.net/test/read.cgi/tech/1501295308/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 mevius.2ch.net/test/read.cgi/tech/1500329247/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 00:12:56.93 ID:nc/5PI4P0.net] 散々スレ散らかしておいて挙句誰もスレ立てないとか何なんだよおい
3 名前:デフォルトの名無しさん [2017/10/10(火) 00:17:51.84 ID:UbDU2trc0.net] >>1 乙
4 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 00:20:07.57 ID:QENrkQd80.net] swap(a,1);
5 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 00:34:49.46 ID:xPjXx2fY0.net] int&& x=1; 乙 << x;
6 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 00:37:53.16 ID:xPjXx2fY0.net] swap(T& x, T& y) { T tmp = x; x = y; y = tmp; }を swap(T&&x, T&& y) { T&& tmp = x; x = y; y = tmp; }とかやったら死ぬ気しかしない
7 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 02:42:57.50 ID:wYOMkRRU0.net] 2 名前:デフォルトの名無しさん (ワッチョイ bf54-lR6P)[sage] 投稿日:2017/03/31(金) 16:52:18.52 ID:CoeIAoH10 STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。 ---- テンプレ ここまで ----
8 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 12:31:02.91 ID:EzEz7dGm0.net] テンプレに >>970 が建ててね 辺りを追加しとこうぜ
9 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 15:13:46.21 ID:S8JfuHhfd.net] 開発的なお話で単純に構造体の要素を一つ追加するって危険な行為でしょうか?
10 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 15:40:18.46 ID:NgeFZ2kOM.net] 質問がふわふわし過ぎ そんなんじゃまともな回答は無理 個人的には メンバをひとつ追加する程度で 破綻のリスクが増えるというなら それは元々破綻していて 表面化していないだけだろうと思うが
11 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 16:32:52.19 ID:S8JfuHhfd.net] >>10 ふわふわしすぎてました 意味合いとしては答えてくれてることで合致してます メンバ変数を一つ追加することでその他への影響は大きいでしょうか?って意味でした
12 名前:片山博文MZ mailto:sage [2017/10/10(火) 16:49:55.22 ID:RmsAElXwd.net] >>11 メンバー変数を増やすと、構造体のサイズが増大する。また、変数の追加する場所によっては、メンバーの相対的な位置が変化する可能性がある。 よって、その構造体のバイナリーインターフェースに依存するプログラムは死亡する可能性がある。
13 名前:片山博文MZ mailto:sage [2017/10/10(火) 17:03:33.96 ID:RmsAElXwd.net] 例えば、構造体データをバイナリーとしてファイルに出力していたら、サイズの増えた構造体では正しく読み取れない可能性がある。 構造体のメンバーの相対的位置が変化したら、古い構造体を使っている他のプログラムとは相性が悪くなる。
14 名前:片山博文MZ mailto:sage [2017/10/10(火) 17:13:40.90 ID:RmsAElXwd.net] Windows APIでは、構造体をバージョン管理して、構造体のサイズで処理を変えたりしている。
15 名前:はちみつ餃子 mailto:sage [2017/10/10(火) 20:42:09.59 ID:ISsQMV5w0.net] >>14 たまに半端な位置に「予約」とか説明されてるメンバがあったりするよね。 あれはバイナリサイズが変わると困るような理由があるからなんかなぁ。 まあ、たいした理由もなくやっちゃって互換性ゆえに変えられなくなったとかだろうけど。
16 名前:片山博文MZ mailto:sage [2017/10/10(火) 22:10:42.42 ID:RmsAElXwd.net] >>15 位置やサイズが違うとバグのもと。 昔はよく #include <pshpack1.h> ... #include <poppack.h> を書いたものだ。
17 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 22:48:32.16 ID:muYZ22/tM.net] 膝を撃ち抜く自由も良し悪しだな。
18 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 23:50:05.54 ID:4EEs5NsC0.net] cURLを限りなくスペックの低い組み込み機器に入れようとしてるところで問題が起きました ・処理能力が低い cURLをsystem関数でコマンドライン実行しようとすると、 呼び出す側の処理がCPU50%平均的に食っている+cURLもCPU喰うでまともに通信が出来ません 呼び出す側を落とすとcURLの処理速度は改善されるから 確定でCPUの食い合いが原因ってのもわかっている 対策として下記二つが出たのだけど ・呼び出す側をcURLが実行中はsleepにする ・cURLを実行ファイルで取り込むのではなくプログラミングベースで取り込む 上は常に通信をしているためにsleepを挟むことはできず 下のプログラミングベースについてもクロスコンパイルの問題でなぜか上手く行かない これ以外の方法で対処方法ってありますか?
19 名前:片山博文MZ mailto:sage [2017/10/10(火) 23:55:48.47 ID:RmsAElXwd.net] >>18 なぜかうまくいかないときのエラーメッセージは何だ?
20 名前:片山博文MZ mailto:sage [2017/10/11(水) 00:02:11.03 ID:qOpcxgfAd.net] スペックが低いなら、そもそもマルチスレッドが未実装の可能性がある。 ならばsleepは無意味ということになるかも知れない。
21 名前:片山博文MZ mailto:sage [2017/10/11(水) 00:06:14.17 ID:qOpcxgfAd.net] スペックが低すぎると、ANSI Cなどの規格に準拠してない恐れがある。 マシンとコンパイラーのマニュアルを確認して、準拠状況を確認しろ。
22 名前:はちみつ餃子 mailto:sage [2017/10/11(水) 02:03:02.75 ID:xVJHolx50.net] >>18 状況がよくわからんなぁ。 system 関数自体は普通は同期的だよね? スレッドを分けて system 関数を実行した上で、 メインプロセスと cURL がプロセス間通信
23 名前:はちみつ餃子 mailto:sage [2017/10/11(水) 02:03:35.16 ID:xVJHolx50.net] してるってことかな。 (すまん、ミスって変なところで投稿してしもうた)
24 名前:はちみつ餃子 mailto:sage [2017/10/11(水) 02:18:21.03 ID:xVJHolx50.net] この件に関しては >>19 の疑問が当然だなぁ。 クロスビルドでこの手の問題がありがちなのは、 ライブラリのサーチパスとかかな。 ライブラリが見つからんとかメッセージ出てないかね?
25 名前:片山博文MZ mailto:sage [2017/10/11(水) 02:27:32.03 ID:qOpcxgfAd.net] www.ne.jp/asahi/hishidama/home/tech/c/exec.html#h_fork forkを使えば、プロセスを分けることができるらしい。
26 名前:デフォルトの名無しさん mailto:sage [2017/10/11(水) 06:22:13.21 ID:Fgfx0EWk0.net] >>19 undefined 系統のエラーが沢山出る arm-linux-gnueabi-gccを使ってコンパイルするとそうなる ただgccだとエラーは起きない。ただi386系になるから実行環境で動かない クロスコンパイルでcURLの単体がARMにできているから .aファイルもARM担っていると思っているのだけどもなっていないのだろうか objdump実行でARMって文字を確認したからARMだと思いたいとこではあるが… エラー時の実行例 arm-linux-gnueabi-gcc test.c -o test.out -LXXXXXX -lcurl 通るけどi386系で実行環境で実行できない gcc test.c -o test.out -LXXXXXX -lcurl >>22 今の状況はPCA-PCBと通信がしたい。着目しているのはPCA PCAがPCBと通信をする独自規格を元々持っていたのだけど、そのPCAが持っている独自規格を色々な規格をサポートしているcURLに置き換えるって話 今まではPCAの中のメインプロセス(CPUを一番食っているやつ)が通信を行っていただけだったから特に問題は発生しなかったけども 今回はメインプロセスがcURLをコマンドライン実行で呼び出す設計にしようとしている そのためメインプロセスと別のcURLというプロセスが起動することになると考えている なので、実装前にメインプロセスが生きている状態で直接コマンドプロンプトでcURLを実行し、動作検証したら通信自体はできるけど動作がとても遅いってとこ露に行きついた 調べてみると、メインプロセス・cURLともにCPUを食いあって速度が遅くなっていることも確認できて どうやったら上手く実装できるだろうか…と悩んでいるところです sleepに関しては実装して確認したわけではないけど、kill -stop PIDで実行したら 上手く行ったからsleepも上手く組み込めば対応できrのではないかと思ってる >>25 forkでこれ以上増えるとさらに遅くなると思ってる…
27 名前:デフォルトの名無しさん mailto:sage [2017/10/11(水) 07:22:11.99 ID:pdXZ47r80.net] メンバ変数が1個増えたぐらいで崩壊するのは 対外的にはカプセル化がうまくいっていない例、 内部的にはクラスのふるまいに激甚な影響を与えるような重大なメンバ変数の追加が 後から必要になるというのはマズーな設計の例、
28 名前:デフォルトの名無しさん mailto:sage [2017/10/11(水) 07:26:23.14 ID:pdXZ47r80.net] フォークは低速な外部記憶からプログラムコードを新たにロードする手間が無い分高速な可能性が微レ存、 フォーク先とフォーク元でコードが共有されるためメモリ使用効率も多少UP、 あとサーバとクライアントの関係にある処理を(無理矢理)1本のプログラムとして書けるので 開発環境のリソース自体厳しく制限されていた昔はややうれしかったのかも知れん、、
29 名前:デフォルトの名無しさん mailto:sage [2017/10/11(水) 07:54:56.70 ID:pdXZ47r80.net] ていうか根本的な疑問として CPUが低速であるとわかっていながら応答速度の要求があるタスクの一環に プロセスの起動を含めるのってどうなんじゃ… (プロセスやスレッドの起動は低廉なOSでは一般にリアルタイム性が全く最強度で担保されない 応答速度の要求が見積もれていなかったんだとすると極めてご愁傷様な話…
30 名前:デフォルトの名無しさん [2017/10/11(水) 20:57:32.43 ID:gwIT2xqO0.net] %%%%4NEL%%%% 000-SAV-&1.0888214%ML<\47MBL%0.2\MSSSS4.213> 1.8882/%B/%SB/<\2/7BL\%\%B!B%47L%Si72B>%10.2%\ 002%\B%===>>>52 .B<\rbc/2.8>>\7B<<\7LB>>\72S\<%\42%><\br>001BYON$\%7L2%3.33GHz>>>2 .3GHz<\br> 41.B%LB%"<<%11.6$%><<\86.1B>>2 LB>"B???S3>>71 $-?>6%<\br> 082@<\7L@@<\br> \LOOP>0<1Entra
31 名前:デフォルトの名無しさん mailto:sage [2017/10/11(水) 22:47:02.58 ID:pdXZ47r80.net] つかだいたいやるべきこと: 1. プログラムを全般的に速くする 2. (今から可能ならば)要求元とハンドシェークして必要なだけ待ってもらうしくみにする 3. 間に合わせたい処理の優先度を間に合っている処理より上げる (できればワーストケースでの応答時間の上限を担保する >>20 sleepしてもスレッドコンテキストが切り替わらないOSというのはさすがに都市伝説なんじゃ…
32 名前:デフォルトの名無しさん mailto:sage [2017/10/12(木) 05:46:12.53 ID:4g8heiq80.net] ハンドシェイカー?時間の支配者?
33 名前:デフォルトの名無しさん mailto:sage [2017/10/12(木) 07:21:15.63 ID:K6ixfN2F0.net] 訂正 ×: プログラムを全般的に速くする ●: プログラムのボトルネック箇所を探して速くする この場合プロセスの起動がボトルネックなのはまちがいなさげなのでそこを速くなるように修正汁、
34 名前:デフォルトの名無しさん mailto:sage [2017/10/12(木) 09:09:50.72 ID:VRKsQXfP0.net] 汁?
35 名前:デフォルトの名無しさん [2017/10/12(木) 11:20:59.76 ID:PQ1d1y2O0.net] 汁=しろ 2ch地方の方言たい
36 名前:デフォルトの名無しさん mailto:sage [2017/10/12(木) 12:07:42.25 ID:GDIRJBKR0.net] 汁を知らないのにも今時汁を見られたのにも戸惑う
37 名前:デフォルトの名無しさん mailto:sage [2017/10/12(木) 13:46:59.50 ID:CaCBhzNq0.net] cURLでググったらlibcurlってのがある。こっち使えばすべて解決する話じゃないの。 そもそもC++スレなのにlib使わずコマンド経由する理由が謎。
38 名前:デフォルトの名無しさん [2017/10/12(木) 14:05:01.65 ID:OhN0e73F6.net] ウンコの画像を生成するプログラムの作り方を教えて下さい
39 名前:片山博文MZ mailto:sage [2017/10/12(木) 14:27:08.43 ID:loBt1/dEd.net] >>38 板違い。CG板へ行け。
40 名前:デフォルトの名無しさん [2017/10/12(木) 14:29:18.75 ID:OhN0e73F6.net] お願いします!
41 名前:片山博文MZ mailto:sage [2017/10/12(木) 14:44:27.75 ID:loBt1/dEd.net] MMD、Blender、メタセコイアなど好きなヤツを使ってオブジェクトを三次元モデリングしろ。 ボーンを設定して、思ったとおりに変形できるようにしろ。 レンダリングして、画像として保存しろ。
42 名前:デフォルトの名無しさん [2017/10/12(木) 14:45:58.16 ID:OhN0e73F6.net] 線を引いて多様なウンコ画像を生成するプログラムお願いします!
43 名前:片山博文MZ mailto:sage [2017/10/12(木) 14:49:53.72 ID:loBt1/dEd.net] 基本オブジェクトをいくつか作れ。 基本オブジェクトを変形し、組み合わせれば、求める画像がレンダリングできる。 重力とボーンを考慮すれば自然な形になる。
44 名前:デフォルトの名無しさん mailto:sage [2017/10/12(木) 14:52:00.26 ID:y2YbOREJ0.net] AIがウンコ画像を識別できるなら、逆にウンコ画像を生成することもできるのではないか? これを応用するとエロ画像を識別できるAIにエロ画像を生成させることもできるのでは?
45 名前:片山博文MZ mailto:sage [2017/10/12(木) 16:00:49.56 ID:Q2Fs2fOZd.net] まずは、MMD、Blender、メタセコイアのどれかを選んでダウンロード&インストールしろ。
46 名前:デフォルトの名無しさん mailto:sage [2017/10/12(木) 19:02:41.71 ID:eq5Al9lp0.net] >ボーンを設定して、思ったとおりに変形 要らんだろ・・・・w アラレちゃんにつんつんでもさせるのかよ
47 名前:デフォルトの名無しさん mailto:sage [2017/10/12(木) 21:58:15.37 ID:9n97WZ1N0.net] cURLの起動云々の話に答えてくれた人ありがとう 応答速度についてはめちゃくちゃ遅いってレベルにならなければ問題なく プロセスを立ち上げるような処理を入れても問題ないとの判断 極端な話10秒で終わっていたのが20秒になりましたぐらいなら問題なく、これが600秒かかりますとかなら問題あった 実際にプロセスを立ち上げてみて処理させてみたけど CPUの食い合いがなければこの問題は解決できていると考えている 処理についてsleep入れるのは無理そうってレスしたけども ソースコードを追ってみたらpollなどではなくwhile&usleepでの待機が存在していて CPU喰ってたからこいつをちゃんと制御すれば問題なさそうってなりました 考えてくれた人ありがとう 別案件なんだけど何か良い実装方法がないか相談させてほしい
48 名前:デフォルトの名無しさん mailto:sage [2017/10/12(木) 22:19:04.32 ID:BE/Y4M/40.net] >while&usleep 時間の掛かる、I/O で、busy wait する奴って、素人だろ
49 名前:デフォルトの名無しさん mailto:sage [2017/10/12(木) 22:24:29.13 ID:9n97WZ1N0.net] 1. PCA→PCBへのインストールで新規にcURLの実行形式ファイルを入れることになった 2. インストールが完了して再起動をしたら今後はcURLをsystem関数で実行して通信する この状況下でダウングレードを試みようと考えた時に 3. PCA→PCBへのダウングレード(インストール)をcURLを用いてする 4. インストールが完了して再起動をしたら今後は独自プロトコルでの通信に戻る こういう状況になった。 その時に、cURLを削除するタイミングが見付からなくて今困っている。 3を実行したときに判断しようとしたのだけどダウングレードだと判断するに至る材料がない。 ファイルを一個ずつ指定して送信して・・・の繰り返しだからリストにcURLがあるかないかも判断できずってなっている
50 名前:デフォルトの名無しさん mailto:sage [2017/10/12(木) 22:25:11.03 ID:9n97WZ1N0.net] 書いてて気づいたけどこれC++の話じゃないって もうスレチだと気づいたので無視してください スレ汚しすまん
51 名前:デフォルトの名無しさん mailto:sage [2017/10/13(金) 05:33:30.13 ID:SZtyoNBi0.net] >>48 なるほろ 優先度の低いスレッドのビジーループは必ずしも悪ではないと思っていたが 低速なI/O命令を含むビジーループだと応答性能のドブ捨て度が増すのか、
52 名前:デフォルトの名無しさん [2017/10/13(金) 06:42:57.49 ID:/fw1jTt60.net] usleepしてるんなら優先度関係ないだろ 誰だ変なこと言ってるのは
53 名前:デフォルトの名無しさん mailto:sage [2017/10/13(金) 07:21:38.02 ID:JHJOvcP00.net] ネット回線なんか、秒の単位だから、busy wait の範囲を超えてる busy wait は、せいぜい、1ms 以下とか、 マイコン・リアルタイムOS での話
54 名前:デフォルトの名無しさん [2017/10/13(金) 10:38:57.55 ID:/fw1jTt60.net] もしかしてusleepがビジーウエイトで実装されているとでも思っているのか
55 名前:デフォルトの名無しさん mailto:sage [2017/10/13(金) 10:41:47.57 ID:JHJOvcP00.net] CPU 使用率が、100% になってたんじゃないのか?
56 名前:デフォルトの名無しさん mailto:sage [2017/10/13(金) 22:27:44.28 ID:SZtyoNBi0.net] >>52 あるわ; 優先度が高いスレッドにビジーループされるとそいつがsleepしてくれる間隔が 全スレッドの応答時間の下限になってしまう 優先度が低いスレッドのビジーループならsleepを待たずに割り込めるからそこまで甚大にならない ただしI/O命令があってそいつが数百マイクロ棒かかると より高いスレッドであってもワーストケースの応答時間が数百マイクロ棒に劣化する
57 名前:デフォルトの名無しさん mailto:sage [2017/10/13(金) 22:29:57.37 ID:SZtyoNBi0.net] usleepは普通電気が無駄なのでhaltでもしてハードウェアに割り込みを待たせるが マルチコア対応OSやったら気分次第でスピンロックでビージループすることもあるかも試練、
58 名前:デフォルトの名無しさん mailto:sage [2017/10/13(金) 22:46:36.70 ID:SZtyoNBi0.net] スマン >usleepは普通電気が無駄なのでhaltでもして というのは他に実行権待ちのスレッドが無かった場合の話ェ、
59 名前:デフォルトの名無しさん [2017/10/13(金) 23:08:17.12 ID:JHJOvcP00.net] OS は、たぶん優先度を上下させるから、要注意。 優先度の低いスレッドでも、カーネルモードに入ると、優先度を上げるのじゃ? 優先度の低いスレッドのカーネルモードが、 優先度の高いスレッドのユーザーモードよりも、優先されるかも? ただ、CPU 使用率が、100% と表示されていても、 本当は、CPUを使っていない場合もあるとか、聞いた事もある
60 名前:デフォルトの名無しさん mailto:sage [2017/10/14(土) 02:15:22.32 ID:hYPsSpip0.net] ウニファイドコールシンタックスはまだか!?
61 名前:52 [2017/10/14(土) 07:10:59.60 ID:F19RwFTi0.net] >>56 おまえさん、やっぱり前提がおかしいな > 優先度が高いスレッドにビジーループされると そんな話してねえぞ usleepしてるんならと言ったろ なんでビジーループが出てくるんだよ
62 名前:デフォルトの名無しさん mailto:sage [2017/10/14(土) 07:17:25.54 ID:nAGT83AF0.net] >>61 知らん国語の苦情なら>>48 に家、
63 名前:デフォルトの名無しさん mailto:sage [2017/10/15(日) 15:18:57.35 ID:6+blsnLXd.net] ftpサーバを立てられないからプログラミングまで進まない悲しい 530エラーってなんでえええ IIS使いにくい
64 名前:デフォルトの名無しさん mailto:sage [2017/10/15(日) 15:51:56.38 ID:NUNtAlCN0.net] 俺もIISでFTPSサーバ立てられなくて困ってるわ IIS思った以上に使いにくい IISでオレオレ証明書を作成して FTPS通信をcURLで確立したいだけなのに 本当にできるのだろうか
65 名前:デフォルトの名無しさん mailto:sage [2017/10/15(日) 20:46:54.60 ID:jTAoV9hu0.net] >>63 ,64 まあそういう話は適切なスレに行ってしてくるといいぞ
66 名前:片山博文MZ mailto:sage [2017/10/15(日) 20:50:15.37 ID:3VVV/TO4d.net] セキュリティソフトやファイアウォールが通信の邪魔をしている場合があるから、気を付けな。
67 名前:デフォルトの名無しさん mailto:sage釣 [2017/10/15(日) 21:16:20.68 ID:TMBfPksM0.net] xamppでは出来ないんだっけ
68 名前:デフォルトの名無しさん [2017/10/15(日) 21:45:19.70 ID:bPqYmEmS0.net] なんか難しい設定あったかな SFTPできないならありそうだが
69 名前:デフォルトの名無しさん [2017/10/15(日) 21:49:59.50 ID:DZC0OlhV0.net] >>66 そういう実験はまずVMでやれ、だよな 完全に無防備なら本来どうなっていたという話からクリアして セキュリティの入った環境で引っかかった場合に切り分けをしながら、と
70 名前:デフォルトの名無しさん mailto:sage [2017/10/15(日) 23:00:46.02 ID:9R+c2v2L0.net] usleepの実装ってどんな感じ? どれくらいのμ秒の精度出んの? ループ中に頻繁に読んでいいものなのか?
71 名前:デフォルトの名無しさん mailto:sage [2017/10/15(日) 23:29:48.88 ID:lsjR8/6b0.net] 色々あるでしょ。 CPUが時計対応ならそっち見るだろうし、最悪ビジーループ。 不安ならchronoで寝るとかもあるぞ。
72 名前:デフォルトの名無しさん mailto:sage [2017/10/15(日) 23:39:50.79 ID:9R+c2v2L0.net] ググると最低4msとか出てくるな。MSみたいに最初からミリ秒単位にしとけば変な誤用されないものを。
73 名前:デフォルトの名無しさん mailto:sage [2017/10/16(月) 12:13:18.90 ID:iBTaJQF10.net] ガベージコレクションがないのに、安全なオブジェクト指向プログラミングなんてできるんですか?
74 名前:デフォルトの名無しさん [2017/10/16(月) 12:22:08.74 ID:VYCnmYA70.net] デ、デストラクタがあるから
75 名前:デフォルトの名無しさん mailto:sage [2017/10/16(月) 12:25:47.42 ID:CHd6usgT0.net] ガーベージコレクションも含めて実装するのが真のC++グラマーやでアマチャン
76 名前:デフォルトの名無しさん mailto:sage [2017/10/16(月) 12:40:47.29 ID:Ou6sbmAQM.net] GC付きスマポ、誰か作らんかね。
77 名前:デフォルトの名無しさん mailto:sage [2017/10/16(月) 14:41:14.09 ID:cwpW48EL0.net] D言語「俺を使えばいいじゃない?」
78 名前:デフォルトの名無しさん mailto:sage [2017/10/16(月) 20:49:20.76 ID:EBMdtAZpM.net] cli「もしかして俺の時代?」
79 名前:デフォルトの名無しさん mailto:sage [2017/10/16(月) 20:54:28.42 ID:D6Ozm2TBM.net] >>76 誰が使うんだよ?
80 名前:デフォルトの名無しさん mailto:sage [2017/10/16(月) 22:26:22.71 ID:uaY9uFi30.net] >>73 RAIIを徹底するのがC++流リソース管理法 いつ走るかわからないGCなんかよりずっとcontrollable
81 名前:デフォルトの名無しさん mailto:sage [2017/10/16(月) 23:19:12.53 ID:7Byc8Q4r0.net] GC要求が発生する前にプロセスが完了すりゃいいだけだろ
82 名前:デフォルトの名無しさん mailto:sage [2017/10/17(火) 00:26:06.58 ID:hVetZd8l0.net] 最近は異常なほど高級言語志向が強いな。
83 名前:デフォルトの名無しさん mailto:sage [2017/10/17(火) 06:56:31.57 ID:BJIvhub9M.net] >>81 それGC要らんだろ w
84 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 06:24:43.21 ID:syxw9nR/d.net] スレッド間の変数の共有って ・pthread時に引数与える ・シングルトン ・グローバル変数 これ以外に何かあるかな?
85 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 08:44:17.01 ID:qJuCX/Qy0.net] C++を最近学び始めた者なんですが ファイルへの保存で質問があるんですが良いでしょうか テキストに保存するのと、バイナリに保存するので 文字列を保存するとバイナリが僅かに小さくなるんですが vectorを保存すると逆にバイナリのほうがサイズが大きくなるのは 普通のことなんでしょうか?
86 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 08:46:30.49 ID:qJuCX/Qy0.net] vectorの二次元配列を、forの二重ループで テキストへは outputfile << data[i][j] << "\t"; バイナリへは outputfile.write((const char*)&data[i][j], sizeof(data[i][j])); で書き込んでみてるのですが・・・・・・ 100×100の配列を書き込むと テキストが29キロバイト、バイナリが40キロバイトに 配列を大きくすればするほどバイナリが大きくなってしまいます
87 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 09:34:34.48 ID:lDu9kW4oM.net] >>84 同一アドレス空間である以上、アドレスさえ取れればどんな方法でも共有できると思うよ。
88 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 09:40:31.86 ID:+1GvmKA80.net] >>86 改行かな?
89 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 09:41:02.33 ID:MOIHjDBn0.net] >>86 どんなデータかによる。intを保存しようとしててデータが全部一桁ならバイナリの方が大きくなることもあるかもしれない。 まずキャストの使い方が間違ってるので、さっくり消してみよう。 次に読み取り部分を作って正常に読み取れるか見てみよう。
90 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 09:45:31.83 ID:4annDJqp0.net] >>85 dataの型が解ればもう少し推測できるけど char data[100][100][MAX_STR_LEN]; だとして data[0][0] = "data\0qwe"; // "qwe"はゴミ みたいにnull terminated後の不要なゴミも書き込んでるんじゃない? バイナリエディタでバイナリファイル覗いてみれば解るかと サイズから推測するとMAX_STR_LENは4かな
91 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 09:57:25.60 ID:MOIHjDBn0.net] あ、ofstreamのwriteって引数const char*なのか ゴメン間違ってるってほどじゃないわ せいぜいC++っぽくreinterpret_castに変えるくらいか
92 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 11:54:38.42 ID:hNmHHI30M.net] >>91 いや、私の誤りでした、だろ 何が間違ってるほどじゃないだ 日本語間違えるなよ >>86 出力したテキストファイルの中身は?何か差分は無いの? 少ない情報出してここで聞くより 見た方がよっぽどわかるだろ
93 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 11:56:58.03 ID:qJuCX/Qy0.net] レス有難うございます。dataはintのvector二次元配列で int a=100; int b=100; vector< vector<int> > data(a, vector<int>(b)); このdataに、forで data[i][j] = rand() % 100; の数字をいれている配列なんです バイナリ保存したデータを、FavBinEditというものでみてみると 数字と数字のあいだに間隔があいてるので これがサイズが大きくなってる理由なのかと思うんですが
94 名前:デフォルトの名無しさん [2017/10/18(水) 12:47:08.44 ID:J7UI6pACM.net] >>93 int型の100*100配列なら約40K byteなんだから、バイナリファイルは正しいと思うよ。 で、テキストも間違っているとは言いきれない。 例えば一桁の数字が多いなら、バイナリファイルより小さくなるよね? サイズの違いはあって当然だと思うけど。
95 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 13:00:53.38 ID:qJuCX/Qy0.net] そういうものなのですか ネット上に、バイナリに保存するとサイズが小さくなる という話が多いのでそう思い込んでました 自分には関係無いような、複雑なデータを扱うと小さくなるのかな
96 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 13:06:46.43 ID:4annDJqp0.net] そういうもんですね 自分もintなら納得です 「rand() % 100」なら文字列にしたとき"0"(=0x30)から"99"(=0x3939)と2byteで収まり "\t"を付けても 常に4byte(=sizeof(int) システム依存)より小さいですから バイナリだと0を0x00000000, 99を0x63000000(リトルエンディアン)で保存してます 試しに「rand() % 100」を「10000」とか "文字列にしたとき'\t'も含めて4文字を越える大きさ"にすれば サイズが逆転するのが観察できるはずです ・扱う数字が小さいからテキストの方が短くて済んでる ・バイナリなら数字が大きく(当然intの最大値を越えないこと)なってもサイズが一定で済む 余談ながら バイナリで保存するならバイトオーダー(エンディアン)には注意しとかないと 万が一エンディアンの違うシステムで動作する必要があるときに死ねます
97 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 16:31:39.68 ID:8P8HMOssx.net] 質問です。 とあるクラスのヘッダーに定義している文字列変数(CString)の文字列だけを変更し、ビルドしても、変更が反映されないのですがこれは仕様でしょうか?リビルドすると反映されます。 環境はVisualStudio2015 VC++です。
98 名前:97 mailto:sage [2017/10/18(水) 16:50:26.75 ID:8P8HMOssx.net] 自己レス。最小リビルドを無効にしたら解決しました
99 名前:デフォルトの名無しさん mailto:sage [2017/10/18(水) 20:07:45.40 ID:3bYwz/rX0.net] >>83 そう それが肝心
100 名前:デフォルトの名無しさん [2017/10/19(木) 12:49:02.40 ID:LAmWAPnYM.net] >>95 テキスト形式は、装飾次第で肥大化しやすいってだけだよ。 カンマやタブや改行も装飾の一部。 一桁の数字でも、スペース等で桁合わせしたら、それだけで肥大化するしね。 実際のところは、どういうフォーマットで出力してるか次第だけど。 最小桁で出力していて、rand 出力が正規分布に従うと考えれば、計算上約29k byteになるよ。
101 名前:デフォルトの名無しさん mailto:sage [2017/10/19(木) 21:31:04.86 ID:4jS9VIw90.net] XMLは糞。ゲイツは正しかった。
102 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 01:43:03.05 ID:20SzWA3c0.net] 無名名前空間内の変数にstaticがついたものを見かけました このstaticにはどのような意味があるんでしょうか?それぞれ同じような意味だと思い込んでいたのですが・・・
103 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 03:20:47.47 ID:NGOzoqth0.net] ユニファイドコールシンタックスまだー!?
104 名前:デフォルトの名無しさん [2017/10/21(土) 05:36:54.09 ID:NrRI2kzj0.net] >>103 要らねえよ
105 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 05:39:44.45 ID:NGOzoqth0.net] >>104 黒魔術できるから楽しいぞ。 入ってくれ。
106 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 05:49:37.85 ID:NGOzoqth0.net] auto R = Handle.ConnectTCP(...).WaitConnect().SendData(...).EndSettion(); auto A = Array.Map(...).Reduse(...).get(); こんな感じのことができるようになる。上は適当。 入ってくれー。
107 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 06:01:20.72 ID:uavAERV80.net] 糞化しようとする勢力に悪意があるな。
108 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 06:15:26.00 ID:NGOzoqth0.net] 一体何と戦っているんだ。
109 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 06:37:35.81 ID:PyeytVxV0.net] EndSession(SendData(WaitConnect(ConnectTCP(Handle, ...)), ...)); を Handle.ConnectTCP(...).WaitConnect().SendData(...).EndSession(); と書けるようにしたいと、そんな感じか? 元ネタの言語はなんだ?お兄さん怒らないから正直に申告しなさいw
110 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 07:18:06.9
] [ここ壊れてます]
111 名前:0 ID:fkuXV6f/0.net mailto: まあSettionとか言う奴のレベルはこんなもんだ [] [ここ壊れてます]
112 名前:デフォルトの名無しさん [2017/10/21(土) 07:40:07.85 ID:NrRI2kzj0.net] >>109 そう書きたいなら最初からそういうAPIにすればいいだけなんだよな
113 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 07:54:28.52 ID:uavAERV80.net] タイムアウトとか再試行とか異常系コードがてんこもりに入るんだからどうせ分解して書く。 そういう書き方をしたがる人は実務では一切コードを書いてない人だろう。
114 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 08:13:32.79 ID:SZJ3Irjn0.net] >>112 異常系を入れる場所も階層も選ばないとか昭和初期のプログラマーーカヨ; ていうか>>109 の書式のどっちも分けて書こうと思えば書けるし…
115 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 08:21:55.02 ID:uavAERV80.net] おれはこういう悪意ある黒魔術師と戦っている。
116 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 09:17:17.25 ID:fkuXV6f/0.net] ちょっとしたスクリプトとかの書き捨てならワンライナーって言うのもわからなくはないけどC++には要らんわな
117 名前:デフォルトの名無しさん [2017/10/21(土) 09:28:17.64 ID:K7BlTjWw0.net] 質問です。 int型のポインタが指す値に1を足したいのですが int *a+=1;と書くと足されるのですが int *a++;だと足されません これはなぜでしょうか?
118 名前:デフォルトの名無しさん [2017/10/21(土) 09:37:24.91 ID:IwpIepkb0.net] (*a)++; *(a++); 下の方になってね
119 名前:デフォルトの名無しさん [2017/10/21(土) 09:42:55.21 ID:K7BlTjWw0.net] なるほど! カッコを付けてあげれば良いのですね ありがとうございました。
120 名前:デフォルトの名無しさん [2017/10/21(土) 11:19:52.01 ID:uaVA6cYp0.net] 本質を理解しないと だめだぞ。
121 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 12:50:25.52 ID:bOloMtFq0.net] 本質ってなんや?
122 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 12:59:49.25 ID:OLnfmZiv0.net] 基本解ってないバカはC言語からやり直せ C++なんぞ十年早いわ
123 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 13:50:17.85 ID:RIH/f2PJ0.net] >>120 演算子には結合の優先順位があるからそれを理解しておけということかと。
124 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 13:53:20.33 ID:SZJ3Irjn0.net] 次はきっと評価順序に依存性がある複数の副作用を同じ式の中でやって泣く
125 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 14:08:40.10 ID:b0s0lkOv0.net] 本質と口走る人間は信用しないようにしている
126 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 14:27:26.13 ID:duVZds/m0.net] 2chは信用しているのかw
127 名前:デフォルトの名無しさん [2017/10/21(土) 14:35:07.96 ID:PVB7G2Ex0.net] ここは5chだが。
128 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 14:50:08.83 ID:fkuXV6f/0.net] >>126 俺はまだ2chから見てる mevius.2ch.net/test/read.cgi/tech/1507561894/126
129 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 19:41:59.47 ID:I0YX3jVB0.net] よし、>>116 からの流れを一言でまとめてやるぞ 必要なときはカッコつけなさい こうだ
130 名前:デフォルトの名無しさん [2017/10/21(土) 19:48:36.37 ID:LO7dvffl0.net] >>117 おまえ病院に行ったほうがいい 変数aの定義でとち狂っている>>116 より重症だぞ
131 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 20:09:03.62 ID:NGOzoqth0.net] >>109 Dにもあるらしいけど、元ネタは没になったペーパー。
132 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 20:11:00.84 ID:RIH/f2PJ0.net] >>129 初心者が質問でおかしな書き方したが、周りはその意味が分かって会話が通じているんだから、そんなつまらない攻撃的なツッコミする必要ないのでは?
133 名前:デフォルトの名無しさん [2017/10/21(土) 20:36:40.01 ID:LO7dvffl0.net] >>131 意味わかった気になってるのは陽性症状だよ 幻視でint *a=+1;が見えた禁治産者がなに必死こいてんだ?
134 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 20:43:36.23 ID:bW2z389o0.net] またすげえ病的なのが現れたな
135 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 21:07:43.36 ID:MOgwtCLBH.net] 妖精症状かは不明だが『周りはその意味が分かって会話が通じている』という決め付けは危険だし なにより相手に対して何の説得力も無い
136 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 21:08:16.87 ID:Hb3Ud/Wn0.net] ++*aでいいだろ
137 名前:デフォルトの名無しさん [2017/10/21(土) 21:37:44.98 ID:LO7dvffl0.net] >>135 よくねえよ int ++*a; で何を宣言できるん
138 名前:セ [] [ここ壊れてます]
139 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 21:46:20.40 ID:RIH/f2PJ0.net] 誰も変数の宣言を問題にしてないと思うよ。君を除いて。
140 名前:デフォルトの名無しさん [2017/10/21(土) 21:47:40.59 ID:vcAgy2myd.net] 知恵袋とかでよく見る質問者に説教してる奴まんまだwww
141 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 22:22:59.67 ID:fkuXV6f/0.net] 周りがわかってるかどうかはわからんけど>>117 はわかって質問者の>>116 と会話できてるからいいんじゃね?
142 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 22:29:56.31 ID:uaVA6cYp0.net] 俺が余計なこと言わなきゃよかったんだ
143 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 22:47:24.45 ID:PyeytVxV0.net] よし、みんな大好きコンセプトの話しようぜw
144 名前:デフォルトの名無しさん mailto:sage [2017/10/21(土) 23:16:03.82 ID:ov3vGz/Dr.net] >>141 requires { typename T::type{} } は文法的に正しいですか?
145 名前:名無しさん@そうだ選挙に行こう! Go to vote! [2017/10/22(日) 07:02:44.44 ID:dj2Vz85u0.net] >>137 それが本当なら揃いも揃って阿呆ばっかりということだ int *a+=1;で何が起きるのかを論じてこそC++の話だ スレ違いの阿呆どもは出て行け
146 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/10/22(日) 10:10:22.77 ID:ZvWpZB8L0.net] スレを私物化しててワロタwwwwwwwwwwwwwwwwwww
147 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/10/22(日) 10:29:24.17 ID:euCeLmcjM.net] >>143 そんなの使うな、で終わり。 議論する価値は無い。
148 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/10/22(日) 11:13:45.90 ID:Bsg7QecN0.net] うむ、これで>>116 の話は終わりだな めでたしめでたし
149 名前:名無しさん@そうだ選挙に行こう! Go to vote! [2017/10/22(日) 12:06:12.78 ID:W+EQ/H9/0.net] >>144 私物化はおまえだ C++の話をしろボケ
150 名前:名無しさん@そうだ選挙に行こう! Go to vote! [2017/10/22(日) 12:09:53.87 ID:W+EQ/H9/0.net] ひとつ手本を見せてやる #define a aa{nullptr}; aa int *a+=1; #undef a #define aa a おまえら(たぶん1人)はこれ以下の阿呆だ
151 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/10/22(日) 12:23:06.98 ID:fUpU+dpH0.net] レベル低い手本だな
152 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/10/22(日) 19:28:43.25 ID:O4jMcQm7d.net] typedefとdefineの違いすらわかってないのが俺 define A BだとAをBとする typedef B AだとAをBとする こうなるだけ?
153 名前:名無しさん@そうだ選挙に行こう! Go to vote! [2017/10/22(日) 19:37:19.87 ID:bXoG3HvV0.net] typedefなんかもう使うな これからはusingだ
154 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/10/22(日) 19:38:18.60 ID:rLWliBun0.net] >>150 #defineはソースコードのテキストを字面だけで置き換えるだけ。 typedef相当のこと以外にも色々な使い方ができるが、トリッキーなことをして分かりにくくなったり弊害が大きいので、言語仕様が拡充された現在では、なるべく使用すべきでないという風潮になっている。
155 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/10/22(日) 19:38:36.42 ID:NTIGbrlN0.net] defineは置き換えでtypedefは名前変更 #define SIZE 50, 200 void SetSize(int w, int h)をSetSize(SIZE)って呼ぶことができる typedefはtypedef std::vector<MyLonglongClassName> MyVector; とすることで短くできる
156 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/10/22(日) 19:42:10.58 ID:O4jMcQm7d.net] >>151 >>152 >>153 defineは俺の認識であってると思ってるけど typedefの名前変更ってなんなんだ defineでもint hage ってしちゃうと名前変更にならない?
157 名前:名無しさん@そうだ選挙に行こう! Go to vote! mailto:sage [2017/10/22(日) 19:49:02.84 ID:rLWliBun0.net] typedefで導入した識別子の名称は、型の名前としてコンパイラが字句解析、意味解析する際に適切に扱ってくれるけど、defineの方は字面を置き換えただけだから文脈によっては意図した通りにならないケースがある。 具体例はすぐに思いつかない… 誰か詳しい人が書いてくれるかも。
158 名前:デフォルトの名無しさん mailto:sage [2017/10/22(日) 20:24:28.58 ID:cygPpIjv0.net] typedef int *IntPointer; //A #define IntPointer int* //B //Aの場合: int x * const の意味となり、*xは変更可能 //Bの場合: const int *x と展開され、*xは変更不可能のためコンパイルエラー void f(const IntPointer x) { *x = 0; }
159 名前:デフォルトの名無しさん [2017/10/22(日) 20:29:43.27 ID:KI+QlBvW0.net] >>150 #defineは、厳密にはコンパイラの機能では無いんだよね。 ただのテキスト置換なんで、様々なチェックが働かない。 置換後のテキストに対してコンパイルを行うから、エラーも難解になったりする。 対してtypedefはコンパイラの機能。 型に対してのみ別名を付ける事しか出来ないけど、ちゃんと型チェックが行われる。
160 名前:デフォルトの名無しさん mailto:sage [2017/10/22(日) 21:05:01.87 ID:eZyQD2ui0.net] typedefを一切使うなというのは無理ゲーすぐる… std::vector<std::vector<int> > jug_array = new std::vector<std::vector<int> >(5000); for (std::vector<std::vector<int> >::const_iterator it = jug_array.begin(); it != jug_array.end(); ++it) { ... } とかゆうのはusingでは多分std::を削れるぐらいだと思う
161 名前:デフォルトの名無しさん [2017/10/22(日) 21:07:07.30 ID:Nihr2kgP0.net] そのusingではなく using hoge = int; のusingだろ
162 名前:デフォルトの名無しさん [2017/10/22(日) 21:50:12.47 ID:DuSJV2Ke0.net] 変数宣言に関してはC++03は苦行の極みだったな
163 名前:デフォルトの名無しさん mailto:sage [2017/10/22(日) 22:37:08.77 ID:gV0xEv2nr.net] typedef名が無いとintのデストラクターが呼べない using T = int; int{}.~T(); typedef名が無いと関数ポインターへの変換関数が書けない(たぶん) using F = void (); operator F *() {return nullptr;}
164 名前:デフォルトの名無しさん mailto:sage [2017/10/22(日) 22:44:21.85 ID:gV0xEv2nr.net] typedef名が無いと関数型をメンバーポインター型に変形させることができない using MF = void () const; MF class_type::* mp; そして何より、関数内で#defineしたものは関数外に漏れる
165 名前:デフォルトの名無しさん mailto:sage [2017/10/22(日) 23:08:06.76 ID:V6KHSGcm0.net] >>158 型推論でいいだろ auto jug_array = new std::vector<std::vector<int> >(5000); for(auto it = jug_array.begin(); it != jug_array.end(); ++it) { ... }
166 名前:デフォルトの名無しさん mailto:sage [2017/10/23(月) 00:28:15.86 ID:WKKpeTI2r.net] >usingでは多分std::を削れるぐらいだと思う ↓ >型推論でいいだろ これがアスペというやつだな
167 名前:デフォルトの名無しさん [2017/10/23(月) 00:38:49.98 ID:a4CoBhRy0.net] >>164 俺も思ったからアスペだわ
168 名前:デフォルトの名無しさん mailto:sage [2017/10/23(月) 01:19:27.04 ID:E0HRfOuJ0.net] >>164 がアスペという可能性も微レ存
169 名前:デフォルトの名無しさん mailto:sage [2017/10/23(月) 02:33:22.14 ID:4YhCJR4W0.net] アスペかどうかはわからないけど話の流れを追わないで字面で反応する人いるよね
170 名前:デフォルトの名無しさん [2017/10/23(月) 05:45:22.43 ID:iFI38Dlw0.net] %%%%1000%%%% 000-[HUM%58*73.1\%]/2I/3NM/61.3SNMK%?%3%51.22222222222221% 001-[[[%6/4$17.6135412α3]]]]+DOM+SIL+7% 002-UML7%[61.2[31.5[!%32∂LM17.36%!16.3!%<<<%!HSTOL7%!Q!S!=3m=<2TOL<3Q9A<2.1GHz%,DOK,HAOARA, 003-[[[HEMLOT47[<\41.2%Q,===>[MLS<DPNO<\2.3>#ESOLA!5%!3MLA!>LTOSA>7TONSA>%>%end
171 名前:デフォルトの名無しさん mailto:sage [2017/10/23(月) 06:00:11.73 ID:tsKHL/vaM.net] >>164 はあ? なに言ってるんだこいつ w
172 名前:デフォルトの名無しさん mailto:sage [2017/10/23(月) 07:39:17.13 ID:FnrJWB1+0.net] CPUはアスペルガー アスペルガーはプログラミング対象としては正しい
173 名前:デフォルトの名無しさん mailto:sage [2017/10/23(月) 11:48:03.94 ID:L0yyts890.net] そもそも>>158 も>>163 もコード間違ってるし バカってなんで要らんところでnew使おうとするかね
174 名前:デフォルトの名無しさん mailto:sage [2017/10/23(月) 11:49:59.55 ID:L0yyts890.net] あっそうかジャヴァカコーダー上がりか
175 名前:デフォルトの名無しさん mailto:sage [2017/10/23(月) 12:28:15.79 ID:L0yyts890.net] ヴァカ+auto→地獄
176 名前:デフォルトの名無しさん [2017/10/23(月) 15:37:17.98 ID:a4CoBhRy0.net] >>171 >>165 でアスペ認定された俺も思ったからお前もだな。
177 名前:デフォルトの名無しさん mailto:sage [2017/10/23(月) 20:39:12.10 ID:FnrJWB1+0.net] newはちょっと手が滑っただけ; もちろんスマポとセットで無いとnewとか滅多に使わない
178 名前:デフォルトの名無しさん mailto:sage [2017/10/23(月) 21:07:31.46 ID:/BPh9WwQM.net] auto知らなかった老害が暴れてるのか w
179 名前:デフォルトの名無しさん mailto:sage [2017/10/23(月) 22:09:17.50 ID:L0yyts890.net] >>176 糞ヴァカは二度と書き込むな w付けたってお前のヴァカさ加減が軽減されることはないからこのカス
180 名前:デフォルトの名無しさん [2017/10/23(月) 22:27:44.44 ID:D0YLsnUF0.net] C言語の知識があるんだけどC++も応用できる?
181 名前:デフォルトの名無しさん [2017/10/23(月) 22:37:44.10 ID:/pLbKGxJ0.net] できる!
182 名前:片山博文MZ mailto:sage [2017/10/23(月) 22:38:51.33 ID:aoVPN+Cqd.net] >>178 まずはデストラクターの便利さを学んでね。
183 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 00:14:32.80 ID:HCv33Y/ud.net] auto pointerのこと? あれいつ見ても使うタイミングわかんないや define typedefこたえてくれたひとありがとう >>156 のAのやつがなぜこうなるのか頭のなかでさっぱり理解できんけどがんばる
184 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 01:23:29.92 ID:6ceRFBNE0.net] オートポインターは廃止になった。 スマポ使おう。
185 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 01:26:01.20 ID:grT3veHx0.net] >>181 Aの場合はint * const x の間違いだろう。 int*型という1つの型全体にconstがかかっている。
186 名前:デフォルトの名無しさん [2017/10/24(火) 03:02:15.07 ID:Od9TZRLJ0.net] ポインタは型なのだろうか。
187 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 03:19:16.91 ID:F7KgZr1H0.net] コードの書かない奴ほどC++をやっつけスクリプト言語化しようとする。 auto馬鹿どもを駆逐せよ。
188 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 07:17:33.32 ID:4VNEc1KXM.net] >>177 , >>185 動的型付けと型推論の違いも理解できない老害ははやくくたばればいいのに
189 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 08:02:35.16 ID:/FFLOfov0.net] ヴァカが精一杯頑張って吐き出したクッサイ唾がこれ↑
190 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 08:42:18.81 ID:4VNEc1KXM.net] > 動的型付けと型推論の違いも理解できない老害 は否定できないんだ w
191 名前:デフォルトの名無しさん [2017/10/24(火) 10:20:18.72 ID:kyzMRAwBd.net] >>186 autoのことをanyやvariantと勘違いしてるとか?
192 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 12:37:21.38 ID:/FFLOfov0.net] そんな勘違いしてるとなんで思い込むか全く分からんわ まあヴァカの考えることなんて分かったら大変だけど
193 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 12:42:47.65 ID:/FFLOfov0.net] こいつの脳内には「動的型付けと型推論の違いも理解できない老害 」 とやらが住んでいてるんだろうな。 それ少し前のお前自身の姿だからゲラゲラ
194 名前:デフォルトの名無しさん [2017/10/24(火) 12:43:32.89 ID:Od9TZRLJ0.net] 世の中バカばかり、自分だけがよくわかっている。 ってことでしょうか。
195 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 16:53:21.77 ID:RCW9qhL70.net] こいつプログラミング板荒らしまわってる某コテハンと同じ臭いがする
196 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 17:21:11.13 ID:xOeS6ucYM.net] まぁ、もうそろそろNG設定かね。俺は設定した。 大した技術持って無さそうだし。
197 名前:片山博文MZ mailto:sage [2017/10/24(火) 17:41:23.62 ID:+CxSIN/Vd.net] 2ちゃんねるのコテハンにはろくなヤツがいないって、戦後生まれのじっちゃんが言っていた。
198 名前:片山博文MZ mailto:sage [2017/10/24(火) 18:40:29.57 ID:+CxSIN/Vd.net] そろそろ仕事やめて、めしにしようぜ カレーライスとお子様ランチのどっちがいい?
199 名前:片山博文MZ mailto:sage [2017/10/24(火) 18:53:07.38 ID:+CxSIN/Vd.net] ギロッポンでめしにすっべ 今日は俺のおごりだ
200 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 20:33:42.55 ID:4VNEc1KXM.net] >>190 いきなりスクリプトとか言い出した理由書いてみ どんな言い訳が見れるのか楽しみだよ w
201 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 20:44:02.68 ID:yRLde5ii0.net] >>176 左様 autoを見て嘔吐
202 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 20:53:50.44 ID:YuTKkjXTr.net] auto jug_array = std::vector<std::vector<int>>(5000); という書き方は2012年ごろにさっちんとメイヤーが広めようとしていた C++17でこの書き方が広まったら>>185 はもう出家するしかない
203 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 20:55:00.66 ID:FyKtaGrZ0.net] autoに関して応答なさそうですね
204 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 20:56:05.26 ID:YuTKkjXTr.net] 昭和のアロマが強烈
205 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 21:14:49.95 ID:yRLde5ii0.net] 良く考えずに書いたが良く考えたら普通は std::vector<std::vector<int>> jug_array(5000); と書くところだったなあ…
206 名前:デフォルトの名無しさん [2017/10/24(火) 21:50:21.25 ID:018tmIsf0.net] UWPスレとか毛色が違うみたいだし、C++/CLIスレとか落ちてるんでここで教えて下さい VS2017のC++/WinRTで新しいプロジェクトを作成 (Visual C++ → Windowsユニバーサル → 単体テストアプリ) 実行すると TEST APP 、Unit Test 、Tests Running の3つの文字が出てくるウィンドウが出てきます しかし、UnitTestApp.xaml の Application要素の中身は、空っぽです 新しくブランクページを作ると、Page要素になって、デザインできる上にボタン等を貼り付けると Page要素の中に要素が作られます Application要素の中身は一体どこにあるのでしょう?
207 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 22:02:36.84 ID:hjkLVxi70.net] >>204 Xamarin Part6 mevius.5ch.net/test/read.cgi/tech/1508367307/
208 名前:デフォルトの名無しさん mailto:sage [2017/10/24(火) 22:15:38.33 ID:018tmIsf0.net] >>205 そっちになるんですね、失礼しました、>>204 は取り下げて移動します
209 名前:デフォルトの名無しさん [2017/10/25(水) 18:49:27.48 ID:qOXOqU1a0.net] c++でダックタイピングのようなものをやりたいです。 void型で受け取ったクラスを自前で用意したインターフェースクラスにキャストして関数を呼び出すって可能ですか? やり方や参考になるサイトなどあれば教えて欲しいです。 templateでの型消去はコンパイル段階でクラスを知らないせいで弾かれてしまっているようです……
210 名前:デフォルトの名無しさん mailto:sage釣 [2017/10/25(水) 19:02:03.57 ID:16XMr+7o0.net] vfptrの実装状況によるから、未知の抽象クラスのメソッドって 呼べないと思うんだが
211 名前:デフォルトの名無しさん [2017/10/25(水) 19:20:07.39 ID:qOXOqU1a0.net] >>208 ありがとうございます やっぱクラスの構成わかんなきゃアクセスしようがないですよね…… exeのlibに依存せずになんとかdll開発できないかと考えてたんですが無理そうですね 諦めます
212 名前:デフォルトの名無しさん mailto:sage [2017/10/25(水) 19:21:19.49 ID:Srjg9fpL0.net] >>207 っinterpret_cast? その代わり、ちゃんと素養のまともなモノを使わないとみ定義でPC死ぬからな。
213 名前:デフォルトの名無しさん mailto:sage [2017/10/25(水) 19:28:12.28 ID:Srjg9fpL0.net] https://msdn.microsoft.com/ja-jp/library/e0w9f63b.aspx reinterpret_castだった。 かなり危ない。
214 名前:デフォルトの名無しさん [2017/10/25(水) 19:38:49.97 ID:qOXOqU1a0.net] >>210 ありがとう。これだと型確認回避できるのか……希望が見えてきました ちょっと試してみます。
215 名前:デフォルトの名無しさん [2017/10/25(水) 20:09:22.57 ID:r5sy60NsM.net] おおっと、auto の話題には注意しないとな。
216 名前:デフォルトの名無しさん mailto:sage [2017/10/25(水) 20:51:07.58 ID:t7oUy/d3r.net] 昭和生まれの老害はそろそろ引退すべき
217 名前:デフォルトの名無しさん mailto:sage [2017/10/25(水) 20:55:21.88 ID:SS3Ej639M.net] 64年生まれの妹が不憫でならない
218 名前:デフォルトの名無しさん mailto:sage [2017/10/25(水) 22:31:10.63 ID:Nep/tIRvd.net] .outからsoファイル呼び出す形を作ってるのだけど 変数の共有するのってグローバル変数にするのとシングルとんみたいなの作る以外にある? 関数の引数にはできない状態だと
219 名前:デフォルトの名無しさん [2017/10/26(木) 01:08:27.67 ID:KrANDw+50.net] >>216 グローバル「関数」内にstatic変数なんてどう? ちょっと範囲が狭くなるけど、スレッドローカルストレージとかも。
220 名前:デフォルトの名無しさん [2017/10/26(木) 01:17:12.83 ID:SQPezUK20.net] >>200 OSや組み込み、ドライバでその書き方が広まったら認めてやるよ。 使い捨て、やっつけコードしか書かない小便垂れ小僧が。
221 名前:デフォルトの名無しさん [2017/10/26(木) 02:08:33.19 ID:s0ODk43E0.net] イッツautoマーチック
222 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 03:38:24.52 ID:H69oM85Y0.net] >>216 俺は何かの設定じみたものは環境変数に入れとくこともある。 言語問わず子プロセスでも使えて便利。
223 名前:デフォルトの名無しさん [2017/10/26(木) 08:42:36.44 ID:KrANDw+50.net] >>219 まんまやん
224 名前:デフォルトの名無しさん [2017/10/26(木) 08:43:28.94 ID:KrANDw+50.net] >>220 ああ、確かに環境変数も使うね。
225 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 14:14:49.39 ID:yHns7wn+p.net] >>218 パッケージソフトやゲームはガン無視か
226 名前:デフォルトの名無しさん [2017/10/26(木) 14:32:13.77 ID:3HeaIUwTd.net] OSと組み込みとドライバって特権階級かなんかなの?
227 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 14:59:42.90 ID:97gM9QaUa.net] >>218 がその世界しか知らない(それ以外は俺にはかんけーない)ということにじゃないかな
228 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 16:12:23.15 ID:fpqT055X0.net] OS内部とかドライバとか、位置によってはメモリ確保の方法変わってくるし 組み込みで動的にメモリ確保とか怖くってやってらんねーとかじゃい? 静的か自動変数にインスタンスの実体置くなら一応なんとかなるんだろうけど・・・ いや、静的だとコンストラクタがくっそ面倒か? auto とか生きてくるのって、 大抵ばかすかコンテナに要素しこたま抱える様な用途だしな
229 名前:223 mailto:sage [2017/10/26(木) 16:48:19.15 ID:sfpBhfHr0.net] いやautoの議論にケチつけたつもりは無いよ(俺も滅多にauto使わんし C++の実用される現場といえばOS、組み込み、ドライバくらいしか挙げない人が多いから釘刺したかっただけ
230 名前:デフォルトの名無しさん [2017/10/26(木) 17:11:31.86 ID:kUEk6KjE0.net] auto使わないとか頭固すぎ 使えるところは全てautoだわ
231 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 17:59:27.25 ID:obzhKUOY0.net] 単なるシンタックスシュガーでなんのオーバーヘッドや副作用があるわけじゃ無いしな
232 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 18:40:54.94 ID:se7vIA1E0.net] auto下痢症
233 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 18:55:08.38 ID:EF3aiwNW0.net] autoネタ大人気だな 俺もiteratorなんかじゃ迷わずauto使うけど ポインタすらちゃんと理解してないような奴が無闇にauto使ってるのを見るとね
234 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 18:57:53.27 ID:KmwbyHDC0.net] それ以上autoの話をするのはアウトだぞ
235 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 19:55:30.03 ID:se7vIA1E0.net] おぉっと
236 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 20:20:21.90 ID:8UQnYlEC0.net] 同じ話題ばかりで食傷気味、もう吐きそう。 …というこの書き込みも同系ネタで済まぬ。
237 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 22:27:19.25 ID:oyaJ8gC3M.net] >>229 auto を単なるシンタックスシュガーと言うのもどうかと思うが とりあえず使わないと言う選択肢はないわ
238 名前:片山博文MZ mailto:sage [2017/10/26(木) 22:29:12.27 ID:LcK6lNJBd.net] 暇潰しに https://github.com/katahiromz/TextCanvas でも見て行って
239 名前:デフォルトの名無しさん mailto:sage [2017/10/26(木) 22:31:49.27 ID:6866r+hk0.net] 嘔吐嘔吐、うるせーなぁ(´・ω・`)
240 名前:デフォルトの名無しさん [2017/10/27(金) 04:04:41.73 ID:lyx9X4ms0.net] >>228 同感
241 名前:デフォルトの名無しさん [2017/10/27(金) 08:02:50.09 ID:O+M8u5Cb0.net] >>233 >>233 >>233
242 名前:デフォルトの名無しさん [2017/10/27(金) 08:33:50.52 ID:beF6mKBOd.net] C++使わないとか頭固すぎ 使えるところは全部C++だわ
243 名前:デフォルトの名無しさん mailto:sage [2017/10/27(金) 08:39:18.11 ID:2A0a9mBA0.net] 単なるシンタックスシュガーでオーバーヘッドとか副作用無いしねw
244 名前:デフォルトの名無しさん mailto:sage [2017/10/27(金) 08:39:47.11 ID:2A0a9mBA0.net] いやテンプレートは違うか
245 名前:デフォルトの名無しさん [2017/10/27(金) 08:41:10.57 ID:Aa1jtLeH0.net] 実は>>213 は、>>233 のパクリ
246 名前:デフォルトの名無しさん [2017/10/27(金) 09:37:02.86 ID:EP/R3fy90.net] ID:2A0a9mBA0 ←こういう馬鹿が本当にC++使ってるとは思えない。無職だろう。
247 名前:デフォルトの名無しさん mailto:sage [2017/10/27(金) 09:50:50.86 ID:+sOx5VXfM.net] auto絶対使わないマンってややこしい型も、全部手で書いてるの? ET使うときとかどうしてんだろ。
248 名前:デフォルトの名無しさん mailto:sage [2017/10/27(金) 10:00:22.45 ID:tbT2n0brd.net] テンプレートを除いた部分は単なるシンタックスシュガーだよ? o->vftbl->f(o, a) と書こうが o->f(a) と書こうが何の違いもない。 テンプレートはチューリングマシンとしての計算能力があるから別だけど。
249 名前:デフォルトの名無しさん mailto:sage [2017/10/27(金) 10:25:02.18 ID:n3hllmLr0.net] >>245 ET使う時って評価するときか? auto a = b + c * d; これやるとautoの型は式テンプレートで、評価が起きないから困ったことになるぞ (まだ評価せずに組み合わせる場合は逆にautoが便利だけど) ET作るときや実装時は確かに型がややこしいけど、普通returnの一文で終わるから return {うんたらかんたら}; で済むと思う あと、ET周りの関数の宣言時をautoでやってしまうと、実装完了まで使用できないというのが足かせになると思うぞ
250 名前:デフォルトの名無しさん mailto:sage [2017/10/27(金) 11:54:16.72 ID:2++1MvhW0.net] auto使うのって例えば template <class U, class V> auto func(U& a, V& b) -> decltype(a + b); みたいに戻り値の型が簡単に推測しにくい時に使ってるけどな
251 名前:デフォルトの名無しさん mailto:sage [2017/10/27(金) 19:49:19.03 ID:+sWf4zsJ0.net] auto LocalFunc = [&]() { ... };
252 名前:デフォルトの名無しさん [2017/10/27(金) 22:31:31.38 ID:67YjQzLBM.net] >>248 そのautoは型推論のautoとは違う使い方だよね。 戻値の後置宣言都合によるプレースホルダ的な。
253 名前:デフォルトの名無しさん mailto:sage [2017/10/27(金) 22:53:59.94 ID:cIkV9qHA0.net] 同じだろう
254 名前:デフォルトの名無しさん mailto:sage [2017/10/28(土) 01:40:27.36 ID:rDr3prXm0.net] mapみたいな複数行にまたがるようなのを for( auto const & r: hoge ){} とかにまとめる用途にしか怖くて使えんな 意図しない型になってたけどたまたまコンパイルに通ってたとか 後で仕様変更とか根元の hoge 書き換え後にたまたまコンパイルに通ってたりとかで 期待したメソッドの動作にならなかったりとかされるとハマりそうで怖い
255 名前:デフォルトの名無しさん [2017/10/28(土) 02:17:51.25 ID:pC+TnRxI0.net] >>252 暗黙の型変換乱用しないかぎりそんな事ならんと思うが
256 名前:デフォルトの名無しさん mailto:sage [2017/10/28(土) 08:28:41.62 ID:Jnrw/MWj0.net] テクノロジーに善悪は無い
257 名前:デフォルトの名無しさん mailto:sage [2017/10/28(土) 08:44:41.02 ID:rDr3prXm0.net] >>253 暗黙の云々とかoperator=とかが怖いってだけ それに後から読み返した時、どんな戻り値が欲しかったのかとか autoだとわかり辛いって事がままあるし、autoはなるべくあちこちに散乱させたくない .NET方面のvarとかも気持ち悪いったらありゃしない・・・
258 名前:デフォルトの名無しさん [2017/10/28(土) 08:56:43.01 ID:JVsxHO5Xd.net] autoの数々の利点のほうが大きいからどの言語でも型推論は基本になってきてるな メイヤーズも言ってるしマイクロソフトも推奨してるし
259 名前:デフォルトの名無しさん [2017/10/28(土) 09:55:15.82 ID:QoaQu2To0.net] autoはどのように推定されるかを理解して使うもので、 断じてバカ用のヘルパーではない バカ自身はそれがわからないから変な杞憂に陥るってだけ
260 名前:デフォルトの名無しさん mailto:sage [2017/10/28(土) 11:02:25.42 ID:J8kLZQh+0.net] バカだけどIDEさんが、IDEさんさえいてくれれば大丈夫だ問題ない
261 名前:デフォルトの名無しさん mailto:sage [2017/10/28(土) 12:14:14.53 ID:BDtptoiy0.net] 初心者はまずauto使わずにプログラミング出来るようになってからにした方がいいね
262 名前:デフォルトの名無しさん mailto:sage [2017/10/28(土) 17:38:09.89 ID:VIxhg0oq0.net] auto使わずにコンパイラの警告レベルを最高、警告は即エラーって設定にして テンプレートライブラリ使ったテストプログラムを書いてみると autoのありがた味が分かると思う。 ループの制御変数の型がえらいことになったりするからな。 いわんやイテレータをや。
263 名前:デフォルトの名無しさん mailto:sage [2017/10/28(土) 22:00:09.12 ID:Jnrw/MWj0.net] 例えば Bar x; auto z = x; としたときに、zはの型は必ずBarになってBarの基底クラスになったりしないの?
264 名前:片山博文MZ mailto:sage [2017/10/28(土) 22:00:59.73 ID:TWx2GtJid.net] >>261 インスタンスとクラスを区別せよ。
265 名前:デフォルトの名無しさん mailto:sage [2017/10/28(土) 22:03:17.64 ID:Jnrw/MWj0.net] Barの基底クラスがFooだとして、 実はBarはコピコンがprivateでなぜかoperator Foo()だけがpublicで定義されているかもしれない かもしれない運転、
266 名前:デフォルトの名無しさん mailto:sage [2017/10/28(土) 22:11:30.59 ID:Jnrw/MWj0.net] あるいは class Foo { void assign(const &Foo) { ... } // (A) }; class Bar : public Foo { void assign(const &Foo) { ... } // (B) }; Foo x1, x2; Bar y; auto z = x1; z.assign(x2); // (C) y = z; とかなときに(C)で呼ばれるassign()はどっち?
267 名前:片山博文MZ mailto:sage [2017/10/28(土) 22:12:10.53 ID:TWx2GtJid.net] >>264 試せばわかる。
268 名前:片山博文MZ mailto:sage [2017/10/28(土) 22:16:47.80 ID:TWx2GtJid.net] 参照なしのautoで代入だから、この場合は同じ型でコピーだね。メソッドは仮想関数でもないから、同じクラスのメソッドが呼ばれるはずだ。
269 名前:デフォルトの名無しさん mailto:sage [2017/10/28(土) 22:57:04.67 ID:Jnrw/MWj0.net] C++で起き得るBarとFooのパターン全てについてテストケースを考えるのは無理ゲーすぐる、 auto儲はどのようにして有限の人生と無限に近い(ときに想像を絶する結果をもたらす)C++の自由度との折り合いを付けているのであろうか…
270 名前:片山博文MZ mailto:sage [2017/10/28(土) 23:02:38.36 ID:TWx2GtJid.net] かしこいIDE使ってるなら、ビルドしたらその場でautoの型がわかるはず。スマートに行こうぜ、スマートに。
271 名前:デフォルトの名無しさん mailto:sage [2017/10/28(土) 23:49:55.51 ID:n2BUqhCar.net] struct S {}; using Bar = S const; Bar x; auto z = x; 必ずしも同じ型ではないな
272 名前:デフォルトの名無しさん [2017/10/29(日) 01:18:54.15 ID:jdBIz2nU0.net] >>263 それがどんな問題が起きると? >>264 Bar使われてないじゃん
273 名前:デフォルトの名無しさん [2017/10/29(日) 05:32:17.05 ID:0yKrkLYC0.net] 大量のC++のコードを読み、大量のC++を書いてきた人は今更シンタックスを変えようとは思わない。 碌にコードを読んだことがない、書かない人が文法を変えたがるのだ。 外国人の日本語入門者が「は」と「が」が難しいからautoにしろ、どっちの意味かは読む人、聞く人が考えろと言ってるうなもの。 ひらがなとカタカナを統一しろとかね。日本人ならそうは思わない。日本語を使い続けて必要な理由を知ってるから。 日本語から「が」がなくなれば不便で仕方がない。 だからauto使いは大学デビューとか言われるのだ。未だコードネイティブではないのだ。 10年使ってからautoが必要かどうか考えろ。答えは明らかだ。
274 名前:デフォルトの名無しさん [2017/10/29(日) 07:32:07.72 ID:m60zTw010.net] > 大量のC++を書いてきた人は今更シンタックスを変えようとは思わない。 これは嘘 autoだけでなくtrailing return typeやusing aliasなど かゆいところにやっと手が届いたシンタックス変更は大歓迎している C++11以後に拒否反応しまくって、未だにC++98のマゾプレーを続行中の変態は 頭固すぎだ # 自分で言うのも何だが、俺に頭固いなんて言われるのは極端すぎだ
275 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 07:55:51.29 ID:Heo7FnD+0.net] >>270 藻前の呼びたかったassign()は実はFoo::assign()(基底クラスの方)だったかもしれないじゃん?
276 名前:デフォルトの名無しさん [2017/10/29(日) 08:02:49.06 ID:5nFESEae0.net] ところでこれからC++を始めたいのだが、純粋にC++が始めたいのではなくてc言語の代わりとして C++を使ってみたい。多少なりともC++
277 名前:フ方が便利だろうとおもうから。一つ二つ制約があって ROMが256バイトしかない。RAMが8Kしかない。こういう場合に今までROM48Kバイト、RAM8K バイトでおさまっていたプログラムをC++で移植するのは余裕だろうか? それとも便利になる分 スペースがとられてRomエリアが少なすぎるってレベルだろうか? [] [ここ壊れてます]
278 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 08:05:45.00 ID:6IgW6Wrm0.net] アセンブリで書けるレベルじゃね?それ。
279 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 08:07:50.71 ID:XRmGRjwZ0.net] >>271 要出典:auto使いは大学デビュー ラムダ式を変数に入れたいときはどうやるの? コンテナのイテレータを変数に入れたいときは型名全部書くの? std::bindの戻り値を変数に入れたいときはどうするの? 何でもかんでもauto使うのはどうかと思うがこういう面倒なところはautoでいいんじゃね
280 名前:片山博文MZ mailto:sage [2017/10/29(日) 08:09:27.19 ID:k1qoOab2d.net] >>274 メモリーをけちるなら、STLとかテンプレートとか呼ばれるものはあまり使わない方がいい。 std::coutなどのストリームもダメだ。あれは遅いし、バカ食いする。
281 名前:デフォルトの名無しさん mailto:sage釣 [2017/10/29(日) 08:10:20.13 ID:XyYI0EpP0.net] cでもキツいな
282 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 08:14:51.32 ID:Heo7FnD+0.net] 多分printf()がリンクされたら死ぬレベル
283 名前:片山博文MZ mailto:sage [2017/10/29(日) 08:19:49.13 ID:k1qoOab2d.net] >>274 256KBの間違いだろ? まずは、メソッド、デストラクタ、std::stringの3つを学習してみな。便利だとわかるから。
284 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 08:25:23.25 ID:XRmGRjwZ0.net] >>274 ROMは256Kの誤記だとして RAM8Kはきついな マイコン向けの開発環境も無償版や評価版なんてのがあるから一回試した方がいいと思う コンパイラのオプションで例外と実行時型情報はOFFにするのを忘れずに C++のコンテナクラス(std::vectorやstd::string)はメモリ不足で使えなさそうだな
285 名前:デフォルトの名無しさん [2017/10/29(日) 08:51:05.52 ID:5nFESEae0.net] ROMは256kの間違い。外部RAMは256kbある。(ただしSPIでアクセスするので遅い) だから8kは純粋にワークとして使える。 8kのRAMがきついと思うのは何故? C++もワークはスタックを使うと思うけど、プログラムの実行エリアとして例えばクラスインスタンスを 作るのにRAMを消費することになるんだろうか? 動的にインスタンスを作成するとそのクラスが大きいと RAMエリア(mallocで確保してロードしたら、解放するまではRAMエリアを使う)を圧迫することになる。 ということはRAMをあまり消費しない手法ってあるんだろうか?
286 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 09:18:10.76 ID:Heo7FnD+0.net] 普通は処理系が要求するコード、CONSTデータ、、スタック、初期値付きデータ、BSSの各セクションを プログラマーが明示的にリンカに指示して割り当てさせるんじゃね;; これはCもC++も同じなのでCでのやり方を理解しているなんならC++でも同じようにやれば良い (グローバルなオブジェクトの構築と破棄の手当てが追加になるだけぐらいしか違いが無い
287 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 09:30:39.20 ID:XRmGRjwZ0.net] >>282 最適化切って動作確認したり、デバッグ用のコードを仕込んだりしてると8Kは意外とすぐに使いきれてしまう 当然プログラムの規模や書き方によるところだから必ず足りないわけではないけど C++だから足りないというわけではない 元のプログラムがCで書かれてて8Kで動いてたならまぁ大丈夫か
288 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 09:31:08.74 ID:Heo7FnD+0.net] >>282 >8kのRAMがきついと思うのは何故? 全てはID:5nFESEae0が上記各セクションをROMやRAMにどのように割り付けようとしているのかにかかってゐるのだが、 仮にスタックと初期値つきデータとBSSを全部8 KBのRAMに割り付けた場合、 コード以外の全て(malloc()含む)のメモリ消費がトータルで8 KBに収まらねばならず、 メモリ不足のせいでやれることは相当にきびしくなるとおもー
289 名前:デフォルトの名無しさん [2017/10/29(日) 09:38:54.44 ID:0yKrkLYC0.net] ID:XRmGRjwZ0 > RAM8Kはきついな > コンパイラのオプションで例外と実行時型情報はOFFにするのを忘れずに > C++のコンテナクラス(std::vectorやstd::string)はメモリ不足で使えなさそうだな こいつレベル低すぎだろ。ド素人にもほどがある。 完全に組み込み経験なしじゃねーか。学生じゃねーのか。
290 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 09:49:26.98 ID:6IgW6Wrm0.net] コンテナクラスの消費バイトは12バイト。だっけ?
291 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 09:56:55.29 ID:Heo7FnD+0.net] sizeof(コンテナクラス)すればワカル、 ただしコンテナに要素の追加でmalloc()される分は別枠
292 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 10:05:31.40 ID:NWVP0NdTH.net] >>274 論外 勉強目的だろ 自称プロでも 8kB なんて環境で組んだことのある人間なんて少数 普通はデフォルトのスタックサイズやvtableの存在すら知らん 考え直せ
293 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 10:24:19.89 ID:9Q+tOYh80.net] Microchip マイコン PIC24FJ128GA006-I/PT 16ビット RISC PIC24FJ, 32MHz, 128 kB フラッシュ, 8 kB RAM, 64-Pin jp.rs-online.com/web/p/microcontrollers/6230897/ 8KB RAM は、400円のPIC マイコンとかだろ そもそも、C++ のコンパイラが無い
294 名前:デフォルトの名無しさん [2017/10/29(日) 10:29:34.45 ID:5nFESEae0.net] コンパイラはありますよ。C/C++とうたってるので恐らくC++もできると思うが、、、 TIとかHewとか他にもKeilとか
295 名前:デフォルトの名無しさん [2017/10/29(日) 10:41:22.70 ID:5nFESEae0.net] >グローバルなオブジェクトの構築と破棄の手当てが追加になるだけぐらいしか違いが無い おお、心強いお言葉。 例えば class MyClass { int buf[1000]; int no = 0; void inputdisp(int aa){ sprintf(buf," aa=%d",aa); } }; int sub1() { MyClass aaa; aaa.disp(333); return 0; } こういう場合はaaaはbufは2000バイトのRAMを使うけれども、stackに確保するんだろうか? aaa自体はrom上にできると考えていい? それなら、cと混在で徐々にC++に変えていく程度でも問題ないのかなとは思っている。
296 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 10:52:19.32 ID:Heo7FnD+0.net] >>292 >aaa自体はrom上にできると考えていい? 質問の意味不明 再入力せよ
297 名前:デフォルトの名無しさん [2017/10/29(日) 11:05:38.47 ID:5nFESEae0.net] 動的にNewを使ってインスタンスを生成した場合には、コードは必
298 名前:然的にRam上に置かれる。しかしスタティックに 生成した場合は、Code部分は原理的にはRom上にも置くことができる。そういう機能があるかどうか?って質問。 [] [ここ壊れてます]
299 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 11:08:14.46 ID:Heo7FnD+0.net] >>294 >動的にNewを使ってインスタンスを生成した場合には、コードは必然的にRam上に置かれる。 断じて否 こういう手合いに騙されてはいけない
300 名前:デフォルトの名無しさん [2017/10/29(日) 11:14:29.67 ID:jdBIz2nU0.net] >>292 aaaもbufも同じ場所。大抵のコンパイラでは同じアドレスを指す。C解るならclassをstructに置き換えて考えたらいい。それと一緒。
301 名前:片山博文MZ mailto:sage [2017/10/29(日) 11:15:45.86 ID:k1qoOab2d.net] operator newの再定義ね。
302 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 11:29:26.33 ID:Heo7FnD+0.net] ていうか>>294 ハ質問者本人かしつれいorz >>292 のMyClass::inputdisp(int aa)のコードは、名前が適当にマングルされて(*1) void hoge(MyClass* this, int aa) // (1) という2引数の関数としてコードセクションにコードが格納される、というのが真実(*2)(*3) オブジェクトaaaを動的にNewを使ってインスタンスを生成しようがスタティックに生成しようが、 そんなこととは無関係に、aaa.inputdisp((int型データ))というメソッドの呼び出しは(1)の関数呼び出しにコンパイルされる *1: ここでは簡単のため’hoge’という名前にマングルされたとしている。本当は引数の型や戻り値も情報として含む名前になるが省略 *2: C++の言語規格でそうせよ決まっているかどうかは知らないが、そう処理する処理系しか無いと思う *3: コードセクションがROM上なのかRAM上なのかはプログラマーがコードセクションをどう割り付けたかによる
303 名前:デフォルトの名無しさん [2017/10/29(日) 12:14:39.69 ID:5nFESEae0.net] >296 うろ覚えで使ってるが、 Section Type of Memory Section Type of Memory .bss RAM .stack RAM .data RAM .sysmem RAM .text ROM これがコード部分 .その他 ROM こういうのがある。 Hewの場合#pragumaでセクションを生成できたとおもうが、一般的に#pragma とかで割り当てできるんだろうか? 今回はTiのコンパイラを使う予定なので初めての試み。 多分 static Myclass aaa; みたいにスタティックかなにかを冠して宣言すれば.textにコードは配置されると思うが、どうなんだろう。 スタティックなんだから原理的には配置はどうにでもなる筈。
304 名前:デフォルトの名無しさん [2017/10/29(日) 12:18:36.34 ID:5nFESEae0.net] 問題はスタティックにした場合, コードは.textに配置されるとしてもdataが.dataに配置されると非常にまずい。 スタックでやってもらえないと困る。
305 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 12:34:41.62 ID:n8H8yUIJM.net] >>300 関数が再入されることを考えたら普通にスタックに配置されると思うよ。 むしろstaticにしたらスタックには配置されない。 ここまでインスタンスの話。 コードはいずれにしても.textに配置されると思うよ。特に指定がない限り。でもそれは>>300 にとっても問題にならないかと。
306 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 12:40:57.57 ID:oFRxn/Jf0.net] >>289 30年ぐらい前に ROM2KB, RAM2KB の Z80 ボード用プログラムをC言語で作ったことあるよ。
307 名前:デフォルトの名無しさん [2017/10/29(日) 12:43:00.92 ID:5nFESEae0.net] 例えば、パネル表示をまとめたクラスのような場合にはクラスのメソッド部分が非常に大きくなる。しかもライブラリ 的に使うわけだから、階層のわりと下で使うことになる。3階層あって、2階層目くらいから同時にいくつかが 生成されてしまう可能性も高い。するとRAMエリアが直ぐにパンクする。なのでメソッドを大量に含んだライブラリ的な 働きをするクラスに関しては、.textにあってほしい。それは可能だと思うがじゃあそのクラス内でつかうバッファなどの 変数なんかが問題になる。これは動的に生成しないとクラスの使い道が非常に限られてくる。第一suba()で使っていて subb()で使うとバッファエリアが壊れてしまう。 1.bufを持てないクラスなんて殆ど意味がない。 2.bufをスタティックにしか配置できないクラスなんて使い道がない。 3.小規模マイコンでメソッドをramに確保するなんて馬鹿げている。 これは明らかだよね。 つまりMyclassのbuf[1000]、メソード関数()(例えば50個)をスタックと.textにそれぞれ上手く配置する工夫が 絶対に必要ってことだね。
308 名前:デフォルトの名無しさん [2017/10/29(日) 12:45:06.72 ID:5nFESEae0.net] >コードはいずれにしても.textに配置されると思うよ。特に指定がない限り。でもそれは>>300 にとっても問題にならないかと。 であれば何も問題ないですね。
309 名前:sage mailto:sage [2017/10/29(日) 12:54:06.20 ID:t3scGPtZ0.net] 組み込みはPCで動くの違って配置も考えないといけないから大変だな マイコンでの配置に関してはここより組み込みが普通の電電板のマイコンスレでの方が良いような気がするが。
310 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 16:49:46.36 ID:9sOuhtQV0.net] >>274 純粋にC言語の書き方するだけならコンパイラの能力次第だと思う
311 名前:デフォルトの名無しさん [2017/10/29(日) 18:26:51.08 ID:5nFESEae0.net] ヘッダファイルに型定義して、実装をCPPに書くのってどうかなーと思う。特に組み込み だとファイルを分ける意味がわからない。分けるとクラスのイメージが掴みにくい気がする。
312 名前:片山博文MZ mailto:sage [2017/10/29(日) 18:28:45.31 ID:k1qoOab2d.net] >>307 コンパイル時間短縮とか中身の隠蔽とかしたいなら、ソースとヘッダーを分けてもいいんじゃね?
313 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 18:58:48.05 ID:9sOuhtQV0.net] >>307 その定義した型を他のファイルから使う時はどうするのさ? 単一のファイルしか使ってないなら分ける必要はないけど
314 名前:デフォルトの名無しさん [2017/10/29(日) 19:08:11.02 ID:5nFESEae0.net] クラスってのは型の定義なんだから、使う時は全部インクルードではだめなの? 例えば clsAAA.h clsBBB.h ... clsXXX.h main.cpp の中で include "cls\clsAAA.h" include "cls\clsBBB.h" .... include "cls\clsXXX.h"
315 名前:デフォルトの名無しさん [2017/10/29(日) 19:13:52.28 ID:5nFESEae0.net] >コンパイル時間短縮とか中身の隠蔽とかしたいなら、ソースとヘッダーを分けてもいいんじゃね? 100個くらいクラスがあってもどってことないと思うが、、、ロード時間が問題になるんだったら clsディレクトリにクラスファイルを入れて prtディレクトリにメソッドを実装しない型だけ抜き出したのを入れといて、xxx.prtをインクルードする 方がいいと思う。
316 名前:デフォルトの名無しさん [2017/10/29(日) 19:15:39.48 ID:5nFESEae0.net] prtは自動生成できるって前提だy。
317 名前:デフォルトの名無しさん [2017/10/29(日) 19:18:10.19 ID:5nFESEae0.net] やっぱりメッソドがデータなんかと分離するのはわかり難い。他のオブジェクト指向のコンパイラでもそんなことはしないしね。
318 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 19:21:46.87 ID:qxWnFrvp0.net] ヘッダだけだと循環参照起きるし、循環参照起きるところだけcppってのも気持ち悪い
319 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 19:34:33.73 ID:XE573cMW0.net] >>313 分けなきゃいけないことはない 分けた方が効率が良い(場合が多い)というだけだから 理解した上で敢えて分けないならそれはそれで好きにすれば良い
320 名前:片山博文MZ mailto:sage [2017/10/29(日) 19:36:43.09 ID:k1qoOab2d.net] >>314 inlineキーワード使って定義もヘッダーに書いちゃえば?
321 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 20:07:38.66 ID:9sOuhtQV0.net] >>307 > ヘッダファイルに型定義して、実装をCPPに書くのってどうかなーと思う。 >>310 > クラスってのは型の定義なんだから、使う時は全部インクルードではだめなの? いったい何をどうしたいのかさっぱりわからん
322 名前:デフォルトの名無しさん [2017/10/29(日) 20:13:48.53 ID:5nFESEae0.net] >314 前方宣言でいいのでは? そういうのは特殊な場合だけだから
323 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 22:07:47.02 ID:qxWnFrvp0.net] >>318 class Aからclass Bのメソッドを呼んで class Bからclass Aのメソッドを呼ぶ場合前方宣言だけでは無理なはず
324 名前:片山博文MZ mailto:sage [2017/10/29(日) 22:10:20.28 ID:k1qoOab2d.net] >>319 宣言を両方最初に書いておき、定義を後に書く。
325 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 22:21:25.90 ID:qxWnFrvp0.net] >>320 class Aとclass Bが同じファイルで定義されてるならいいかもしれないけど、そうじゃない場合のほうが多いでしょ
326 名前:デフォルトの名無しさん [2017/10/29(日) 22:40:54.16 ID:5nFESEae0.net] いづれにしてもメソッドをばらして別ファイルに書くほうが良いという根拠にはならんだろ。
327 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 22:52:18.92 ID:qxWnFrvp0.net] 一部分けなきゃできないところがあるから全部分けるだけで、できるならc#とかみたいに全部一つのファイルに書きたい
328 名前:デフォルトの名無しさん mailto:sage [2017/10/29(日) 23:53:27.12 ID:OlzRTZr+0.net] それだとクラスが縦に長くなって範囲がぱっと見わからなる 1クラス1ファイルの場合はいいけどさ
329 名前:デフォルトの名無しさん mailto:sage [2017/10/30(月) 01:18:16.05 ID:ImI1HNcW0.net] てかコードの利用者はヘッダしか見ねーんだから普通に分けとけよ
330 名前:デフォルトの名無しさん [2017/10/30(月) 03:59:29.97 ID:XQpDzkmg0.net] >323 できないところってどんなところ? C#にできてC++にできないなんてどういうことか意味わからん。 cls::とか邪魔くさい。悪しき慣習だろ。あまりにばかげてるからC#では止めにしただけでしょ。
331 名前:デフォルトの名無しさん [2017/10/30(月) 05:31:15.27 ID:shFErbol0.net] >>323 一部だけ分けりゃいいじゃん それとシングルソースにしちまうと分担がしにくいだろ
332 名前:デフォルトの名無しさん mailto:sage [2017/10/30(月) 09:03:26.26 ID:d9bwD/eVM.net] >>327 ヘッダとソースを分けないでって意味でシングルソースってことではないと思うぞ
333 名前:はちみつ餃子 mailto:sage [2017/10/30(月) 10:19:54.36 ID:/9ncNuq00.net] モジュールについては検討中みたいだからそのうち仕様に入るんじゃね? コンセプト並みのビッグトピックだからどんどん後ろ倒しされそうな気もするけど。
334 名前:デフォルトの名無しさん mailto:sage [2017/10/30(月) 22:49:10.56 ID:ao9CiOaa0.net] vector<shared_ptr<T>>を使う場合、 shared_ptrから自分自身のvector上のindexを取得するにはvector要素を1つずつ走査していくしかないんかね? vector[0]のアドレスをうまく引き算すればうまくいくかと思いきや、 shared_ptr自体は同じアドレスを持つインスタンスがvectorに格納されているわけでないのでうまく行かんのです
335 名前:デフォルトの名無しさん [2017/10/30(月) 23:15:50.92 ID:GaTL14js0.net] >>330 基本的には無理。 何らかの基準でソート状態を保たせていれば、バイナリサーチ系の処理(lower_boundとか)が使えるので、必ずしも一個づつチェックする必要は無い。
336 名前:デフォルトの名無しさん mailto:sage [2017/10/31(火) 01:31:02.70 ID:Bb7HxcAo0.net] もしindexが変わらんのであれば別にmap<shared_ptr<T>, int>持つとか Tにindex持たせるとか
337 名前:デフォルトの名無しさん mailto:sage [2017/10/31(火) 06:49:36.25 ID:/ULkeF1E0.net] cppで作ったライブラリ(.a)をcに取り込むときって何か注意いる? cppには公開apiを1つ用意して、そのなかでクラスを作って計算させようとしてる
338 名前:デフォルトの名無しさん [2017/10/31(火) 08:34:02.64 ID:tApLOrdW0.net] >>333 その公開apiをextern "C"するのを忘れない事。
339 名前:はちみつ餃子 mailto:sage [2017/10/31(火) 09:33:49.44 ID:54GXLgHP0.net] extern "C" しとかないと大抵はリンクの段階で失敗してくれるから、そんなにおかしなことにもならないだろうけどね。 あとは C++ 側で作ったライブラリから例外が送出されると C 側を通過できなくてクラッシュする環境がある。
340 名前:デフォルトの名無しさん mailto:sage [2017/10/31(火) 11:08:02.92 ID:B8ReYjkr0.net] >>300 やり方しだいジャネーノ?C++推奨しないが、スタックが〜 ramが〜っていうなら自分で管理するか、newに任せるにして実験すればいいんじゃね? #include <stdio.h> #include <string.h> char buf_hige[1000]; class Hoge { private: char *m_pBuf; int m_size, m_IsNew; public: Hoge(char *p, int s) { m_size = s; m_pBuf = p; m_IsNew = 0; } Hoge() : m_size(100) { m_pBuf = new char[m_size]; m_IsNew = 1; } ~Hoge() { if (m_IsNew) { delete[]m_pBuf; printf("~Hoge()自動削除\n"); } else printf("~Hoge()\n"); } void zero() { memset(m_pBuf, 0, m_size); } void show() { printf("アドレス %p size %d\n", m_pBuf, m_size); } }; void main() { char buf_hoge[200]; Hoge a(buf_hige, sizeof(buf_hige));// 自分でメモリー割り当ててクラスを使う 普通は ram.. #pragmaとかで移動できる? Hoge b(buf_hoge, sizeof(buf_hoge));// 自分でメモリー割り当ててクラスを使う mainのstack Hoge c;// 内部でnew/deleteして動的に使う ram a.zero(); b.zero(); c.zero(); a.show(); b.show(); c.show(); }
341 名前:デフォルトの名無しさん mailto:sage釣 [2017/10/31(火) 14:04:56.90 ID:QkT+8axj0.net] 普通の opereter new 定義するだけじゃ駄目なの?
342 名前:デフォルトの名無しさん mailto:sage [2017/10/31(火) 15:27:26.38 ID:ivXWtcCM0.net] その例なら m_pBuf とか m_size とか m_isNew がどこに置かれるかって話してるんだよ
343 名前:はちみつ餃子 mailto:sage [2017/10/31(火) 15:50:52.40 ID:54GXLgHP0.net] >>300 リンカスクリプトで定義できるんじゃねーの
344 名前:デフォルトの名無しさん mailto:sage [2017/10/31(火) 20:31:59.83 ID:cRyJj2TVM.net] >>331 >>332 返信thx やっぱむりかー。index持たせる方向で検討します
345 名前:デフォルトの名無しさん mailto:sage [2017/11/01(水) 09:45:22.08 ID:Rrk0WseL0.net] >>338 リンカーでMAP指定して確認したらいいんじゃねーの?アドレスわかるだろ?
346 名前:デフォルトの名無しさん mailto:sage [2017/11/01(水) 23:49:32.94 ID:KV/dR0JW0.net] 共用体って使い道あるの? 素人目からしたら役に立つようには到底思えない
347 名前:はちみつ餃子 mailto:sage [2017/11/02(木) 00:33:40.96 ID:4tfXXWiS0.net] 使わずに済むならそれにこしたことはないだろうけど、 部分的に動的型みたいにしたいときは有るよ。 yacc が生成するコードに出てきたりする。
348 名前:デフォルトの名無しさん mailto:sage [2017/11/02(木) 01:14:44.84 ID:6O09mL2X0.net] >>342 例えば通信パケットとかで必ず固定長だけど、複数の箇所のコマンドとか意味とかのコードで 内容がコロコロ変わる様な時は便利かも知れない? それぞれの構造体にキャストしろよって言いたくもなるけど、 複数の人で開発してると通信パケットの内容とかで下らない不具合出したくないから 1つのヘッダで全部規定したりって事はあったな
349 名前:デフォルトの名無しさん mailto:sage [2017/11/02(木) 01:35:58.84 ID:6O09mL2X0.net] あ、後H8開発してた時とか、メモリマップドIOとかがモードでコロコロ意味変わる時、 1バイトのデータになったりビットフィールドになったりなとことかがunionになってた
350 名前:デフォルトの名無しさん mailto:sage [2017/11/02(木) 04:56:03.82 ID:i8MAyZKO0.net] union RGBA{ struct {R:5,G:5,B:5,A:1}; std::uint16_t Colors; }; こんな感じのことするけど。たまに。
351 名前:デフォルトの名無しさん mailto:sage [2017/11/02(木) 04:57:25.31 ID:i8MAyZKO0.net] あ、片宣言抜けてた。 たまにしか使わないからなぁ。 struct {std::uint16_t R:5,G:5,B:5,A:1};
352 名前:デフォルトの名無しさん mailto:sage [2017/11/02(木) 09:40:30.47 ID:N8nuZaLN0.net] union { double d; int i; char c;} u; は1番大きな要素、この場合は double d のサイズと メモリアライメントを持つというのが union の重要な機能 これのおかげで非ワード境界からワードを読もうとするようなコードを避けられる
353 名前:デフォルトの名無しさん [2017/11/02(木) 21:55:55.26 ID:JP+uyw1T0.net] #pragma data_seg でdllの共有領域を作ってるんですけど ここにクラスのインスタンスを置いておくことはできますか?
354 名前:デフォルトの名無しさん mailto:sage [2017/11/02(木) 22:11:01.00 ID:e7UKjGN4F.net] コンストラクタのない、構造体にメンバ関数付いただけのクラスのインスタンスなら大丈夫じゃないかな。 動的にメモリをアロケーションするクラスではアロケーションしたメモリは共有されないので注意。
355 名前:デフォルトの名無しさん mailto:sage [2017/11/02(木) 22:11:46.90 ID:m+SMCXhed.net] ↑ 共有されないってのは「プロセス間で」ということね
356 名前:デフォルトの名無しさん mailto:sage [2017/11/02(木) 23:18:08.17 ID:H/ANuUhm0.net] >>348 『プログラミング言語C』のmalloc()の実装例のやつで見た
357 名前:デフォルトの名無しさん mailto:sage [2017/11/03(金) 00:39:07.86 ID:Xm/a3Zyv0.net] 共用体は、パリティチェックで使う あるサイズの内容を、ある方法で計算して、データが破壊・改変されていないか。 通信データが正しいかどうか
358 名前:デフォルトの名無しさん mailto:sage釣 [2017/11/03(金) 01:31:20.38 ID:f3hy7vD8M.net] >>349 確保済みのメモリブロックに対してのobject new 演算子ってのが あるはず
359 名前:デフォルトの名無しさん [2017/11/03(金) 07:14:49.06 ID:3SB+84d60.net] 境界調整はalignasでできるようになった
360 名前:デフォルトの名無しさん mailto:sage [2017/11/03(金) 18:27:07.09 ID:6x/Gce9W0.net] string::format()マダァー? <<は失敗だったって早く認めようぜ
361 名前:デフォルトの名無しさん mailto:sage [2017/11/03(金) 21:32:49.68 ID:A4m/loi/0.net] printf()系関数とstring::c_str()(ていうかbasic_string<T>::c_str())があるから無問題
362 名前:デフォルトの名無しさん mailto:sage [2017/11/03(金) 21:34:26.06 ID:A4m/loi/0.net] 入力はscanf()系とか使うとCの経験が長いプログラマーには軽蔑の眼差しで見られるが cinとかより速くて使い勝手も良いのだから仕方が無い
363 名前:デフォルトの名無しさん mailto:sage [2017/11/03(金) 21:46:14.60 ID:+rn5t+yk0.net] boost::format よく使ってる
364 名前:デフォルトの名無しさん [2017/11/03(金) 23:08:11.68 ID:veVAWEWL0.net] 可変テンプレート使えるんならprintfにクラス喰わせたりすることぐらいできるだろ
365 名前:デフォルトの名無しさん mailto:sage [2017/11/04(土) 00:02:18.18 ID:9Iye7uTf0.net] snprintfじゃstringstreamの代わりとしては役者不足だろ
366 名前:デフォルトの名無しさん mailto:sage [2017/11/04(土) 07:27:21.97 ID:CbR/PKzh0.net] 「役者不足」は造語なんで使わないほうが無難
367 名前:デフォルトの名無しさん [2017/11/04(土) 09:25:02.17 ID:v7stxdd6M.net] >>362 しかも「役不足」じゃあ、「役より実力が遥かに高い」の意味だしね。
368 名前:デフォルトの名無しさん mailto:sage [2017/11/04(土) 12:54:53.20 ID:z55RyEJo0.net] 「力不足」な
369 名前:デフォルトの名無しさん mailto:sage [2017/11/04(土) 14:09:16.93 ID:CaxSQdEs0.net] >>361 全然wwwwwwwwwww 自作クラスのシリアライズ/デシリアライズの下請け関数として使う分には 機能上全く困らない上に速いのだから で、シリアライズ/デシリアライズおあ void ISeriarizable::seriarize(FILE* fp)とvoid ISeriarizable::deseriarize(FILE* fp) にして「<<」や「>>」のオーバーロードみたいな変態じみたことはせずに同等の柔軟性を確保できる
370 名前:デフォルトの名無しさん mailto:sage [2017/11/04(土) 14:29:00.75 ID:+71Y93dj0.net] 設計が古いな。
371 名前:デフォルトの名無しさん [2017/11/04(土) 15:30:32.32 ID:2OIo1NJb0.net] cin,cout って組み込みで使えるんかい? 何処をどう書き換えるとそうなるん?
372 名前:デフォルトの名無しさん [2017/11/04(土) 15:34:07.08 ID:2OIo1NJb0.net] string s1("foo"); const char *p = NULL; p = s1.c_str(); cout << p << endl; return 0; ???? cout << s1<<endl; じゃダメなん?
373 名前:デフォルトの名無しさん [2017/11/04(土) 22:22:05.63 ID:2OIo1NJb0.net] Coutを実験してみたがコードがバカでかくなるので駄目だな。組み込みでは使えない。
374 名前:デフォルトの名無しさん mailto:sage [2017/11/04(土) 22:34:50.04 ID:WXoZTt/lM.net] >>369 組み込みで何をやりたいのか知らんけど普通coutを書き換えるだろ
375 名前:デフォルトの名無しさん mailto:sage [2017/11/04(土) 22:37:40.26 ID:z55RyEJo0.net] 組み込みに使うなら実験とかじゃなくちゃんとどんなコードか把握しろよw怖いわ
376 名前:デフォルトの名無しさん mailto:sage [2017/11/04(土) 22:57:54.30 ID:GShvEvWZ0.net] そもそも組み込みの標準入出力がどんなもんなのかすら想像できないw
377 名前:デフォルトの名無しさん mailto:sage [2017/11/04(土) 23:37:09.27 ID:wPtyVAZ40.net] 組み込みでは使えないなんていう次元ならそもそも標準ライブラリ使わないだろ
378 名前:デフォルトの名無しさん [2017/11/05(日) 00:56:53.05 ID:1GSqUY/t0.net] デバッグ担当「なぁ?なんかログにアホとかハゲとかあるんだけどナニコレ?オレの事おちょくってんじゃねーだろうなぁ?!あ!!!!」
379 名前:デフォルトの名無しさん [2017/11/05(日) 05:24:49.90 ID:qHZ+DCMx0.net] streamの変更ムズいんだけど。 入力だとstreambufのunderflow実装すると思うけど、エラー発生したときどうやってistreamに通知すんの?
380 名前:デフォルトの名無しさん [2017/11/05(日) 06:18:13.15 ID:vRj0Z3ir0.net] struct lock_interrupt { lock_interrupt() : masked(get_imask_ccr()) { set_imask_ccr(1); } 〜lock_interrupt() { set_imask_ccr(masked); } bool masked; }; // in some function... lock_interrupt lk; // do critical action, lets forget unmask interrupt flag! } このコード lock_interrupt() : masked(get_imask_ccr()) { ここの部分の”:”ってどういう意味なの? 何となくコンストラクタとディストラクタがせっとになってるだろうなー だから”}”に出会うと自動的にディストラクトされるコードだろうか? ってくらいしかわからないレベルだから、、、、是非ともこのコードを 使い倒してみたい。
381 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 06:23:01.44 ID:U5vPVsbz0.net] メンバイニシャライザでググれ てか初等文法くらい勉強しろよ
382 名前:デフォルトの名無しさん [2017/11/05(日) 06:27:09.42 ID:vRj0Z3ir0.net] >組み込みで何をやりたいのか知らんけど普通coutを書き換えるだろ ん? 普通はcoutを使わないという意味だろうか? それなら同意する。 #include <iostream> を追加しただけで256kbyteを超えてしまう。これではマイコンじゃ使えないな。 もちろんcoutが使えないって意味だよ。使えないなら書き換える? まあそれは むりだな。なぜなら書き換える場合でもiostramをインクルードするひつようがあるからね。 つまり書き換えなんてできない。つまり使えないし使わない。すなわち結論としては Cのsprintfを使うってのが順当かと思う。
383 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 06:30:56.15 ID:U5vPVsbz0.net] >>376 あとついでにクラス全体を説明すると、コンストラクタで割り込みをマスクして デストラクタで元に戻している。 こんな感じで使う void foo () { lock_intterupt lock; // 以下割り込み禁止 if (...) { .... return; } ..... return; } 割り込み禁止を解除するコードを書き忘れたり複数書いたりせずに済む。
384 名前:デフォルトの名無しさん [2017/11/05(日) 06:35:39.18 ID:vRj0Z3ir0.net] >メンバイニシャライザでググれ キーワードありがとう。 ググってみた。メンバーイニシャライザってことはわかったんだがなんか特殊だな masked = get_imask_ccr(); こういうことか? なるほど。
385 名前:デフォルトの名無しさん [2017/11/05(日) 07:06:11.45 ID:vRj0Z3ir0.net] ここでlockという名称は何でもいいんですよね。要するにstructを生成するだけだから。 2か所でlockしたいような場合には使えないという欠点があるね。 void foo() { lock_intterupt lock; // 以下割り込み禁止 if (...) { .... return; } lock.unlock(); ..... ..... ..... lock.relock(); // ここでも割り込み禁止 if (...) { .... return; } ..... return; // ここでlock(割り込み禁止)した部分が解除される。 } こうするにはどうしたらいい?
386 名前:デフォルトの名無しさん [2017/11/05(日) 07:09:12.73 ID:vRj0Z3ir0.net] なんでclassにしないでstructなのだろうか?
387 名前:デフォルトの名無しさん [2017/11/05(日) 07:26:22.28 ID:vRj0Z3ir0.net] C++の本見るとcout,cinの例が必ず出ているが、これは大きな間違いだな。なぜなら 1.マイコンではiostremは馬鹿でかくて使えない。だからcout,cinは使えない。 2.じゃあパソコンで使うのかというと、パソコンならjavaかC#があるのにC++なんて 使うのは間違い。 以上の理由からサンプルにcout使うのは馬鹿。
388 名前:デフォルトの名無しさん [2017/11/05(日) 07:28:47.99 ID:vRj0Z3ir0.net] というか、もっとmiimaizeしたiostream実装しろよな。といいたい。
389 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 08:04:41.58 ID:3uuR82Hq0.net] >>381 > 2か所でlockしたいような場合には使えないという欠点があるね。 ブロックも知らんのかよ... void foo(){ { lock_intterupt lock; // 以下割り込み禁止 if(...){ ... return; } } ... ... { lock_interrupt lock; // ここでも割り込み禁止 if(...){ ... return; } } return; // ここでlock(割り込み禁止)した部分が解除される。 }
390 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 09:19:24.45 ID:fHP76uUy0.net] メンバーイニシャライザーなんて上級者向け
391 名前:デフォルトの名無しさん [2017/11/05(日) 09:44:11.28 ID:vRj0Z3ir0.net] >>ブロックも知らんのかよ... そういうのがあったのか。 ブロックってスコープだけの問題ではないんだ。 スコープ外れるとディストラクトされるんだ。 いがいと使えるなー。
392 名前:デフォルトの名無しさん [2017/11/05(日) 09:47:03.86 ID:vRj0Z3ir0.net] >メンバーイニシャライザーなんて上級者向け イニシャルなんて基本中の基本なのに、上級者でしか使えないほど分かりづらい構造になっている。 素直に=をつかったらいいのにな。
393 名前:デフォルトの名無しさん [2017/11/05(日) 09:49:48.35 ID:vRj0Z3ir0.net] lock_interrupt(){ masked = get_imask_ccr(); set_imask_ccr(1); } これでいいじゃん。
394 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 10:01:45.17 ID:U5vPVsbz0.net] 物知らず自慢されても周りの人は当惑するだけですよ。 メンバーイニシャライザが何故必要なのかはメンバーイニシャライザでググってください。
395 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 10:06:52.16 ID:+AqtjiW/0.net] 自虐ネタですかね?
396 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 10:08:40.02 ID:t3ZH1B/20.net] このスレ和むね
397 名前:デフォルトの名無しさん [2017/11/05(日) 10:23:28.34 ID:vRj0Z3ir0.net] メンバーイニシャライザでググると メリット1:const指定のメンバ変数の初期化ができる メリット2:メンバイニシャライザの方が効率的 メリット3:クラスを継承する場合は、メンバイニシャライザに基底クラスのコンストラクタを記述します。 メリット4:メンバイニシャライザを使えるようになると、プログラミングが上手になったような気分になれます。 とあるが、 1はあまり意味がない。constを初期化しないで使うケースは皆無。 2は理由が不明。わかり難いし、効率が変わる理由がない。効率を変えることができるなら、コンストラクタの効率も上げればいいだけだ。 3も意味不明だ。基底クラスのコンストラクタをイニシャライザに記入する必要性がないと思うが、出来ないのか? この方法でしか できないのならそれはデメリットというのが正しい日本語だ。 4はこれが最大のメリットだろうな。
398 名前:デフォルトの名無しさん [2017/11/05(日) 10:28:17.46 ID:vRj0Z3ir0.net] 結論 テクを自慢したい人以外はメンバーイニシャライザは使うべきではない。
399 名前:デフォルトの名無しさん [2017/11/05(日) 10:30:41.33 ID:qHZ+DCMx0.net] >>393 代入するまでそれがどういう状態になるのか考えた?
400 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 10:31:58.48 ID:GarpakNhr.net] >>393 の文才に嫉妬
401 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 10:33:41.73 ID:PHl2cqXG0.net] 上級者すげー
402 名前:デフォルトの名無しさん [2017/11/05(日) 10:38:30.72 ID:vRj0Z3ir0.net] >代入するまでそれがどういう状態になるのか考えた? ん? constとは定数ですよ。代入なんてありえません。設定です。コンパイラーがシコシコ考えて設定済みです。 プログラムが走る時には最初から決まってるもの、最初を決めるのに別にイニシャライザで やろうが、コンストラクタでやろうが関係ないです。はい。 ちがった?
403 名前:デフォルトの名無しさん [2017/11/05(日) 10:42:52.94 ID:qHZ+DCMx0.net] >>398 うん。君はC++使わない方がいいね。
404 名前:デフォルトの名無しさん [2017/11/05(日) 10:44:47.64 ID:tNj/Rw6Vd.net] c#とかのconstと勘違いしてない?
405 名前:デフォルトの名無しさん [2017/11/05(日) 10:51:53.00 ID:bjKo+Lyid.net] 初期化と代入の違い constとコンパイル時定数の違い
406 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 10:52:44.25 ID:W+ILxFMJ0.net] >>398 適当にググって済ますんじゃなくて真っ当なc++本を一通り読んでから帰ってこい。 あと組み込みを前提に考えるのもやめとけ。
407 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 11:05:07.65 ID:3uuR82Hq0.net] >>398 > constとは定数ですよ。 残念ながら違う class c { private: const int n; public: c(const int x): n(x){} ... } なんてことができる
408 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 11:16:27.20 ID:+AqtjiW/0.net] >>402 そんな本は存在しない。
409 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 11:25:28.59 ID:edJGSUmw0.net] メンバーイニシャライザの構文は必要悪 だとは感じる 基底クラスやconstメンバの初期化構文が別途必要だったというのは必要悪ながら必要性がワカルが その他のメリットはあんまはっきりしない
410 名前:デフォルトの名無しさん [2017/11/05(日) 11:38:09.47 ID:vRj0Z3ir0.net] >class c { >private: > const int n; >public: > c(const int x): n(x){} > ... >} >なんてことができる。 定数ではなくて、変更禁止の変数ってことだね。それにどれだけ意味があるんだろう。 イニシャライザ―でしか変更できないんでしょ。クラスを生成したときにしか設定できない変数になる から、定数と同じ機能しかないよ。 const int n = 9600;って書く方が分かりやすい。 しかし別のインスタンスを生成する時は c rs(115200);みたいに初期値を変更したい場合がある。これを実現できるのはイニシャライザ以外にはないってことか。 なるほど。 全く意味がないってことはないな。たしかにメリットはある。
411 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 11:46:
] [ここ壊れてます]
412 名前:35.42 ID:8p1KlMD80.net mailto: 目醒ましたら香ばしいのがおるなあ [] [ここ壊れてます]
413 名前:デフォルトの名無しさん [2017/11/05(日) 11:49:30.00 ID:vRj0Z3ir0.net] 結論を変更 メリット1:クラスのインスタンスごとにconst指定のメンバ変数のユニークな初期化ができる メリット2:const指定のメンバ変数はユニークに設定できるにも拘わらずコードをまったく消費しない。
414 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 11:50:18.72 ID:brx6OlnVM.net] >>405 まあ構文はわかり辛いよな int n; で定義してるのに : n(1) とかはあ?って感じだし かと言って c(): n = 1 {} って言うのもなれてないせいかいまいちだしね
415 名前:デフォルトの名無しさん [2017/11/05(日) 12:04:33.48 ID:vRj0Z3ir0.net] コンストラクタの構文があるんだから並置してつくるべきだね。 たとえはこんな感じだ。 class cass { private: const int n; public: cass(const int x){} cass{ n = 9600 } ... }
416 名前:デフォルトの名無しさん [2017/11/05(日) 12:06:36.32 ID:vRj0Z3ir0.net] ~cass()があるんだから !cass()でもいい。
417 名前:デフォルトの名無しさん [2017/11/05(日) 12:25:46.31 ID:bjKo+Lyid.net] >>406 > const int n = 9600 って書く方が分かりやすい C++のconstは、ユーザー入力など実行時に決まる値に固定化した変数を作れる
418 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 12:29:36.35 ID:uz/X8WP/M.net] >>410 こいつはコンストラクタを複数持てることも知らんのか... マジで初心者スレに行けよ 【初心者歓迎】C/C++室 Ver.102【環境依存OK】 mevius.2ch.net/test/read.cgi/tech/1509780815/
419 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 12:31:24.75 ID:uz/X8WP/M.net] >>412 そう言う意味ではC#のreadonlyの方が近い感じだな
420 名前:デフォルトの名無しさん [2017/11/05(日) 12:58:59.38 ID:vRj0Z3ir0.net] >C++のconstは、ユーザー入力など実行時に決まる値に固定化した変数を作れる 実行時は無理でしょ。インスタンス生成時でしょ。見かけ上実行時にインスタンスを生成することで 可能というだけですよね。
421 名前:デフォルトの名無しさん [2017/11/05(日) 12:59:54.85 ID:vRj0Z3ir0.net] >こいつはコンストラクタを複数持てることも知らんのか... オーバーロードってことかな? イニシャライザとはなんも関係ないね。
422 名前:デフォルトの名無しさん [2017/11/05(日) 13:00:39.74 ID:vRj0Z3ir0.net] >あと組み込みを前提に考えるのもやめとけ。 C++は組み込みにしか活路がない。というか組み込みに特化すべきだと思う。 PCの場合はJavaとかC#の方が圧倒的にいいからね。 組み込みにCではなくてC++を使うべき最大の理由は? 最大のメリットはScopeが使えることだと思う。NameSpaceとかブロックとかだね。 まあClassの基本構造もスコープを制限できるという意味では含める。これらを使うだけでも 価値がある。 Cでは少しプログラムが大きくなると名前付けで混乱してくる。多少はコード効率が落ちてもC++の方がいい。 C++はすでに化石かと思っていたがなかなか使えそう。
423 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 13:07:42.41 ID:CS19J9ATM.net] 普通にデータベースとかC++で書かれてるが…
424 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 13:12:57.94 ID:PxmV+gVs0.net] 多分パフォーマンス重視のソフトとか一つも知らないんじゃね
425 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 13:15:03.92 ID:+AqtjiW/0.net] 速度が要求される用途ということは、アセンブラの代替としての言語なのだ。 高級言語志向の奴はKotlinでも使ってろ。
426 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 13:17:22.43 ID:PxmV+gVs0.net] C++で数百万行になるプロジェクトをアセで書けと?
427 名前:デフォルトの名無しさん [2017/11/05(日) 13:18:14.72 ID:bjKo+Lyid.net] >>415 たとえばインスタンス生成時のシステム時刻をconst変数にセットするとする。 これを実行時と呼ばずになんと呼ぶんだ?
428 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 13:31:02.52 ID:kyKiHR5g0.net] メンバイニシャライザって、基本だろ。 初期化と代入は異なるから、マシン語も異なるし、効率的 君らは、実行ファイル中の、BSS セクションとか、 異なるセクション
429 名前:フデータが、異なるマシン語になる事も、知らんのか? [] [ここ壊れてます]
430 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 13:47:24.79 ID:+AqtjiW/0.net] もはやマシン語がバズワードに見える
431 名前:デフォルトの名無しさん [2017/11/05(日) 13:47:40.95 ID:bjKo+Lyid.net] >>423 そんなのはプロでもなきゃあまり知らないんじゃない?
432 名前:デフォルトの名無しさん [2017/11/05(日) 13:52:54.16 ID:vRj0Z3ir0.net] >たとえばインスタンス生成時のシステム時刻をconst変数にセットするとする。 >これを実行時と呼ばずになんと呼ぶんだ? クラスを起点で説明するときには、実行時というのはクラスインスタンスのメソードを実行したり プロパティにアクセスする時が実行時だね。 インスタンス生成時とは区別したほうが分かりやすい。 クラスは大まかには 1.生成して 2.実行して 3.消滅する というサイクルがある。 constは生成時にしか設定できない。
433 名前:デフォルトの名無しさん [2017/11/05(日) 13:59:00.72 ID:bjKo+Lyid.net] >>426 少なくともC++においては実行時とは「コンパイル時」に対比する言葉だ。 「クラスを起点に説明する」なんて知らんがな 独自定義か?
434 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 14:41:08.77 ID:3uuR82Hq0.net] >>415 > 実行時は無理でしょ。インスタンス生成時でしょ。見かけ上実行時にインスタンスを生成することで > 可能というだけですよね。 見かけ上? 意味わからん インスタンス生成時=実行時なんだが w >>416 オーバーロードしたコンストラクタ毎に異なる初期値を与えられるんだが>>410 の構文でどうやって実現するつもりなんだよ w
435 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 14:59:59.34 ID:NfAeb+vj0.net] メンバイニシャライザの構文、 class Aclass { public: Aclass(int val) : _member(val) {} ... } の評判が悪いけど、C++11から使えるようになった{}初期化なら いくらかマシじゃないかな。 class Aclass { public: Aclass(int val) : _member {val} {} ... } メンバに初期値を与える部分が関数呼び出しに見える、 という事態は解消されてるかと。
436 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 15:13:21.78 ID:edJGSUmw0.net] >>409 なんでそのnのケースで構文を新たに作る話になりますか…
437 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 15:37:01.01 ID:U5vPVsbz0.net] お前ら T t(args); って形の初期化付き変数宣言使ったことも見たこともない素人ばかりかよ... インスタンスとクラスの違いも知らずに他人と話そうとする迷惑な人もいるし。
438 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 15:40:38.86 ID:+AqtjiW/0.net] 自虐ネタするときはひろしですって言ってください。
439 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 15:47:09.77 ID:3uuR82Hq0.net] >>430 ん? > まあ構文はわかり辛いよな って言う日本語を理解できない人なの?
440 名前:デフォルトの名無しさん [2017/11/05(日) 16:23:38.88 ID:vRj0Z3ir0.net] >オーバーロードしたコンストラクタ毎に異なる初期値を与えられるんだが>>410 の構文でどうやって実現するつもりなんだよ w ass():{ assmember = 12; }{ .... } ass(int you ):{ assmember = 99 }{ .... }
441 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 16:32:02.93 ID:3uuR82Hq0.net] >>434 しれっと>>410 の構文変えてどうするよ w >>410 の時点じゃ知らなかったんだろ?
442 名前:デフォルトの名無しさん [2017/11/05(日) 16:34:19.30 ID:vRj0Z3ir0.net] 知らないでもすぐにまともな構文が考え付くというのに、わざわざ仕様を変更したというのに またしてもろくでもない構文とは、どういうことだ。
443 名前:デフォルトの名無しさん [2017/11/05(日) 16:38:07.45 ID:qHZ+DCMx0.net] こんな浅い思いつきだけで喋ってるやつによくつき合ってるな
444 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 17:21:19.00 ID:edJGSUmw0.net] >>433 > まあ構文はわかり辛いよな という国語はわかったつもりだったが>>409 のような変態構文の追加提案に至る必然性がわからん… そのケースならコンストラクタ内でn=1でええやん? なお初期化と代入は違うという意見は コンパイラのコピコン呼び出し回数削減最適化を前提とする限り、 あんまメンバ初期化構文の支持理由としては弱いかなと、(いうのが元レス>>405
445 名前:デフォルトの名無しさん [2017/11/05(日) 17:33:27.29 ID:qHZ+DCMx0.net] >>438 コピー出来ないクラスはどうすんだよ。コンストラクタ内でのメンバーの代入はメンバーの構築とみなすという特殊ルールでも付けるのか?
446 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 17:35:00.88 ID:3uuR82Hq0.net] >>438 >>409 の構文にケチをつけたいだけなのはわかったよ
447 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 17:42:24.41 ID:3uuR82Hq0.net] >>439 > コピー出来ないクラスはどうすんだよ。 const 云々言ってるなかで>>438 みたいなレスする程度の理解力だから許してやれよ w > コンストラクタ内でのメンバーの代入はメンバーの構築とみなすという特殊ルールでも付けるのか? C#のreadonlyはそんな感じだな
448 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 17:44:56.54 ID:edJGSUmw0.net] >>439 まあYESということもできる クラスFooのメンバm_a (∈クラスT)は、Fooのコンストラクタ実行前に構築されているはずはないのだから m_a = (some クラスTのオブジェクト) というのがコンストラクタ内に現れたら、むしろそれを代入と解釈するわけにはいかない すわなち話がただちにコピコンの出番に絞られる
449 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 17:53:44.93 ID:edJGSUmw0.net] >>441 ちょっ漏れもconst云々は>>405 で言及済みなんだがガン無視カヨ 何でも俺の仕業かよ… >>440 いや新たな構文の追加提案自体の罪を問いたい >>405 の通り、基底クラスとconstメンバの初期化については現行のメンバ初期化構文は必要悪なんであって、 それ自体は全否定まではしないが、 基底クラスとconstメンバの初期化以外の用途はコンストラクタ内でのメンバへの(一見)代入(に見える構文)で十分なのでわ!? というのが漏れのスタンス
450 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 17:58:22.61 ID:edJGSUmw0.net] まあ漏れの案の欠陥としては、 コンストラクタ内でthisを他の関数bar()(すでにコンパイル済みかもしれない)に渡して barの中でthis->m_aに代入するのはどうなんじゃ、というのはあるが (C#はこの点現行C++と同じ実行時コストを支払っているハズ… つまりデフォルトコンストラクタでFoo::m_aを構築した状態でコンストラクタに入る
451 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 17:59:06.73 ID:3uuR82Hq0.net] >>443 > 基底クラスとconstメンバの初期化以外の用途はコンストラクタ内でのメンバへの(一見)代入(に見える構文)で十分なのでわ!? お前がそう思うのは勝手だが、わざわざ用途毎に構文を分けるのは悪手だろ って言うだけのこと
452 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 18:10:51.69 ID:edJGSUmw0.net] スマン>>444 の末尾2行は抹消 C#はオブジェクトを参照型でしか扱わないから、明示的にFoo::m_aに対して どっかで明治t系にnew T()を書かねば何も起きないから、書かなかった場合の実行時コストも糞も無い
453 名前:デフォルトの名無しさん [2017/11/05(日) 18:14:02.62 ID:XS4+4qja0.net] ↓structもあるとか言い出すアホ
454 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 18:31:44.21 ID:edJGSUmw0.net] いやすまん>>442 の方針にはまだ欠陥があったわ; Foo::Foo() { m_a = 1; // (1) m_a = 2; // (2) } と書いた場合、(1)は>>442 の方針でm_aの初期化とみなすことはできるが(2)をどう解釈すべきか曖昧になる やっぱメンバの初期化はコンストラクタ本体実行前に1回だけ行われるようにする現行メンバ初期化構文の方がスマートじゃわ;; というわけで完全に自己解決しますた!
455 名前:デフォルトの名無しさん [2017/11/05(日) 18:57:45.52 ID:rSDVGL6P0.net] しっかし「漏れ」って久々に聞いたぞ。
456 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 19:58:56.84 ID:miuEyx390.net] 黎明期からROMやっててUNIX板の騒動を解決した御仁もいるんだろ
457 名前:デフォルトの名無しさん mailto:sage [2017/11/05(日) 21:08:22.04 ID:g4RG1qZKM.net] >>361 <<を使ったフォーマットだと語順を簡単に変えられなくて翻訳対応しづらいという問題もある。
458 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 04:26:03.89 ID:2+QNBq450.net] なんか、相談室じゃなく、テクニックを披露し合って 自慢ごっこスレになってるな。 初心者は入れないし、もし書いたら、さげすむばかりだし。 本当に自慢ごっこスレだな。 おまえらだって、最初はなんにも知らなかった・わからなかったのに。 ちょっとわかる様になったら、自慢ごっこだな。 本当にわかっている人は、簡単な言語で良いソフトを作っているよ。 テクニック自慢ごっこはやめれ。
459 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 05:16:27.05 ID:gbsDrhzw0.net] テクニックでもなんでもない 「c++知らない人の考えた正しいc++論」なんか要らんってだけ
460 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 05:26:32.69 ID:BSAOW8np0.net] 煽れば答えを教えてくれると思ってるとでも思ってるのかねぇ。 まともな人はスルーするだけだし、テキトーに答える人がいてそれにかみつく人がいて荒れるいつもの流れ。
461 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 05:30:04.94 ID:BSAOW8np0.net] >>454 思ってるとでも思ってる→とでも思ってる orz
462 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 05:52:30.70 ID:YMdKjlXe0.net] visual studio comunity 2015のc++で下記コンソールプログラムを実行すると 「0x73AD36A8 (tmmon.dll) で例外がスローされました (ConsoleApplication1.exe 内) : 0xC0000005: 場所 0x0058F180 の読み取り中にアクセス違反が発生しました」 というエラーが出て停止するんだけど、原因が分かったら教えてください ちなみに、コンパイル時にエラーは出ないし、プログラムも実行できるけど、プログラムの終了時にエラーが出ます tmmon.dllというのはウィルスバスター関係のソフトらしいので、もしかしたらそちら側の不具合かもしれないけど #include <iostream> #include <conio.h> using namespace std; #define num 5000 class CLASS_A { }; int main() { CLASS_A** ppa = new CLASS_A*[num]; for (int i = 0; i < num; i++) ppa[i] = new CLASS_A; for (int i = 0; i < num; i++) delete ppa[i]; delete ppa; cout << "hit any key!" << endl; char ch = (char)_getch(); return 0; }
463 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 05:59:29.00 ID:7ntrKCQE0.net] ステップ実行してどこで落ちてるか検証するべし。 これくらいのコードならおえるでしょ。
464 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 06:01:06.59 ID:662yk6z20.net] 少なくともdelete ppa; はdelete[] ppa; じゃなくちゃダメだろ
465 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 06:06:20.61 ID:pcHZ0AZV0.net] C++のクラスのコーディングをCで表現しようとするとどんなコードになる?
466 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 06:11:23.92 ID:7ntrKCQE0.net] structで関数ポインタ持たせるとかあるけど。 変換規定はない。
467 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 06:31:31.92 ID:YMdKjlXe0.net] >>457 エラーが出るのが return 0; の後なので、ステップ実行してもよく分かりませんでした >>458 なるほど、忘れてました でも付けてもエラーは出るみたいです トレンドマイクロの方に問い合わせしてみたほうがいいですかね?
468 名前:デフォルトの名無しさん [2017/11/06(月) 07:31:40.53 ID:z+KG8ZZn0.net] >>453 ほんこれ。 例の人のどこに初心者だから教えてくれという要素があったというのか。
469 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 08:03:49.75 ID:FJG0yfiKd.net] >>460 賢い 関数ポインタに関数のアドレスを突っ込むタイミングは構造体初期化のタイミングだろうか?
470 名前:デフォルトの名無しさん [2017/11/06(月) 08:23:52.67 ID:Z84gcoL/0.net] >>456 そのコンパイラのバグだろ。他の系でやってみたらいいと思う。問題ないはずだ。 自分の脳内コンパイラでもOKだ。
471 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 09:14:29.24 ID:7ntrKCQE0.net] >>463 コンストラクタ関数を必ず持つようにするとかね。 Hoge h = constructHoge(...);
472 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 09:20:09.45 ID:6kMDcvlvr.net] >>456 >(tmmon.dll) で例外がスローされました よくあること Windowsだったらスタートメニューからメンテナンスツール(普通の管理画面ではない)を起動して モジュールの全アンロードすると起こらなくなる
473 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 09:48:56.37 ID:YMdKjlXe0.net] >>464 エラーについて検索していたら、こちらのページにVisual studio 2017のdenev.exeと自作アプリの置いてあるフォルダを ウィルスバスターの例外設定に追加して様子を見るようトレンドマイクロから回答されたという人がいたそうです。 私の場合は2015なので、とりあえず自作プログラムのフォルダを例外設定に追加したところエラーが出なくなりました。 なんか根本解決になっていないような気もするけど、とりあえずこれで様子を見てみます。 dxlib.o.oo7.jp/cgi/patiobbs/patio.cgi?mode=view&no=4148 ちなみに今気づいたのですが、エラーが出るのはVisual studio 2015のIDE上から実行したときだけで、 プログラム単体で実行したときはエラーは出ないようです。 回答してくださったみなさん、ありがとうございました
474 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 09:51:12.88 ID:YMdKjlXe0.net] >>466 ありがとうございます >>467 の方法でとりあえず解決しました
475 名前:デフォルトの名無しさん [2017/11/06(月) 10:48:41.89 ID:Z84gcoL/0.net] #include <boost/pool/pool_alloc.hpp> サンプルをテスト使用としたらTIのCCSにはこのあたりのライブラリがないんだが、このライブラリって 古いのだろうな? boost::fast_pool_allocator<int> とかをテストしたいのだが、新しいライブラリはどれになるんだろうか?
476 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 12:11:13.49 ID:FN/Llmne0.net] >>461 メモリリークだろ メモリを解放せずに、アプリを終了してるとか?
477 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 12:13:38.44 ID:FJG0yfiKd.net] >>465 C++ならできるだろうけどCだとできる...?
478 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 21:05:16.36 ID:7ntrKCQE0.net] >>471 https://ideone.com/ZfcWrq こういうイメージだな。 C久々に触ったわ。メモリ回りはおまじないが多いのでこわいよ〜。
479 名前:はちみつ餃子 mailto:sage [2017/11/06(月) 21:12:28.45 ID:MXn0CmOw0.net] >>472 どうしても記法を再現しようとするとそうなるだろうけど、 メモリを無駄にして割に合うのかっていうとだいぶん疑問ではあるよな。
480 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 21:14:53.41 ID:7ntrKCQE0.net] >>473 まぁ、折衷案で関数群とデータで分けるとかね。 一応継承紛いなこともできなくないし。
481 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 22:45:43.65 ID:r9+CDuOfM.net] >>471 glibを真似たらいいよ。
482 名前:デフォルトの名無しさん [2017/11/06(月) 22:51:39.40 ID:z+KG8ZZn0.net] 記法を似せたいだけならともかく、関数ポインタを使うところはC++でいうところのvirtual functionでそれをクラスのIFとするのはC++でもめったにやらんわな。
483 名前:デフォルトの名無しさん mailto:sage [2017/11/06(月) 23:44:50.11 ID:SClVOYaP0.net] COM(Component Object Model)はC++及びCでバイナリ互換のオブジェクトを作ることが出来る vtblの配置は言語仕様上は定められていないが、MSがCOM(OLE2)を実装するにあたって定めた配置にしている処理系が殆どだ
484 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 02:44:04.83 ID:5kOZtFPy0.net] BisonでC語風の言語作ってるのですが、代入の構文が衝突してしまい困っています。 bison.yy: conflicts: 5 shift/reduce *の回数を記録、Identifier = expression という構文を作りたいのですが、いい方法ありませんか? *の検出はC語風のポインターを使うための処理です。 assignList : assign {$$=new StatementAssignList($1);} |assignList assign {$$=$1->add($2);} ; assign : Identifier '[' expression ']' "=" expression {$$=new StatementAssignVariable($1,$3,$6);} // 変数に代入:名前[式]=式; | Identifier "=" expression {$$=new StatementAssignVariable($1, 0,$3);} // 変数に代入:名前=式; | "*" {$$=new StatementAssignPtr();} ; class StatementAssignList : public Statement{ public: std::vector<Statement *>m_list; ~StatementAssignList(){for(auto &p
485 名前::m_list) delete p;} StatementAssignList(Statement*pStatement){m_list.push_back(pStatement);} StatementAssignList *add(Statement *pStatement){m_list.push_back(pStatement);return this;}; } 現在は、m_listで、StatementAssignPtr()の個数を調べてStatementAssignVariableの処理につなぐことを考えてます。 [] [ここ壊れてます]
486 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 04:38:27.99 ID:PQkUnwQq0.net] >>478 expressionがどうなってるのか知らないけどその文法だと a=expr * a=expr * * みたいに書けてしまうけど良いのか? 「左辺に書けるもの」を分けて整理すべし C言語風ならC言語の文法を参考にしてもいいと思うけど
487 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 05:07:39.94 ID:5kOZtFPy0.net] アドバイスありがとうございます。 expressionは、 =禁止していますので、a = expr*a=expr * * は出来ないようにしてます。 手動で*の数を記述してみたのですが、conflicts: 3 shift/reduce となって混乱してます。 こんな感じ。。StatementAssignVariable()の第一引数を *の数にして実験。 statement : Identifier "=" expression {$$=new StatementAssignVariable(0, 省略); } | "*" Identifier "=" expression { $$= new StatementAssignVariable(1, 省略); } | "*" "*" Identifier "=" expression { $$= new StatementAssignVariable(2, 省略); } ; gcc 3はbisonのソース有ったので見たのですが、難解でしたorz 構文の設計ムズカシイ conflicts: 3 shift/reduce無視しちゃっていいのかなぁ。。
488 名前:デフォルトの名無しさん [2017/11/07(火) 05:27:52.17 ID:2eQgtTM30.net] > コンパイル時にエラーは出ないし、プログラムも実行できるけど、プログラムの終了時にエラー スタック破壊の典型的な症状だな
489 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 07:17:12.36 ID:PQkUnwQq0.net] >>480 いや、assignListはassignの1以上の繰り返しで、assignは identifier [ expression ] = expression identifier = expression * のどれでも良いのだからassignListは a=b * a=b * * a[b]=c * みたいにassignを自由な順番で書けてしまうよね? おそらくexpressionに2項の乗算が入ってるでしょ それでセミコロンで区切らない文法とか? a = b の次に*が来たときに乗算の右辺を待つ状態へshiftするか、それともa=bをreduceして次の代入文へ移るかが曖昧なのだと思う 常にshift(乗算優先)が望みなら無視してもいいけど、 a=b *c=d (代入二つ)とは書けなくなるかな
490 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 09:38:50.61 ID:Nwc3R7kX0.net] >>481 あれから少し調べてみたけど、クラスを使わない、このプログラムでもエラーが出ることが分かりました またnumの値によっても変わるみたいで、このプログラムの場合はnumを3805まで減らすとエラーが出なくなります (昨日のプログラムの場合は、また別の値だったと思うけど) エラーが出るのはIDE上で動かした場合だけで、プログラム単体で動かした場合はエラーが出ないからIDEの不具合なのかな? マイクロソフトに報告するべき? #include <iostream> #include <conio.h> using namespace std; #define num 5000 int main() { int** ppa = new int*[num]; for (int i = 0; i < num; i++) ppa[i] = new int; for (int i = 0; i < num; i++) delete ppa[i]; delete []ppa; cout << "hit any key!" << endl; char ch = (char)_getch(); return 0; }
491 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 09:48:51.30 ID:Nwc3R7kX0.net] >>483 すみません、再確認したらnumの数を減らせば出なくなるというのは間違いです ただ、出にくくなっているような気はするけど
492 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 16:23:51.40 ID:5kOZtFPy0.net] >>482 再帰的下向きコンパイラ見たいな構造で、expressionに、乗算2つ入ってます。 %prec を排除して文法作ってましたが、曖昧な表現が衝突の原因っぽいですね。 文法修正してみます。ありがとうございました。 expression : term1 | expression "||" term1 {$$=省略;} ; term1 : term2 | term1 "&&" term2 {$$=省略;}; 省略 ... term7 : term8 | term7 '+' term8 {$$=省略;}; term7 '-' term8 {$$=省略;}; term8 : factor | term8 '*' factor {$$=省略;} | term8 '/' factor {$$=省略;} | term8 '%' factor {$$=省略;} factor: '-' factor {$$=省略} // -xxの時 NEGの処理 | '*' factor {$$=省略;} // *xxの時 ポインターの処理 | '(' expr '){ $$ = $2; } // () | func // 関数呼び出し | value // 変数 | number { $$ = $1; }// 数値 ;
493 名前:はちみつ餃子 mailto:sage [2017/11/07(火) 21:03:50.18 ID:t2a48+le0.net] >>477 C++ 用の宣言と C 用の宣言がマクロで分岐するようになってるのを読んだことが有るんだけど、 C++ で引数を参照で渡してるやつが C ではポインタになってて、 それってバイナリレベルでは互換性があるんだ〜と思ったことがある。
494 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 21:13:18.56 ID:LIKWanez0.net] >>483 _getchあやしくね? cin.get(); に変えてみたら?
495 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 21:59:05.61 ID:5kOZtFPy0.net] >>483 試しにvs2015とvs2017で動かしてみたんですが、正常に動きますよ?デストラクタ確認でちゃんと動作してるみたいです。 ch = (char)_getch(); ってとこは書き換えて、getchar(); にしましたが。。 #include <iostream> #include <conio.h> using namespace std; #define num 5000 void test1() { int ** ppa = new int *[num]; for (int i = 0; i < num; i++) { ppa[i] = new int; } for (int i = 0; i < num; i++) delete ppa[i]; delete[]ppa; cout << "hit any key!" << endl; } class MyInt { public:int n; MyInt(int i) :n(i) {}~MyInt() { printf("~MyInt %d\n", n); } }; void test2() { MyInt ** ppa = new MyInt *[num]; for (int i = 0; i < num; i++) { ppa[i] = new MyInt(i); } for (int i = 0; i < num; i++) delete ppa[i]; delete[]ppa; cout << "hit any key!" << endl; } int main(){ test1();test2(); //共に普通に動作確認済み getchar();return 0; }
496 名前:デフォルトの名無しさん mailto:sage [2017/11/07(火) 22:01:54.27 ID:aP9yM4om0.net] 結論。Newすんな。ベクタ使え。
497 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 00:05:45.23 ID:b+QUYReX0.net] 伸び縮みしないんだったらunique_ptrで十分じゃん
498 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 00:17:24.11 ID:NuL34q9d0.net] >>483 ウィルスバスターのdllでエラーならMSに言っても意味ないんじゃないか。 デバッガがアタッチされてるとウィルスバスターのdllがおかしなことして起きるってことじゃないの?
499 名前:デフォルトの名無しさん [2017/11/08(水) 06:08:53.08 ID:Qxc+LNev0.net] ウイルスバスターが干渉しているっぽいなら VirtualBoxでウイルスバスターのない仮想環境を作って その中で動かしてみればええやん
500 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 06:30:19.02 ID:pFtekju40.net] セキュリティソフトを動かしていたら、多くのアプリは、正常に動かない 多くのアプリの説明書に、そう書いてある
501 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 07:29:57.54 ID:/yzKqtBG0.net] >>487 cin.get(); とgetchar() もやってみたけど同じでした >>488 ウィルスバスターはインストールされているでしょうか? エラーを出すのがウィルスバスターなので、ウィルスバスターの入っている環境じゃないと出ないようです >>489 vector使ってみたけど同じでした。今までvectorってあまり使ったことなかったけど、これからはvectorを使うことにしよう int main() { vector< vector<int> > ppa; ppa.resize(5000); for (int i = 0; i < 5000; i++ ) ppa[i].resize(20); cout << "hit any key!" << endl; char ch = (char)_getch(); return 0; } >>490 実際のプログラムでは伸び縮みします >>491 そうですね、ウィルスバスター側の問題かもしれない。トレンドマイクロに問い合わせしてみようかな? >>492 ウィルスバスターを終了した状態ではエラーは出ないことは確認しています ただ、visual studioとウィルスバスターのどちら側に問題があるかは分からないけれども >>493 そうですね、でもウィルスバスターを止めるわけにもいかないので とりあえず、プログラムを最後まで実行させなければ問題ないので、IDEから強制終了することで対応しようと思います。 プログラム単体で実行したときはエラーは出ないので
502 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 08:02:44.81 ID:pFtekju40.net] 多くのアプリの説明書に、 「セキュリティソフトを動かしていたら、正常に動きません」 って書いてあるけど、何でだろ?
503 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 08:10:49.38 ID:MA4CFapNd.net] 多くのアプリがウィルスみたいなものだから
504 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 09:33:37.02 ID:tfdQ3Vx70.net] セキュリティソフトは潜在バグを顕在化する事が往々にしてある
505 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 10:25:00.80 ID:s/8N4dfn0.net] 事情は知らんが開発中はウィルスバスター止めるとか>>467 の方法で問題あるのか? IDEから強制終了とかクソ面倒くさいことやってられんだろ
506 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 10:27:07.11 ID:pfXJjTar0.net] OSの設定に干渉するようなモノはウイルス判定されることがあり得るでしょ。 それが善意かどうかなんて判定のしようがない。
507 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 10:29:43.39 ID:s/8N4dfn0.net] もしかしてウイルスを作ってるのか?
508 名前:デフォルトの名無しさん [2017/11/08(水) 12:29:57.54 ID:/2nLdTDi0.net] >>499 ウイルス判定したならただクラッシュさせて放置じゃなくてアンチウイルスソフトとしての仕事しろよ。 ただウイルスバスターがクソなだけだろ。
509 名前:はちみつ餃子 mailto:sage [2017/11/08(水) 13:26:26.66 ID:xvDlz0If0.net] ウイルスと判定したわけじゃなくて、判定するために干渉した結果としてそうなる場合がある。 コンソールアプリを起動しようとした場合に、一旦サンドボックス的なものの中で起動させてチェックして 直後にあらためて普通に起動するというのを見たことがある。 今回の場合、そのコンソールアプリを起動している VS の状況と噛み合わなくなっているのだと思う。 チェックのために何かしら介入しなきゃならないのはしょうがないのだが、 泥臭い、クソみてぇなことの塊なので、まじめに検証するのアホらしいぞ。
510 名前:488 mailto:sage [2017/11/08(水) 15:52:55.19 ID:8BP79/0I0.net] >>494 カスペルスキーの環境だと問題ないみたいですぜ。例外とかの設定もしてません。 バスターは入れてないです。
511 名前:デフォルトの名無しさん [2017/11/08(水) 16:01:14.63 ID:VRSOCYqCd.net] いまどきクライアントにはウィルス対策ソフトなんて入れないのが主流だと思ってたけど、 そうでもないのかな
512 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 16:44:23.86 ID:XvbXwAqY0.net] 上の現象見ただけでも信用ならんと分かりそうなものだがなあ。
513 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 18:24:45.85 ID:pfXJjTar0.net] Win10ならディフェンダーはいってるけど、前のOSとかなら入れるのか?
514 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 19:40:45.83 ID:GPQLPiKHM.net] >>506 XPの時からディフェンダーだわ
515 名前:デフォルトの名無しさん mailto:sage [2017/11/08(水) 23:47:31.77 ID:NuL34q9d0.net] ノートンのプロセスが勝手にこっちのdllを読み込んあとおかしな状態でアンロードしてアクセス違反おこしてノートンのプロセスがクラッシュするってのはあった。 アンチデバッキングなのかユーザーモードデバッガではアタッチできないからカーネルデバッガやるしかなくて原因見つけるのに結構苦労した。
516 名前:デフォルトの名無しさん [2017/11/09(木) 00:57:17.32 ID:ej8qpLZc0.net] Virtual Studioは素人が購入することは考えにくい専門的なソフトだからウイルスバスターのターゲット外なんだよ。 つまりさっさとどっちか捨てろってこった
517 名前:デフォルトの名無しさん [2017/11/09(木) 02:17:02.22 ID:7vxmA4jM0.net] Visual Studioでアプリ作っててビルドしたてホヤホヤのプログラムをアヴィラ先生がウィルス認定しやがったのは過去に何度かあったわ
518 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 07:51:39.95 ID:AsVSSCPV0.net] >>456 delete[] ppa; じゃないの
519 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 08:51:49.76 ID:4HUgyouS0.net] >>498 >>467 の方法は、エラーの発生を無視しているだけで、実際にはエラーが発生している可能性があるので >>500 そんなスキルはないですw >>503 ウィルスバスター側が悪さしている可能性もあるんですかね せめてVisual Studioとウィルスバスターのどっちが悪いのかわかればいいんだけど >511 >>483 でdelete[] ppa;にしてみたけど、同じでした
520 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 11:01:44.29 ID:Obd3aNBj0.net] ウィルスバスターはエラー検出ツールじゃないし無視でいいよ リソース関連のエラー検出したいならそれなりの検出ツール使うとか静的解析ツール使うとか
521 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 12:14:59.98 ID:rcuqnank0.net] ウィルスバスターミナルとかトーシローかよw プログラムの仕組み知り尽くしていればまずウィルスなんかに引っ掛からないだろw
522 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 12:33:16.70 ID:YfcqoN+X0.net] 教えてくれよ
523 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 18:45:17.95 ID:+zZRkuiLd.net] 入力したコマンドを別関数に渡して結合してリターンして表示するってコードを作りたい mainの中のusrとpassは実体もあるから受け渡し含めて問題ないと思うのだけど、 mainのcRetとgetcommandのcommandってどう定義するべきなのだろうか? 動くのは動くのだけど二つとも実体どこー?ってなってます #include <stdio.h> #include <stdlib.h> GetCommand( const char* usr, const char* pass ){ char* command; /** コマンド作成 **/ sprintf( command, "-u %s:%s", usr, pass ); return command; } int main( int argc, char* argv[] ){ char* cRet; char usr[256] = {}; char pass[256] = {}; /** アカウント名の入力 **/ printf("usr Input : "); scanf("%s", usr ); /** パスワードの入力 **/ printf("pass Input : "); scanf("%s", pass ); cRet = GetCommand( usr, pass ); printf( "%s\n", cRet ); return 0; }
524 名前:片山博文MZ mailto:sage [2017/11/09(木) 18:49:41.22 ID:lJJATczwd.net] GetCommand関数のcommand変数をstaticなバッファーにするか、おとなしくstd::stringを使うか、GetCommandにバッファーへのポインターに渡すか。
525 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 18:53:06.50 ID:+zZRkuiLd.net] >>517 このままのリターン形式だとstaticなバッファー作成しか方法ないってことですよね
526 名前:片山博文MZ mailto:sage [2017/11/09(木) 18:56:36.56 ID:lJJATczwd.net] >>518 いや、malloc や、newもあり得る。だれが解放するかは問題だが。
527 名前:片山博文MZ mailto:sage [2017/11/09(木) 19:22:58.90 ID:lJJATczwd.net] グローバル変数のバッファーを使うこともできる。
528 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 20:43:21.98 ID:+zZRkuiLd.net] 考えてみるとバグの温床になりかねんね 単純に格納先の変数を用意して引数に渡すべきだとなった
529 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 21:06:06.24 ID:HS5Oh82mM.net] >>521 C言語ならな C++なら>>517 の言う通りおとなしくstd::string使えよ
530 名前:デフォルトの名無しさん mailto:sage [2017/11/09(木) 21:22:58.42 ID:+zZRkuiLd.net] >>522 そやね プロシージャとファンクションの考え方からファンクションにしたいのに 戻り値じゃないってのも変だ string全然使ったことないけど使うことにする
531 名前:はちみつ餃子 mailto:sage [2017/11/09(木) 22:21:05.91 ID:LSUga0nM0.net] コマンドラインオプションで受渡した方がやりやすいような気もしないでもない。
532 名前:デフォルトの名無しさん [2017/11/10(金) 05:13:52.89 ID:7MRV7tWB0.net] こういう内容でstring使わないとか 超のつくマゾプレーだな
533 名前:デフォルトの名無しさん [2017/11/10(金) 06:24:08.16 ID:wxME+cIA0.net] ってかCの質問やんけ
534 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 06:45:56.53 ID:AkYkb8w90.net] sprintfは領域確保しないでしょ。こういうのがCは危ない。
535 名前:デフォルトの名無しさん mailto:sage [2017/11/10(金) 07:58:16.79 ID:P63PhvFd0.net] >>513 たしかにウィルスバスターをエラー検出ツールとして使うのは、おかしいですね >>467 の方法でdevenv.exeが置いてあるIDEというフォルダと、自分のプログラムが置いてあるフォルダを ウィルスバスターの例外処理に入れたら、気持ちが悪いぐらいにまともに動くようになりました みなさん、ありがとうございました
536 名前:デフォルトの名無しさん [2017/11/11(土) 06:46:03.41 ID:PUzdOh0e0.net] >516 1.間違い1 char* command; /** コマンド作成 **/ sprintf( command, "-u %s:%s", usr, pass ); ここが間違いで、sprintfを使う時には、かならず char commad[256]; のように適当に多めにエリアを確保すること、256バイト確保しておけばメモリーをはみ出すことはまずない。 上の例ではcommandには何が入っているか不定だから、例えば0が入っていたら、メモリーの0番地に usr,passを書き込んでしまう。だから普通はsprintを行った後で暴走する。 2.間違い2 char commad[256]; このように変更するとGetCommandは正常に動作するが、このcommandはスタックに確保されたメモリー なのでGetCommandを終了すると、解放されて不定になる。したがってreturn command;はしては いけない。 3.正しいやりかた メモリエリアを確保して、それをGetCommnadに渡すのもありだが、引数が増えるので内部で確保してリターン したいのであれば、memory確保する関数を用意してそこに書き込む。確保したエリアは使い終わったら 自動的に開放できる仕組みにしておく。 char *command = getarea(256);
537 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 06:58:56.29 ID:qx0Cuc+s0.net] 256バイト確保しておけばメモリーをはみ出すことはまずない。とかw 文字列連結してるだけなんだから全部std::stringでやればいいだけだよ
538 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 07:10:37.49 ID:5AYGw8xA0.net] >>516 ていうかc言語初心者のところで聞けよ その池沼レベルのソースコードだとここでは晒しものの血祭りになるだけだぞ
539 名前:デフォルトの名無しさん [2017/11/11(土) 08:19:33.64 ID:PUzdOh0e0.net] >文字列連結してるだけなんだから全部std::stringでやればいいだけだよ さてもしかりに char commad[256000]; このくらい十分に確保できたらstringとどっちがあんぜんだろうか? 先ずはstringを使った方がいいと主張する理由を説明できないとな。 「やればいいだけだよ」って誰かがいってたから、という受け売りの信仰ではだめだな。
540 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 08:23:18.59 ID:qQheN6bd0.net] >>532 それでもstd::stringのが安全 根本的に考え方が古すぎる
541 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 08:40:17.35 ID:FtIHrpnF0.net] >>533 外部からの長さ無制限の文字列を受け付けるプログラムというのもセキュリティー上問題がある バッファオーバーフローで即exploitされることは無いが時間をかければクラッシュを引き起こせる というわけで長さ制限はどこかの時点で必須なのでassertionをOFFにしたsprintf_s()さいこー
542 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 08:42:08.74 ID:qx0Cuc+s0.net] >>532 くだらなすぎて返す言葉もないです すみません
543 名前:デフォルトの名無しさん [2017/11/11(土) 08:46:05.02 ID:JauW0Lbxd.net] スタックオーバーフロー起こしそう
544 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 08:58:22.67 ID:VdKe4lXM0.net] >>532 スタックが無駄。
545 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 08:59:35.86 ID:FtIHrpnF0.net] ていうかstd::stringにお任せしておけばデータサイズの管理が不要とか池沼の考え 何文字でも受け付けるとかいうのはテストしようが無いからまともな仕様ではない よってまともな設計は不可能
546 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:01:47.94 ID:VdKe4lXM0.net] 常識的な範囲で受け入れてくれればよい。 それを行うことで何をしたいのかが見えないなぁ。
547 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:03:17.54 ID:FtIHrpnF0.net] 手前の常識がクライアントの常識と思い込むのは池沼のry
548 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:06:15.75 ID:FtIHrpnF0.net] つか>>537 もかなり問題発言 スタックは関数を抜けたら開放されるのだから、 スタック領域を使い果たさないように設計された関数ならスタックをいくら使うかは関数の勝手 ここでも「スタックの消費は少ないほうが良い」という手前の常識が
549 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:06:43.21 ID:VdKe4lXM0.net] じゃあ、君はメモリが確保できないことをどう説明するんだい? スタック大量に確保したら余計引っかかるぞ。
550 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:10:47.99 ID:VdKe4lXM0.net] 本質は同じ。瞬間メモリ使用量の問題だからな。 少ない方がイイに決まって無いかい?
551 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:17:19.24 ID:FtIHrpnF0.net] >>542 スレッド生成時にそのスレッドが使えるスタックは一般に割り当てが完了するから、 割り当てられた領域をオーバーしなければどう使っても良い もちろんフルに使ってもヒープの圧迫にはならない スタックが伸びれば伸びただけヒープ用メモリ領域を圧迫するとか ごく一部の超ロースペックな組み込み環境(スタックがただ1本だけ=スレッドが1個だけ)限定の話じゃないの; プログラムのメモリの使い方について一体どんな理解をしているのか;;
552 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:22:37.81 ID:VdKe4lXM0.net] >>544 じゃあnewしても問題なく確保できるじゃないか。 クライアントが不足の文字数ブッコンで落ちるよりはいいと思うけどね。 あと、ほかがヒープ食っててスタック確保できないケースはないの? なんでもヒープにキックする人嫌い。
553 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:23:01.72 ID:FtIHrpnF0.net] >>543 std::string経由でヒープ上にchar commad[256000];を確保する方が スタック上にchar commad[256000];を確保するより常に優れた設計であるという根拠は?
554 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:25:34.33 ID:VdKe4lXM0.net] >>546 仕様が提示されてないから。250kbも使う保証がない。 なら、std::stringがchar command[256000]と確保するのは優れてるの? 折衷案なだけじゃない?
555 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:26:29.15 ID:FtIHrpnF0.net] >>545 藻前は文字数ブッコンでエラーを返すことと文字数ブッコンで落ちることの意味の違いの重大さがわかっていない 漏れは終始エラーを返すことを目指した発言をしてゐる
556 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:27:27.12 ID:VdKe4lXM0.net] >>548 あそー。 確保できなかたらSIZEは0になるから、ほとんどの処理は通らないようにエラー処理はできる。
557 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:29:57.09 ID:VdKe4lXM0.net] c++には例外もアルヨ。
558 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:40:15.26 ID:VdKe4lXM0.net] 化石か!
559 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:42:44.46 ID:FtIHrpnF0.net] >>547 なんか文字数の上限仕様が提示されたらスタック上に取るほうが良いと言ってねえが?まあ一般にそれで良いのだけども >>549 メモリ不足チェックと文字数チェックを混同するのは池沼のry メモリ不足はさまざまな要因が重なった結果起きる現象なので 「入力Xを与えたらメモリ不足でクラッシュする」という仕様はありえない (入力とメモリ不足との関係は、一般に再現性のある形ではテスト仕様に組み込めない 一方、「文字数n未満の入力Xはエラーとする」という仕様ならアリで 再現性のあるテストケースも書けてバッファとしてとるべき配列サイズも計算できる(きちんと設計しているなら
560 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:44:02.22 ID:FtIHrpnF0.net] >>552 訂正スマンorz 誤: 文字数n未満の入力Xはエラーとする 正: 文字数nを超過した入力Xはエラーとする
561 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:46:24.25 ID:VdKe4lXM0.net] >>552 ロースペックじゃないコンピュータつかってるんだろ? 非常識な文字数入れられたらはじくなんて別に難しくないだろ。 スペックわかってるんだったらなおさら。
562 名前:デフォルトの名無しさん [2017/11/11(土) 09:47:59.39 ID:atpFEB620.net] スタックに充分な領域を確保したから大丈夫って頭おかしい設計だわ
563 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:49:50.67 ID:FtIHrpnF0.net] >>554 文字数チェック不要と考えているかもしれない>>530 とかに言うべき
564 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:54:01.12 ID:VdKe4lXM0.net] はいはい。もういいわ。 エラー処理真面目にやるんだったら、そういう方向で考えるけど。 ここではそんなに求められてない。一般感覚が無いとそれ何回もやるのか? 不適当で有名な5chでなにを演説してるのやら。
565 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 09:58:28.19 ID:FtIHrpnF0.net] >>555 やみくもにスタック消費量最小を目指すのは、 自分の関数がどれぐらいスタック使うのかおよびスタック領域にどれぐらい余裕があるのか 見積もる手間を惜しんで手抜きしているだけな可能性が微レ存、 ていうか「スタックに充分な領域を確保した」というのが真なら(机上検証、レビュー、テストで担保できたなら 「大丈夫」という結論で何の問題も無いんじゃ…
566 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 10:07:34.21 ID:WEOLmGSE0.net] >>544 スタック領域には当然上限があるが、常にその上限まで割り当てていたら無駄だろう。 LinuxもWindowsも必要に応じてページを割り当てる。
567 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 10:17:10.01 ID:FtIHrpnF0.net] >>559 スタック領域を使い切るのが美徳とは言っていないわけでありまして、 なおかつページングの発生頻度は、メモリ消費箇所がスタックかヒープかの違いよりは 領域へのアクセス頻度の問題ではなかろうかと、
568 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 10:35:02.95 ID:WEOLmGSE0.net] パフォーマンスの話じゃなくて、これが一般には正しくないって言ってるの。 >スレッド生成時にそのスレッドが使えるスタックは一般に割り当てが完了するから、 >割り当てられた領域をオーバーしなければどう使っても良い >もちろんフルに使ってもヒープの圧迫にはならない
569 名前:デフォルトの名無しさん [2017/11/11(土) 10:53:30.83 ID:opm7+oFX0.net] んでchar commad[256000];をどうやってリターンするんだ?
570 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 11:07:32.64 ID:WYLE0xS1M.net] 普通ならstd::string使う char使いたい人は使えばいい おしまい
571 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 11:11:42.29 ID:d7ebwqzc0.net] 256000という数字にセンスを感じるなあ
572 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 11:50:48.17 ID:yWjpohs20.net] > char commad[256000]; しかも0が非ascii
573 名前:デフォルトの名無しさん [2017/11/11(土) 13:26:05.59 ID:cTWJmMx00.net] >>529 いや、commandを何バイト確保しておこうが snprintf() の方を使った方が良い。 https://linuxjm.osdn.jp/html/LDP_man-pages/man3/sprintf.3.html gcc で asprintf() 使ってもいいなら command は char * でも行ける(その代わり後でfree())。 https://linuxjm.osdn.jp/html/LDP_man-pages/man3/asprintf.3.html
574 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 14:07:40.16 ID:x64hpPPQ0.net] scanf("%s"にツッコミなし!
575 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 14:52:43.33 ID:cTWJmMx00.net] >>567 あまりに低レベルで目に入らんかったw
576 名前:デフォルトの名無しさん [2017/11/11(土) 17:48:20.77 ID:PUzdOh0e0.net] >んでchar commad[256000];をどうやってリターンするんだ? だからそれはstringでも同じだな。stringを使えばいいという発想では駄目ということだ。 メモリを確保する必要がある。 しかも、サブルーチンを抜けた後で、何処かでそれを解放する機構が必要だ。サブルーチンを抜けた 後だと自動で解放しない限りは解放する方法はない。つまり肝心なのは自動でメモリ解放機能が ついていることだ。それがついてないstringクラスなんてこの場合は全く使い道がないってことだ。 だからstringって馬鹿の一つ覚えを言うやつは間違いってことだね。
577 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 18:01:59.33 ID:qx0Cuc+s0.net] 頭おかしい
578 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 18:12:16.05 ID:NuT5AKLg0.net] なんかおかしな雰囲気を出してるね
579 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 18:18:07.19 ID:ybMjRTfR0.net] >>569 std::string はデストラクタで自動でメモリ解放するよ。
580 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 18:20:22.00 ID:tT1WP+x8r.net] auto f() { struct { char a[256]; } r{};
581 名前:return r; } int main (){ auto[array] = f(); } ちょっとスタックが厳しそうだ [] [ここ壊れてます]
582 名前:デフォルトの名無しさん [2017/11/11(土) 18:43:22.06 ID:35XI65Ti0.net] >>569 本当のバカはその一つすらまともに知りませんでした
583 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 19:32:54.25 ID:a9mrqTdG0.net] 今どきstd::stringを批判してcharの配列の優位性を説くとか
584 名前:デフォルトの名無しさん [2017/11/11(土) 19:56:58.42 ID:Hv/PaJUT0.net] string_viewとか持ち出して言うならともかく
585 名前:デフォルトの名無しさん [2017/11/11(土) 20:40:48.77 ID:35XI65Ti0.net] >>575 全く批判になってないから。 string_viewも今回のような用途に使うもんじゃない
586 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 21:23:35.64 ID:u9h6IsulM.net] テンプレートって基本ヘッダファイルに書くと思うけど、コンパイル単位ごとに全部コードのコピーが作成されるの?
587 名前:デフォルトの名無しさん [2017/11/11(土) 21:25:00.09 ID:Hv/PaJUT0.net] >>577 string_viewって何か知らないのか?
588 名前:デフォルトの名無しさん [2017/11/11(土) 21:41:30.08 ID:4HyMUlDc0.net] そこでmoveですよ。
589 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 21:45:04.19 ID:ybMjRTfR0.net] >>578 規格は生成コードまで規定しないから、気になるならアセンブリとか見るのがいい。 関数テンプレートあたりだとコンパイル単位またいでも同じポインタが得られることが要求されていたりはする。
590 名前:デフォルトの名無しさん [2017/11/11(土) 22:32:22.44 ID:35XI65Ti0.net] >>579 今回の件にstring_view使ってみなよ
591 名前:デフォルトの名無しさん [2017/11/11(土) 22:37:09.49 ID:35XI65Ti0.net] もしかして string_viewとか(無理やり)持ち出して(バッファーを解放しないと)言うならともかく という意味か? そうだったらそこまでエスパーにはなれんかったわ
592 名前:デフォルトの名無しさん mailto:sage [2017/11/11(土) 22:42:02.84 ID:aJZfBE3c0.net] みじゅくもの
593 名前:デフォルトの名無しさん [2017/11/12(日) 05:09:14.57 ID:yBBP+7vl0.net] >>583 何か勘違いしているか? 俺は生配列を使いたがるガイキチたちを擁護したいわけじゃないし もちろん意見が一致していない C++スレなのにC++のライブラリを食わず嫌いしてるフシのあるやつに ちょっと話題を振ってみただけだ
594 名前:デフォルトの名無しさん [2017/11/12(日) 05:12:35.53 ID:srpvXSqe0.net] エスパー通訳頼む
595 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 05:23:52.17 ID:nuCi4dlE0.net] ストリングビューはストレージを保持しないぞ。 外部からやってきたやつに操作を与えるだけ。 パペットっていうかなんていうか。
596 名前:デフォルトの名無しさん [2017/11/12(日) 05:33:48.19 ID:srpvXSqe0.net] >>587 誰もそんな事は聞いてないんだけど
597 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 07:18:14.98 ID:nuCi4dlE0.net] そっか、当たり前すぎたな。
598 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 07:30:16.55 ID:/72Ra87B0.net] 頭でっかちなアスペ池沼多過ぎか
599 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 08:13:37.80 ID:SrvHRpLe0.net] std::stringは有用だがstd::XXXstream系は糞杉 →必然的にsptintf_s()とstd::stringを併用するスタイルになる いずれワカル
600 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 08:22:45.23 ID:SrvHRpLe0.net] および有用だからといってプログラムの動作根拠を成す 数量的関係の把握をサボるというのは話が違う std::stringにメモリが許す限りいくらでも長い文字列を格納できるから大丈夫とか、 スマポを使っとけばいつか(10万年後かもしれないが)確実に開放してくれるから大丈夫という見込みだけで テストもせずに青天井なデータ処理を許すプログラムをリリースするのは 素人プログラミングに後退である ていうか現在の潤沢なメモリ搭載環境では問題の発覚が遅れる分なお悪い
601 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 08:32:07.61 ID:11xnBK1L0.net] 10万年後wもうお前黙っておけ
602 名前:デフォルトの名無しさん [2017/11/12(日) 08:47:13.70 ID:qGtn1GtX0.net] どんなひどいプロジェクトで仕事すれば、こんなパラノイアを発症するんだろうな
603 名前:デフォルトの名無しさん [2017/11/12(日) 09:05:22.76 ID:yBBP+7vl0.net] >>592 つーことは、おまえbad_allocをcatchせずに放置してるのか
604 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 09:15:31.43 ID:SrvHRpLe0.net] つか今気づいたが>>561 は一体何が言いたいんじゃ… ページ割り当ては論理アドレス上の領域確保に対し透過的なので >スレッド生成時にそのスレッドが使えるスタックは一般に割り当てが完了するから、 >割り当てられた領域をオーバーしなければどう使っても良い >もちろんフルに使ってもヒープの圧迫にはならない の否定根拠にはなりえぬ
605 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 09:17:28.25 ID:SrvHRpLe0.net] >>595 ていうかむしろ藻前は正常系がbad_allocのcatchに依存した設計してるの?
606 名前:デフォルトの名無しさん [2017/11/12(日) 09:25:43.37 ID:yBBP+7vl0.net] >>597 なぜそう思った?
607 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 10:48:39.64 ID:MOg5phwx0.net] >>594 お前らがよってたかっていじめるからだろ w
608 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 13:20:18.65 ID:cRGoHocf0.net] まだ516の糞コードの話題やってんのか まったく飽きないフレンズどもだな セルリアンに喰われちまえよ
609 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 17:58:51.11 ID:mnWm2NGv0.net] 次は20が控えててどんどん進化してるけどmeyers本
610 名前:なしについていける自信がないよ。 17以降遭難者が続出するんじゃなかろうか。 [] [ここ壊れてます]
611 名前:デフォルトの名無しさん [2017/11/12(日) 18:04:43.84 ID:Rpn1RmMo0.net] 17ってそんなに難しいか? 14以後ってか11以後、03までのストイックを通り越したマゾプレーからの離脱が 大きなテーマになっていてautoのinitializer_listみたいなミスはしながらも ちゃんとそれを正していく自浄作用が機能していると俺は思うが
612 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 18:39:00.77 ID:1bparYl/0.net] auto_ptrとかgetsとかトライグラフとかboolの++とか 危険で無駄で混乱を招くゴミが続々取り除かれてどんどん使いやすくなってるよね 生ポインタや生配列をいじくり回してメモリ壊すこともほとんどなくなった
613 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 20:18:16.94 ID:tDIYjV/wa.net] c++の機能がこのまま進歩していったとしてマクロは消えるかな?
614 名前: mailto:sage [2017/11/12(日) 20:20:30.26 ID:Va1KoPXV0.net] テンプレートがマクロそのもの
615 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 20:33:05.49 ID:tDIYjV/wa.net] constexprとかautoのおかげでtemplateもマクロとして使いやすくなったよね。 そう考えるとテンプレートで出来なくてマクロじゃないと出来ないのって何かある?
616 名前: mailto:sage [2017/11/12(日) 20:47:50.42 ID:Va1KoPXV0.net] 多重マクロはテンプレートで置き換えられるのだろうか? お題:mevius.2ch.net/test/read.cgi/tech/1432402159/18 ベタな回答: mevius.2ch.net/test/read.cgi/tech/1432402159/106 peace.2ch.net/test/read.cgi/tech/1313183984/803 https://code.hackerearth.com/2642c4w 多重マクロによる回答 mevius.2ch.net/test/read.cgi/tech/1432402159/128 https://ideone.com/vNZWaH
617 名前:デフォルトの名無しさん [2017/11/12(日) 21:24:58.95 ID:Rpn1RmMo0.net] >>605 テンプレートとマクロの本質的な違いがわかってないな スコープに従うテンプレートやconstと ほとんど何も考えてないおまえみたいなマクロは オブジェクト指向という観点からは全く別次元なものだ
618 名前: mailto:sage [2017/11/12(日) 21:43:24.64 ID:Va1KoPXV0.net] 「ほとんどなにも考えていない」とは手厳しいですね…
619 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 21:52:12.94 ID:D2YYnuTs0.net] オブジェクトたいして指向関係ないだろ
620 名前:デフォルトの名無しさん mailto:sage [2017/11/12(日) 21:52:39.76 ID:D2YYnuTs0.net] 何だこの日本語wwww オブジェクト指向たいして関係ないだろ
621 名前:デフォルトの名無しさん [2017/11/12(日) 22:01:17.81 ID:rtfRb36m0.net] マクロの乱用をさけるためにテンプレートが発達してきたんだからマクロ使わないでね
622 名前:デフォルトの名無しさん [2017/11/12(日) 22:17:39.90 ID:dvIcUwwY0.net] オブジェクト指向関たいして係ないだろ
623 名前:デフォルトの名無しさん [2017/11/12(日) 22:36:48.97 ID:H7C5gFJ50.net] >>606 文字列リテラルを、リテラルとして連結するのはマクロじゃないと無理じゃないかな。
624 名前:はちみつ餃子 mailto:sage [2017/11/12(日) 23:06:22.93 ID:HZk/rPeS0.net] >>614 不可能ではないと思うけど、そう気軽ではないというのは確かだと思う。
625 名前:デフォルトの名無しさん [2017/11/13(月) 00:53:11.35 ID:50LJDJg60.net] const char8_t[] u8hage = "hage"; // = u8"hage" const char16_t[] u16hage = "ハゲ"; // = u"ハゲ" const char32_t[] u32hage = "禿"; // = U"禿" const wchar_t[] whage = "はげ"; // = L"はげ" みたいなプレフィックス省略が出来ればいいのになって思うときがあるね
626 名前:はちみつ餃子 mailto:sage [2017/11/13(月) 01:19:29.77 ID:eMI9MrYT0.net] >>616 Haskell だとリテラルは多相になっていて、型推論で適当な型にあてはめられるんだが……。 C++ では返却値だけ型が違う関数はオーバーロードできないルールがある。 その延長でリテラルは無引数の関数のようなものと考えると文字列リテラルが様々な型で有りうるようなのは難しいと思う。 型の情報が重複してるのがダサいと思うなら型名の方を auto で書くくらいかなぁ。
627 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 02:08:07.11 ID:Vao2bSzU0.net] kotlinとかswiftにあるiterator.forEach{}の構文がc++にもついてほしい c++だとiterator.for[=]{ }みたいな構文になるんだろうか
628 名前:デフォルトの名無しさん [2017/11/13(月) 02:48:35.71 ID:KYqigAA60.net] >>615 うーん… 文字列リテラルは無理じゃね?
629 名前:デフォルトの名無しさん [2017/11/13(月) 03:24:18.68 ID:XQ/CgY2w0.net] 言語仕様変えないと無理かな?
630 名前:デフォルトの名無しさん [2017/11/13(月) 04:17:46.93 ID:V72qpTkz0.net] >>619 コンパイル時定数という意味でのリテラルであれば出来るが
631 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 07:31:48.15 ID:zGRAb4NCa.net] templateだったら関数の返り値が異なってもokだしconstexprならコンパイル時定数だから変換さえ出来ればやれそうな気もする。 >>618 範囲for文は駄目?
632 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 07:34:39.03 ID:8qKZRJJX0.net] 範囲FORとSTLにfor_eachがある。 en.cppreference.com/w/cpp/algorithm/for_each
633 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 09:15:04.60 ID:JahHbsM6M.net] >>622 変数.for...って書き方がしたい
634 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 09:27:56.98 ID:zGRAb4NCa.net] 自作クラスならtemplate関数で範囲forを閉じ込めるとか? 試して無いけどこんな感じで class test{ //begin()とend(),++が定義されているものとする template<typename Func> void for_(Func func){ for(auto& it: *this){ func(lt); } } }
635 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 09:34:12.47 ID:TpgUuavl0.net] そういう臭い書き方はC++ではあまり採用されない方針 オブジェクト指向じたい、もうあまり言われてなくて テンプレートによるメタプログラミングが主体になってる オブジェクト指向を前面に押し出した言語はオワコンになるという法則があって なもんで、魔除け、キチガイ除けの意味も含めて Java や C# や C++ など、主流言語は 「マルチパラダイム言語」、「オブジェクト指向をサポート」 といった、ちょっと距離を置いた付き合いかたをしてるね きっと、「全ての手続きは必ずただ一つのオブジェクトに紐づかなくてはならない」 という強迫観念的ともいえる窮屈な考え方が脳や精神に良くなかったのだろう 本当に精神疾患を引き起こしてリタイアする人多いし
636 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 09:59:56.81 ID:kicNWBgmM.net] 変数forならラッパ作れば終わりだけどなんかつまらないね。 apply(op).for(sequence)とかのほうがインターフェースとしては見栄えがいいかも
637 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 10:38:35.17 ID:8qKZRJJX0.net] >>624 ユニファイドコールシンタックスっていう提案が出ていたけど、ぽしゃった。 俺もほしい。
638 名前:デフォルトの名無しさん [2017/11/13(月) 10:50:06.32 ID:4dN82Cnsd.net] 「制御構造までオブジェクトに属するべき」ってやり過ぎというより単に根拠のない主張だよね。
639 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 11:12:29.10 ID:lmnXwEnk0.net] range-based forで十分じゃん何が不満なんだ理解できない 俺が思うのはインデックス取れたらいいなあということぐらい
640 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 11:19:17.35 ID:zGRAb4NCa.net] 書いといてなんだけど624と630の意見に賛成
641 名前:デフォルトの名無しさん [2017/11/13(月) 11:43:20.37 ID:4dN82Cnsd.net] zipwith相当のことをどうやって書く?
642 名前:デフォルトの名無しさん [2017/11/13(月) 12:13:53.76 ID:uodQK+nnH.net] >>630 最終的な結果がその処理順序に影響する(ここのオブジェクトへの操作が独立していない)場合には範囲for文使うなってことじゃね? 標準で取れるようにしてる言語も中にはあるけど
643 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 12:34:55.34 ID:kicNWBgmM.net] >>628 それは全然別の機能だけどな
644 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 13:01:28.76 ID:3MWvQR0t0.net] >>601 meyers本ってそんなに役立つかねぇ 最初のeffective c++ちょろっと読んだ程度なので最近のは知らんけど あの人の本に従ってる人は、自分で考えて創意工夫しない人が多いよ セオリーに固執する日本人はそういうパターンに陥りがち
645 名前:デフォルトの名無しさん [2017/11/13(月) 13:13:06.32 ID:pJUCOUGu0.net] お前らの創意工夫よりメイヤーズの方が100倍信じられるから
646 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 13:29:22.72 ID:3MWvQR0t0.net] 自分の才能や経験の不足を虎の威で補おうとしてるのなら、終わってるよ meyersが「こうしろ」と言ってることの、理由まで含めて納得するならいいけど そうでない人の方が圧倒的に多いからなぁ >>636 がまともな実力持ってるなら、meyersが言うセオリーに当てはまらない場面なんて山ほど経験してるはずだが
647 名前:デフォルトの名無しさん [2017/11/13(月) 13:33:42.96 ID:2e8VXpGed.net] >>637 例えばどういう場面?
648 名前:はちみつ餃子 mailto:sage [2017/11/13(月) 14:57:06.43 ID:eMI9MrYT0.net] >>635 あーいう本は典型的・基本的な工夫を示すもので、それを踏まえてその先へ行くもんなんだよな。 基本でしかないことに拘泥するのは下策でも、基本的なことすらおさえずにいるのは論外だから役には立つよ。 ある程度の経験を積んでいればああいう本に書かれているようなことは習得していて当たり前だっていう意味で 有用さに疑問を持つって意味かな?
649 名前:デフォルトの名無しさん [2017/11/13(月) 15:36:55.69 ID:pJUCOUGu0.net] ド素人の創意工夫とかマジ勘弁してほしいな セオリーもちょろっとしか知らないのに自分のコードが正しいと思い込んじゃうパターンだなこれは
650 名前:デフォルトの名無しさん [2017/11/13(月) 15:57:04.39 ID:50LJDJg60.net] まぁ公園の立て看板みたいなもんだからな
651 名前:635 mailto:sage [2017/11/13(月) 18:34:02.62 ID:Rgprs5DR0.net] >>637 >>639 手元にないので軽くぐぐってみたけど、確かに初心者が手元に置いておくべき良書だというのは否定できないw ほとんど突っ込みどころなんて無いし(当たり前の内容も含めて、”大抵のパターンで”正しい話ばかりだと思う)、 ちょっとけなしすぎたかも ただ「値を返す関数の戻り値にもconstつけよう」ってのは理解できんかったがw(古い本なのでしゃーないか?) こういうのあるから鵜呑みは良くないと思うんだよね 結局は自分の頭で考えないといかん まぁ最新の版だと変わってるかもしれんし本文がどう書かれてるかわからないので、間違ってたらスマソ
652 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 19:14:19.64 ID:IBZYfbeXM.net] 俺のつたない経験でも>>637 は口先だけの使えない奴だとわかる
653 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 19:28:15.39 ID:Rgprs5DR0.net] >>643 そっくりそのまま返すわ、どうせ教えられた通りの書き方しか出来ない無能だろ?
654 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 19:37:54.37 ID:jV9TFoOE0.net] >>642 呆れた。 ろくに読まずになおも否定したいのか。
655 名前:デフォルトの名無しさん [2017/11/13(月) 19:38:46.06 ID:4dN82Cnsd.net] >>640 おかしな事を言うね ど素人は好きに創意工夫すればいいんだし、そもそも自由だろ プロはプロなりのレベルで創意工夫してるんだろうし、対象層がわからん
656 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 19:41:58.13 ID:Rgprs5DR0.net] >>645 だいぶ昔に借りて読んだ程度のうろ覚えで否定したが >こういうのあるから鵜呑みは良くないと思うんだよね meyers本に限らず、これが間違ってると思ってんの? それとも >「値を返す関数の戻り値にもconstつけよう」 これが正しいと思ってんの?
657 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 19:56:42.22 ID:IBZYfbeXM.net] >>644 はいはい 口先君にはかなわないや w
658 名前:はちみつ餃子 mailto:sage [2017/11/13(月) 20:05:51.53 ID:eMI9MrYT0.net] d2dcan0armyq93.cloudfront.net/photo/odai/400/b24797f835fc8aa55b74e76aa1a3efbe_400.jpg
659 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 20:56:07.38 ID:aYJEvERuM.net] >>647 発言を局所的に切り取ってやり玉に上げるマスゴミみたいなやつだな。 否定したいならちゃんと読んでからにしろよ。 それに世界中のc++erに査読されて正誤表も常に更新されている本に>>647 が突っ込めるようなことは書いてないから。 後、c++11以降はmodern effectiveのほうだから間違えないようにね。
660 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 20:59:24.41 ID:8bmF3HL10.net] >>637 が正しいなら「meyersが言うセオリーに当てはまらない場面」で使うべきセオリーを解説した書籍があって然るべきだが そのセオリーを持っているのは世界中で>>637 一人だけらしい
661 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 21:14:54.89 ID:Rgprs5DR0.net] >それに世界中のc++erに査読されて正誤表も常に更新されている本に>>647 が突っ込めるようなことは書いてないから。 それ言い出すとmeyers本以外もそうだよね >自分の才能や経験の不足を虎の威で補おうとしてる と言ったのがよっぽど図星だったのか? >「meyersが言うセオリーに当てはまらない場面」で使うべきセオリーを解説した書籍があって然るべき 何言ってんだこいつ・・・・
662 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 21:16:31.80 ID:Rgprs5DR0.net] 上級者ぶったド素人が煽ってくることが最近多いんだよな・・・・沸かせてしまったようでスマン
663 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 21:29:07.66 ID:gczEvEcT0.net] > 上級者ぶったド素人 笑うところなんだろうか...
664 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 21:38:07.19 ID:ai0URxg+0.net] 何の役にも立たないことしか言えないマウンティング野郎なんて放って置けよ 俺も最近C++使う頻度が落ちてきてるので最新の規格について行くのがつらい おすすめの本を紹介してくれよ
665 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 23:12:57.95 ID:Rgprs5DR0.net] あ、一つ看過できない文があったので突っ込んどく >>650 >発言を局所的に切り取ってやり玉に上げるマスゴミみたいなやつだな。 >>647 で切り取ったのは全て俺のレスなんだが・・・バカじゃないの
666 名前:デフォルトの名無しさん mailto:sage [2017/11/13(月) 23:44:05.34 ID:VhEXZUqOM.net] 愚者は経験に学ぶとはよく言ったものだ。
667 名前:はちみつ餃子 mailto:sage [2017/11/14(火) 01:12:42.81 ID:sf3KY8eH0.net] >>646 プロであるということとド素人であるということが両立することもあるのが業界の闇ってやつだ。
668 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 01:26:10.22 ID:pNE3yOyS0.net] プロってプロフェッショナルの略なんでしょう? 意味は専門家、本職 素人とは その事に経験が浅く、未熟な人。 その道で必要な技能や知識をもっていない人。ま た、その事を職業・専門としていない人。 両立はかなり困難。 プロになりすます素人なら有るかもしれないが、ちょっと意味が違うよね。
669 名前:デフォルトの名無しさん [2017/11/14(火) 05:32:45.44 ID:Qlty8abH0.net] 両立つーかさ、誤解されるんだよね 俺も時々ご近所のオバチャンに パソコンのプロなんだと勘違いされる 俺はPCに関しては完全にお客さんなんだが
670 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 06:51:17.15 ID:FlTFFitRM.net] >>659 その道で生計たててるド素人ってことだろ
671 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 06:54:42.56 ID:tdyDp5gr0.net] 人に教示して何らかの成果を与えられるレベルの人間を人はその道のプロと呼ぶ
672 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 06:59:19.15 ID:DJh/5L380.net] 人に教示なんてプロのあり方の一つでしかないだろ
673 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 07:49:46.74 ID:+V+yUas7M.net] >>546 これって皆さんどう考えてますか? うちのプロジェクトでは規約で スタック領域は基本16KB未満、 例外で許容出来るのは1.8MBまで、 オートは厳禁と決まっているので 気にしたことなかったです
674 名前:デフォルトの名無しさん [2017/11/14(火) 07:57:32.24 ID:WJGjqzt8d.net] >>664 >オートは厳禁 こっちの方が気になるんだが
675 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 08:14:14.12 ID:+V+yUas7M.net] >>665 auto変数じゃないです allocaのことです
676 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 09:42:20.00 ID:kNpqefN60.net] なんだ、無能が暴れてたのか 参加できなくて残念だ
677 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 12:27:34.86 ID:RoZqoRkM0.net] >>667 =>>626 あんなアホな長文書けるやつに無能とか言われたくないわw 今はメタプログラミングが主流かーそうかー あと、かつてオブジェクト指向を最も全面に押し出してたのがJavaだったんだけどね ついでに>>650 =>>657 ID変えてまでご苦労さん
678 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 12:52:46.80 ID:Dc+h7CROM.net] >>664 組み込みなら別に珍しくない ってか関数単位の制限なら結構緩いと思う
679 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 14:51:11.71 ID:kNpqefN60.net] 言うなれば、そうだね いい年越えたおっさんが、子供を笑ってるのがあまりに滑稽だったから 逆に笑いものにされてる、と言ったところか あと、自分の発言の都合の良い部分だけ切り抜いて押し通そうとする幼稚な戦法が 通じると思っているあたり、随分な思い上がりだな
680 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 15:02:26.05 ID:kNpqefN60.net] ああ > 都合の良い部分だけ切り抜いて押し通そうとする幼稚な戦法 は君の言う「自分で考えて創意工夫」の結果なのかな? こーゆーのが透けて見えるから愚者と言われるんだろうな 気を付けたほうが良いよ
681 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 15:16:47.23 ID:y8IxqJhx0.net] 次スレからスレタイトルを人生相談室にしよう
682 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 15:29:24.63 ID:RoZqoRkM0.net] >いい年越えた こいた、な メタプログラミングが主流、の説明してもらえる? 出来ないのなら、煽るしか能のない荒らしだと自覚した方がいいよ C以来のテクニックやC++でのOOPなどの昔ながらの技術はもう出尽くしてるから そういう誤解する初心者が多いんだろうけど・・・・まともにメタプログラミングやったことあれば それが主流だなどと豪語できないよ
683 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 16:21:46.02 ID:kNpqefN60.net] それは君が文章やスレの流れを全く読めないというだけ > メタプログラミングが主流、の説明してもらえる? まさに一部だけ抜き出してマスコミ云々だな それで一部だけ抜き出して自分のフィールドに持ってきて ゴチャゴチャ言うのが君の創意工夫なのか?通用しねーよ >C以来のテクニックやC++でのOOPなどの昔ながらの技術はもう出尽くしてるから >そういう誤解する初心者が多いんだろうけど・・・・ >まともにメタプログラミングやったことあれば >それが主流だなどと豪語できないよ ↑全体的に攻撃先がズレてて的外れ >>618 を読めば分かるが、「次期」C++に入ってほしい、というような内容 で、OOにこれ以上施すことはあまりないので、C++標準化委員は OOよりメタプログラミングを主体に策定している (から、今更OOっぽい書き方は入らないんじゃね?)と言ってるまで
684 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 16:36:44.71 ID:RoZqoRkM0.net] ああ、そういう流れだったか、そこは誤解してたようだスマン ただし>>626 の4行目以降、全部お前の願望だと思うがw >まさに一部だけ抜き出してマスコミ云々だな >それで一部だけ抜き出して自分のフィールドに持ってきて >ゴチャゴチャ言うのが君の創意工夫なのか?通用しねーよ うん、しつこいよ というか>>656 でその煽りが不適当だと指摘してるんだが本人謝りもしねーし そういう悪意ある煽り文(しかも他人の文に乗っかって)を自分で読んでどう思う? 俺がこういうキツイ書き方してる相手は全部煽ってきた相手だけなんだが >C++標準化委員はOOよりメタプログラミングを主体に策定している 11, 14, 17, 20の新機能見ても、そうは思えない 自分の願望をさも事実かのように書くのはいかんよ >>618 的な書き方が入ると思う、というわけではないけど
685 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 17:44:34.35 ID:kNpqefN60.net] 自分の発言だろうが、他人の発言だろうが 都合のいいところだけを切り取って流れを無視するのは マスゴミ的って話だろ、そういう余計で姑息な工夫は要らないし その意味で「お前の創意工夫は要らない」って笑われてるんだろ 誘導尋問じゃねーんだよ > >C++標準化委員はOOよりメタプログラミングを主体に策定している > 11, 14, 17, 20の新機能見ても、そうは思えない あ、っそ
686 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 17:54:08.40 ID:5jBDp5KP0.net] 新機能の話をしていると初心者はさもそれが当たり前に使えなければならないように感じるがそんなことはない。 俺C++でクラスを自作することかなり少ないし。関数だけでもプログラミングはできる。 constexprも入ってやりやすくなったしな。そしてそれを全部内包するのがC++だ。
687 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 18:09:19.85 ID:kNpqefN60.net] 朱に交われば赤くなるって諺もあるしなぁ 初めからウンコを触るつもりで取り扱ってないと危険なのかも 思考が染まると、それを通して周りを見るので ヒントが沢山あっても正しく捉えられなくて なかなか抜け出せないのかもしれない それか、初めから頭がおかしかったパターンもあるかも どっぷりな人はそっちかも 黎明期は集団で流れることがあるからなぁ (なにせ悪は甘美) 学生運動とかいう今考えると理解しがたいのが流行ったり 大人側が組み入れながら徐々に脱却って感じかね
688 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 18:09:36.71 ID:RoZqoRkM0.net] >>676 うわ、話にならんわこいつ・・・ >>677 荒れさせておいて同意するのも申し訳ないけど、俺もそうとしか思えない D&E読んでも、C++がマルチパラダイムを自称するのはそういうことだし 「知らないことがその人を不幸にしない」とかゼロオーバーヘッドの話はまさに>>677 に合致する 最近C++を勘違いしてるヤツがデカイ口叩きすぎだわ そういうのはごく一部で、大抵無視されてるんだろうけど、C++を学ぼうという初心者が減ったら迷惑なんだけどな・・・・ 荒れさせてスマソ、バカが調子に乗ってるのでこの辺にしとく
689 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 19:35:24.74 ID:0CBPSjnu0.net] C++ってクラスとかテンプレート使うのがパチッとくる 場合はいいけれど、難しいで。 過去のCのプログラムとかC++のクラス使って書き直そうとすると。 実力なしでゴメソ。
690 名前:デフォルトの名無しさん [2017/11/14(火) 19:36:24.31 ID:WJGjqzt8d.net] OOに関してはひところ純粋主義者が極端な言説を展開してC++をdisる流れがあったから、 それに対する反発と恨みがあるんだろうよ
691 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 19:45:52.27 ID:0CBPSjnu0.net] >>681 俺もC++でOOのなんたるか理解しようとして心が折れそうになった。 肩身せまそうにbetter Cとしか使ってませんとか。 今ならrubyとか極端な話、powershellのコマンドいじくって た方がわかりやすい。隠ぺいか(カプセル化)も 中身が細かく知りたいときには、イーッってなるし。
692 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 20:21:53.24 ID:kNpqefN60.net] なんだかんだ、OOはオプションのうちの一つ というありきたりの結論
693 名前: mailto:sage [2017/11/14(火) 20:47:09.33 ID:l3LpPi1S0.net] >>682 カプセル化は、アクセス・窓口を制限・整理する、という目的だとおもいます >>677 >新機能の話をしていると初心者はさもそれが当たり前に使えなければならないように感じるがそんなことはない。 じゃ、ムーブセマンティクスも忘れちゃっていいですか、RVO に頼るだけでいいですか?え?だめ?やっぱりやらなきゃだめですか
694 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 20:54:58.60 ID:5jBDp5KP0.net] >>684 最適化するんなら必須か知らんけど、あるていどはコンパイラさんに投げてもよいのでは?
695 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 21:53:29.73 ID:Dc+h7CROM.net] もうなんの話をしてるのかよくわからんけど >>637 > >>636 がまともな実力持ってるなら、meyersが言うセオリーに当てはまらない場面なんて山ほど経験してるはずだが の具体的な場面だけは教えて欲しいわ
696 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 22:17:43.84 ID:0CBPSjnu0.net] >>684 >カプセル化は、アクセス・窓口を制限・整理する、という目的だとおもいます (データ+アクセス専用関数)=クラスだろ
697 名前:デフォルトの名無しさん mailto:sage [2017/11/14(火) 23:16:12.96 ID:kNpqefN60.net] OO用語の定義に関して、何か始まりそうな感じだが もう何十回と繰り返されたか、初心者的にはまだまだやり足りないのかもしれないが 老婆心ながら言わせていただくと、OO用語の定義談義合戦は過去幾度となく繰り返されたが 特に意味はなかったから止めておいたほうが良いよ OO自体、まじめに考えてもあんま意味ないっつーか、むしろまじめに考えるとドツボっつーか 一見正しいけど、本質的には意味が無いことってあるじゃん ある視点で見れば正しいんだろうけど、そういうことじゃないっていう どうしてもやりたいなら止めないけど
698 名前:デフォルトの名無しさん [2017/11/14(火) 23:25:41.26 ID:WJGjqzt8d.net] 定義がないんだから議論の正しさの検証も測定もできないしね
699 名前:デフォルトの名無しさん [2017/11/14(火) 23:47:17.80 ID:A1uj0brl0.net] 測定機ならAliexpressでいろいろ売ってるよ。
700 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 04:07:06.94 ID:EEpCgCZL0.net] C++のクラスなんて便利な構造体以上の何者でもない OO宗教でそれ以上の縛りを入れる必要なんてないわ
701 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 04:43:25.86 ID:oRL+59ym0.net] C++の書式がどーの新機能がどーのってプログラマーが、楽になる機能なわけで、本質は、楽してコードが動けばいい。 学術的だとどーでもいい。議論するだけ無駄。 コンパイラは、速くて、安全なアセンブリコードを吐いてくれればいいよ。
702 名前:デフォルトの名無しさん [2017/11/15(水) 05:57:24.70 ID:1fEpam2j0.net] 禿もそういう系の揉め方を防ぐように気を使っているらしいな なんだっけ、どの分野の人々をも侮辱しないとか 全てが1つのクラスから派生しなければならないというのは押しつけがましいとか
703 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 13:52:35.02 ID:qOFIR485M.net] 数値の比較をしていってある一定の差があるところを区切っていきたいです たとえば{1,4,7,8,11}って値を先頭から見て行って差が2以上あるところ{1}{4}{7,8}{11}のような感じで区切る どうすれば実現できるでしょうか
704 名前:デフォルトの名無しさん [2017/11/15(水) 14:31:02.26 ID:l7NNgtZ+d.net] >>694 「区切る」の定義をしてくれ 入力が文字列じゃなくて数値ってことは、間に区切り文字を挟むとかそういうことじゃないんだろう。
705 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 14:34:11.09 ID:ckRbh5hb0.net] 後ろから前を引いて2以下?なら前を前回と同じバッファにプッシュバック。的な感じ。
706 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 14:55:59.73 ID:qOFIR485M.net] >>695 後々区切られたまとまり毎に操作したいので できればまとまり毎にそれぞれ別の変数に入れたいです ただ操作上絶対に有り得ない数値を区切り文字として使うのでも良いです {1}{9999}{4}{9999}{7,8}{9999}{11}{9999} みたいな形で
707 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 15:10:16.47 ID:mxK8zV000.net] こりゃまた大物新人が来ましたね
708 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 15:49:08.40 ID:hv/Fx57R0.net] >>694 の書き出し化けてない? 「??白lの比較をしていって…」と表示されるんだけど。 対象の {1,4,7,8,11} はconstの整数のvectorへの参照で受け取るとして、 結果は要素グループごとに格納したvectorのvectorで返すかな。 各グループの先頭要素へのインデクスを格納したvectorで返すかも。 >>697 を見ると、前者の方が後の使い勝手が良いのかな。 要素グループのvectorのvectorってこと。
709 名前:デフォルトの名無しさん [2017/11/15(水) 16:08:47.13 ID:l7NNgtZ+d.net] 俺の知らない言語の話だったか...
710 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 16:15:16.93 ID:SXIXTuPm0.net] 麻雀か何かのアルゴリズム?
711 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 16:20:55.95 ID:8IQafsadM.net] >>699 実装も前者の方が楽そうですな。 前の値と比べて差が広かったらグループ追加。
712 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 16:49:04.26 ID:5RHQ4qAcM.net] >>699 その部分は数値の比較と書きました 要素グループのvectorのvectorですか どのような感じで書けばいいとかどのような調べかたをすれば良いか教えて頂けないでしょうか 取っ掛かりが分からなくて
713 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 16:49:57.11 ID:VtRcCO4N0.net] >>697 参考までに聞きたいんだが この処理を何に使うの?
714 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 16:57:55.30 ID:5RHQ4qAcM.net] >>704 ある方法で手に入れた
715 名前:「くつかの数値を先頭値から見ていき、 前後で差が小さいもの同士でグループ分けしていったあと そのグループ毎の平均値を出していきたいだけです [] [ここ壊れてます]
716 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 17:01:28.65 ID:mxK8zV000.net] それを何に使うかって聞いてんじゃないの
717 名前:デフォルトの名無しさん [2017/11/15(水) 17:04:07.50 ID:QX/ZMY070.net] こういう泥臭いのは人に聞くよりもスクリプトでもなんでも良いから書いて試行錯誤すればいいと思うのよ
718 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 17:07:39.49 ID:VtRcCO4N0.net] 株価やFXの予測とかそんな感じか?
719 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 17:52:07.11 ID:SXjwAfn20.net] >>705 ruby2.2〜ならchunk_while/slice_whenで出来る
720 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 18:15:01.29 ID:SXjwAfn20.net] スレタイみてなかた
721 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 18:49:45.50 ID:9uMqyRhU0.net] >>705 思い付くまま書くとこうなるがもう少し短く出来そうな気もする Ideone.com - dOQm10 - Online C++ Compiler & Debugging Tool https://ideone.com/dOQm10
722 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 20:48:51.98 ID:5RHQ4qAcM.net] >>711 ありがとう参考にする しかし、よくこうスラッとプログラム書けるよなぁ 凄いわ
723 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 20:52:44.99 ID:r8JgjB1aM.net] 平均なら https://ideone.com/tZALcZ で充分と思うが
724 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 22:24:21.73 ID:KiQc4/2v0.net] 自分なりにやってみた。 https://ideone.com/ugURi1 >>711 vector::insertで領域の再確保が起こると既存のイテレータが破壊されるんで 24-25行あたりの処理はヤバイ。
725 名前:デフォルトの名無しさん mailto:sage [2017/11/15(水) 22:45:07.35 ID:sivdqd190.net] >>694 書き方だけならもう少し洗練?できるだろうけど https://ideone.com/DYlMc0
726 名前:デフォルトの名無しさん mailto:sage [2017/11/16(木) 19:03:07.86 ID:qgvG7lfo0.net] すれちがいだけど、 C++が出る前のC言語で、STLが必要な処理はどうしてたの?
727 名前:片山博文MZ mailto:sage [2017/11/16(木) 19:10:17.36 ID:1Qzf60whd.net] >>716 固定バッファとか、ヒープとか、自己参照構造体などで管理してたはず。
728 名前:デフォルトの名無しさん mailto:sage [2017/11/16(木) 20:50:27.90 ID:WXeeSnzL0.net] >>612 ←こういう馬鹿がいるから
729 名前:デフォルトの名無しさん mailto:sage [2017/11/16(木) 21:22:02.83 ID:xIkq77qW0.net] 一応つっこみ。 型の一般化がテンプレートと思うが マクロじゃなくてテンプレート使えって書いてた本もあったような 気がする。
730 名前:デフォルトの名無しさん [2017/11/16(木) 21:27:58.68 ID:w4cxkmV2d.net] >>718 新たな馬鹿の登場かな?
731 名前:デフォルトの名無しさん mailto:sage [2017/11/16(木) 21:39:47.71 ID:Pxu9bZObM.net] >>716 いや自分で書けばよくね?
732 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 08:37:40.63 ID:smNh
] [ここ壊れてます]
733 名前:jLrp0.net mailto: >>716 STL 等はあれば便利なだけで「それが必要な処理」などない。 [] [ここ壊れてます]
734 名前:デフォルトの名無しさん [2017/11/17(金) 09:38:50.05 ID:S87VOpst0.net] >>716 STLで使われているアルゴリズムはC++前からあったものばっかだよ
735 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 09:46:53.51 ID:4EHSQg4KM.net] 汎用アルゴリズムのコードを業界で共通化することもなく、みんなが各々で実装してたんですか?というアンチテーゼだろ
736 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 09:59:16.63 ID:smNhjLrp0.net] 違うと思うけど?
737 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 10:03:14.26 ID:NwY4XtJI0.net] まぁ、ライブラリとして偏在はしてたんだろうけど、あの会社はあのライブラリこの会社はこのライブラリってややこしいことになってたと思う。
738 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 16:57:04.66 ID:vGXyPrNqa.net] リンクリストと平衡二分木ぐらいなら雑に書いても500行ぐらいでできる みんな大学の復習と思って書いてたんじゃないかな?
739 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 18:49:47.16 ID:a6b9gyRQd.net] 自力で書いてる人の方が多かった STLがあっても用途によっては独自になるよな ディスク上に作るとか、JPEGのハフマン符号みたいに表現が決まってる物とか
740 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 18:52:08.38 ID:a6b9gyRQd.net] STLはあくまでお手軽用途 表現縛りがなかったとしても、 ガチガチに最適化する用途では使えない
741 名前:デフォルトの名無しさん [2017/11/17(金) 20:50:18.49 ID:HNipYc2I0.net] 最適化できない? なんで?? テンプレートだろ
742 名前:デフォルトの名無しさん [2017/11/17(金) 21:51:52.32 ID:Eetf/DNi0.net] テンプレート万能説爆誕。
743 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 22:21:21.86 ID:EgKbzTW+0.net] if ( オーバーヘッドがない != 最適化される )
744 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 22:36:52.56 ID:stAFfC8Ar.net] ガチガチに最適化する状況が最近はほとんどない
745 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 23:08:51.45 ID:grVEZAi9M.net] ガチガチに最適化すべき場合ってどんな時だろうか
746 名前:デフォルトの名無しさん [2017/11/17(金) 23:17:53.86 ID:Eetf/DNi0.net] ガチガチの最適化が仕様に盛り込まれたとき。
747 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 23:46:01.61 ID:grVEZAi9M.net] そんな恒真命題は期待してないゾ 証券取引所とかか
748 名前:デフォルトの名無しさん mailto:sage [2017/11/17(金) 23:47:03.87 ID:Xj6+FFKd0.net] プログラミング工数の最適化
749 名前:デフォルトの名無しさん [2017/11/17(金) 23:50:29.19 ID:sEHgCDk10.net] 最近は凝ったアルゴリズムより単純な配列(vector)の方が速かったりするうえに、余程古いかクソな標準ライブラリを使用してない限りstd::vectorを最適化する余地なんてほぼ無いわな。
750 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 00:03:07.23 ID:r8nC/FGp0.net] 最適化はコンパイラに任せてソースは読み易さ重視 std使っとけばデバッガでも追いやすいし
751 名前:デフォルトの名無しさん [2017/11/18(土) 00:08:41.90 ID:CUoz+hOS0.net] 拡張ライブラリが有ったとしたら、名前空間はstxになるのかね。
752 名前:デフォルトの名無しさん [2017/11/18(土) 00:11:29.34 ID:CUoz+hOS0.net] Qtでウェブサイト作ったら何の問題もなくずっと動き続けてびっくりですよ。 Javaスレの人たちがC++は稼働し続けるとメモリーの分断化で落ちるとか言ってたから、 早く書き直さなきゃって思ってたんだけど。 クライアント用のQtがサーバーで頑健だったのは意外だった。
753 名前:デフォルトの名無しさん [2017/11/18(土) 00:14:32.63 ID:asu2qdyg0.net] まぁ意識高い系が言うことなんかその程度ってこった
754 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 00:21:40.93 ID:GO3RY34O0.net] >>741 TreeFrogの人?
755 名前:デフォルトの名無しさん [2017/11/18(土) 01:10:27.30 ID:PnwIkFzo0.net] >>741 クソJavaプログラマーがC++を書くとほぼ間違いなくやるただのメモリリークを俺のせいじゃないということにしたかっただけというのに1票
756 名前:デフォルトの名無しさん [2017/11/18(土) 06:06:05.59 ID:mIICZMYh0.net] 自分のコードでさえ後で読むと読みやすく書いたつもりが裏目に出ていたりする
757 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 08:23:02.49 ID:cx1PUhyJ0.net] 奴らはnewしても決してdeleteしないからな
758 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 11:32:01.12 ID:azZ7ClyG0.net] 俺も最近unique_ptrに任せっきりでdeleteってほとんど書かねえわ コピコンの=deleteとかは書くけど
759 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 12:02:10.83 ID:Erlsd62p0.net] >>739 古いコンパイラ(つっても10年くらい)だと、クラス内の配列をイジるとクラスオブジェクト自体がイジられたことになるので最適化放棄とかしてたしなー そういうのだとvectorなんて最適化放棄しまくり。
760 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 13:45:01.11 ID:6KFO0fze0.net] バカは素直にスマポ使っとけばいいのにな
761 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 14:09:50.22 ID:fgAW9Gk/0.net] >>748 オブジェクトXに対するアクセスの最適化放棄はコンパイラの知りえない形での Xへの副作用が有り得ると判断された場合に行われるがこれは現用コンパイラでも変わらん 改善したというのはコンパイラの能力向上というよりは、テンプレートによるインライン展開のご利益なのでは… (つまりstd::vectorは元来最適化向きの進化である
762 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 14:13:16.03 ID:fgAW9Gk/0.net] 例: 次のコードの並びにおいて、 1と3の読み込み結果は同一とはみなされず、1〜3を通してのX.aのレジスタ割り当ては行われない 1. Xのメンバaを読む 2. 外部リンケージ(かつ素性の知れた組み込み関数以外)の関数foo()を呼ぶ 3. Xのメンバaを読む 特効薬はfoo()のインライン展開
763 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 14:16:28.52 ID:fgAW9Gk/0.net] なお手動を厭わないなら次の風にしても良い: 0. auto変数v = X.a 1. X.aを読む代りにvを読む 2. 外部リンケージ(かつ素性の知れた組み込み関数以外)の関数foo()を呼ぶ 3. X.aを読む代りにvを読む これならいくら古いコンパイラでもvを1〜3を通してレジスタ割り当てすることが気体できる
764 名前:デフォルトの名無しさん [2017/11/18(土) 16:28:12.38 ID:gZtBhbAH0.net] 浮動小数点をすべて網羅するループが書きたいのですがどうすればいいでしょうか。
765 名前:デフォルトの名無しさん [2017/11/18(土) 16:29:45.36 ID:CUoz+hOS0.net] ラスボス級が現れた。
766 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:46:32.60 ID:gZtBhbAH0.net] takashiijiri.com/study/miscs/fastsqrt.html やりたいことは、上のサイトにある高速根号計算の精度検証です。 サイト内では2の根号に対して精度検証していますが すべての倍精度実数に対して検証をしたいと考えています。 64bitの整数のビット表現を、同じビット表現の倍精度実数に変換できれば 整数についてループを回すことで網羅できると考えています。 変換の方法をご存知の方がいれば教えて頂けないでしょうか。
767 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:47:50.09 ID:R4dFDjUs0.net] >>753 イプシロン足してくとか。
768 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:48:48.90 ID:np1Yc2el0.net] >>755 memcpy
769 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:49:32.41 ID:R4dFDjUs0.net] >>755 IEEEの仕様読め。 https://ja.wikipedia.org/wiki/IEEE_754
770 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:50:13.11 ID:R4dFDjUs0.net] >>757 reinterpret_castでいい予感。
771 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:51:55.15 ID:np1Yc2el0.net] >>755 ところでその検証、何年ぐらい時間かけていい話なの?
772 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:53:01.86 ID:np1Yc2el0.net] >>759 未定義動作でも「いい」と言うなら、そう。
773 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 16:55:15.51 ID:R4dFDjUs0.net] あー検証だからな。すまんかった。
774 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 17:20:21.34 ID:gZtBhbAH0.net] みなさま、レスありがとうございます。 >>757 memcpyでできそうです。ありがとうございます。 int main() { double f = 0; for (unsigned long long i = 0; i <= -1; ++i) { void* fp = static_cast<void*>(&f); void* ip = static_cast<void*>(&i); std::memcpy(fp, ip, sizeof(i)); std::cout << f << std::endl; } system("pause"); } >>760 そんなに時間かかるんですかね。。。 1週間ぐらいは覚悟してたんですが。 とりあえず回してみます。
775 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 17:32:14.09 ID:np1Yc2el0.net] >>763 https://randomascii.wordpress.com/2014/01/27/theres-only-four-billion-floatsso-test-them-all/ > ... you can test every float bit-pattern (all four billion!) in about ninety seconds. ... 32bit が 90 秒ほどで済ませられるそうな。 64bit だと単純計算で・・・ 735439.6... 年ぐらいかな。 1週間で済ませようと思ったら 38347922 並列ぐらいで走らせればよさそう。 検証する計算内容によっても変わるだろうけど、まぁがんばれ。
776 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 17:35:34.11 ID:hpuIg+Nf0.net] とりあえず範囲を絞って回してみて、 力任せの方法で受け入れられる処理時間なら単純なプログラムのまま、 時間かかりすぎるようなら先にプログラムを洗練させる、としないと。
777 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 17:56:05.12 ID:gZtBhbAH0.net] >>764 ありがとうございます。 32bitと64bitが桁違いですね 範囲を絞ったり、間隔あけてサンプリングしたりしてみます。
778 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 19:06:18.60 ID:cx1PUhyJ0.net] isnan()でnanチェック入れたほうが良さそう
779 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 19:44:12.36 ID:euoYf0NO0.net] >>761 未定義にはならなくね?ポインタtoポインタだからそのまま、で終わりでは。 なお、Cなら *(long long*)&f = i; // mov命令でコピー または f = *(double*)&i; // fmov命令でコピー >>766 まず仮数部53bit+指数部の偶奇で54bit分でいい。 非正規化数もいらないだろうから仮数部52bit扱いでもいい。 意味が分からないのなら仕様読め>>758
780 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 20:29:47.22 ID:np1Yc2el0.net] >>768 type-based aliasing rule (strict
781 名前: aliasing rule) というものがあってな。 (詳しく調べると闇に落ちるから言語オタクでもなければ深堀りはおすすめしない。) mempcy なら動作が定義されてるかというとそうでもないんで、 明示的に未定義といわれているかどうか(=最適化で問題を起こしやすいかどうか)の違いしかないんだけど。 [] [ここ壊れてます]
782 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 20:40:55.67 ID:b6ZSsfqz0.net] std::launder「そろそろ俺の出番だな」
783 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 21:23:52.47 ID:azZ7ClyG0.net] ここまでfrexpとldexpの話なし
784 名前:片山博文MZ mailto:sage [2017/11/18(土) 21:57:24.41 ID:QiNK1qRtd.net] https://github.com/katahiromz/RisohEditor せっかくだから、だれかバグ発見・修正してけ。
785 名前:片山博文MZ mailto:sage [2017/11/18(土) 21:58:52.49 ID:QiNK1qRtd.net] 初回の例外というのがよくわからない。。。
786 名前:デフォルトの名無しさん [2017/11/18(土) 22:06:57.57 ID:asu2qdyg0.net] なんか古い書き方だから2000年ごろからの年季の入ったソースかと思ったら最近の奴なんだな
787 名前:片山博文MZ mailto:sage [2017/11/18(土) 22:12:33.66 ID:QiNK1qRtd.net] >>774 古臭い技術専門が時代遅れのために作っているもんだから、古いと言われても仕方ない。 auto、C++11が使えるclang++に移行したい。
788 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 22:42:09.82 ID:euoYf0NO0.net] >>769 調べたけどこれでいいのか? https://sta
789 名前:ckoverflow.com/questions/98650/what-is-the-strict-aliasing-rule これならreinterpret_cast関係ないじゃん。static_castにしたところで変わらん。 ただそれ以前に該当しないだろ。 「同一のメモリを違う型としてaliasしたときにコンパイラがそれに気づけず最適化で削除してしまう」という問題であり、 今回はそうではない。 > mempcy なら動作が定義されてるかというとそうでもないんで ほんとか?それじゃmemcpyマトモに使えないじゃん。 void*は++で1増えるって仕様に決まったはずで、、、と思ったがこれがgcc拡張だという話があり、このことを言っているのか? ならグダグダ言わずにCキャストで書けよもう、としか思わないが。 或いはC++的には許せないのかもしれんが static_cast<double>にしてしまうとかか? [] [ここ壊れてます]
790 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 22:48:23.04 ID:euoYf0NO0.net] すまんミスった × static_cast<double> ○ static_cast<double*>
791 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 23:20:13.09 ID:np1Yc2el0.net] >>776 static_cast じゃコンパイル通らない。 "*(long long*)&f = i" は double 型のオブジェクトに long long 型の参照を通してアクセスしているので 未定義動作になる。結果は「最適化で削除してしまう」に限らず、何でもアリだよ。 これが「「同一のメモリを違う型としてalias」に該当しないという理屈も無いでしょ。 memcpy の結果が定義されてるのは、同じ型のオブジェクト間でのコピーだけだったかと。 違う型の間で memcpy した結果の値が実は定義されてるということなら実に興味深いので ぜひ規格の該当箇所を示して欲しい。 この場合の C スタイルキャストの動作は reinterpret_cast に丸投げされるだけなので話は変わらないよ。
792 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 23:37:48.32 ID:5VdCNKN70.net] ここまでnextafter/nexttowardが出てきていない
793 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 23:38:32.35 ID:euoYf0NO0.net] >>778 > "*(long long*)&f = i" は double 型のオブジェクトに long long 型の参照を通してアクセスしているので してないぞ。 それは「fのアドレスを(long long*)にキャスト(この時点でlong long*型)したアドレスに対しiを書き込め」 であって、つまり long long に long long を書いている。だからmovが出る。 逆に f = *(double*)&i; は double に double を書くから fmov が出る。 その後の最適化で変更されるのはまた別の話。 > static_cast じゃコンパイル通らない。 だったら最初から>>759 の言うとおり、reinterpret_castでいいだろ。 > 違う型の間で memcpy した結果の値が実は定義されてる void* と void* なんだから同じ型だろ。何言ってんだ? お前、基本的に理解がずれてね?
794 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 23:47:06.34 ID:np1Yc2el0.net] >>780 なるほど、オブジェクトの型と式の型との区別がついてないんだね。 そこの理解無しで aliasing rule に関する話は無理だから、 C++ の規格を読み直すなりして区別が付くようになってからの出直しをおすすめする。
795 名前:デフォルトの名無しさん mailto:sage [2017/11/18(土) 23:50:31.47 ID:euoYf0NO0.net] >>781 俺には君が全く理解出来てないように見えるけどね。 まあ平行線だろうし、終わりでいいけど。
796 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 00:03:31.90 ID:xhmNfS4m0.net] >>782 そうなると GCC も「全く理解出来てない」ことになるねぇ。 https://wandbox.org/permlink/WMFUTpXAgs2oZuos > prog.cc:5:17: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] > *(long long*)&f = i; > ^ > prog.cc:6:18: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] > f = *(double*)&i; > ^
797 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 00:12:55.40 ID:XAwzlQ9S0.net] >>782 それ以上恥かきたくなかったらこれ読んでくるといいよ blog-ja.intransient.info/2011/05/c-13.html
798 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 00:41:57.82 ID:p3uF8GIb0.net] まあ未定義な動作がどこまで行っても未定義な動作であって(教条主義的には)悪なのは確かだが >>784 のリンク先のを読むと >ストアによってPの値が変わる可能性を考慮しなくてはいけないからだ。 という理由で最適化できないケースがあるから考慮する代りに未定義動作ということにしますた! というだけで、ストアによってPの値が変わらないなら特に問題を生じないように思える… で、ストアによってPの値が変わるケースというのは int main() { P = (float*)&P; // このキャストによって zero_array の中で TBAA 違反となる zero_array(); } みたいな変態的なケースしかなさげ;
799 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 00:54:18.30 ID:SsMAbqSz0.net] >>784 答え書いてんじゃねーかよ。 > この種の未定義な振る舞いは、-fno-strict-aliasing フラグを指定することで無効にすることができ つまり指定すれば万事解決だ。 ただその前にwarning出てても動作するとは思うが。 > この種の型の乱用はあまり一般的ではないので、標準委員会は、"妥当な" 型のキャストによる予期しない結果と引き換えに、大幅なパフォーマンス向上を選んだ。 これっていつから?LLVMに乗せた頃からっぽいが、、、日付や元URL見るかぎりC++11からか? あとこれって、Cもか? (Cでは俺が書いたようなキャストは常用されているから) 知っている人がいたらよろしく。
800 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:21:45.70 ID:p3uF8GIb0.net] つかmemset(buf, ch, nのbufって__restrictじゃなかったのか… 今知った……
801 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:24:03.10 ID:XAwzlQ9S0.net] C89からずーっとそうだよ お前が書いてるコードが動いてるのは、コンパイラがそうしないという保証を独自に与えているか(-fno-strict-aliasingはその一例) さもなくばたまたま動いてるだけ
802 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:33:36.82 ID:xhmNfS4m0.net] >>786 広く知れ渡ったのは gcc 2.95 で実際にそのルールに基づく最適化が行われるようになってからかな。 https://www.gnu.org/software/gcc/gcc-2.95/features.html > - Type based alias analysis is enabled by default. ... そこから数えてももう 20 年近く経つわけだが。 知らずにそんなキャスト常用してるなら是非悔い改めてくれ。
803 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:35:13.22 ID:p3uF8GIb0.net] (ま、__restrictな形でしかポインタしか使わない漏れには関係ないし…
804 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:37:52.26 ID:XAwzlQ9S0.net] ちなみに-fno-strict-aliasing付けるとこんな基本的な最適化さえ出来なくなって パフォーマンスが激悪化する可能性があるからな それを完全に理解した上で万事解決だと言ってるならそれでもいいけどさ int foo(double* pd){ int k = 42; *pd = 666; return k * 2; } -fno-strict-aliasingを付けた場合、戻り値を"84"に最適化することは出来ない なぜならpdのアドレスが&kを指してるかもしれないから (strict aliasing ruleが効いてればdouble*がintを指してたら未定義動作なのでケアする必要がなく最適化できる)
805 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 01:42:54.83 ID:xhmNfS4m0.net] >>791 引数で受け取った(有効な)ポインタが関数内のローカル変数を指すことは不可能だから、その例は最適化できるよ。
806 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:15:02.16 ID:XAwzlQ9S0.net] 有効なポインタならね デタラメなポインタがたまたま&kを指してるかもしれない 普通はそんなのは未定義動作だからケアしないんだけどそれをケアしろって言うのが-fno-strict-aliasing
807 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:22:43.60 ID:SsMAbqSz0.net] >>789 > mempcy なら動作が定義されてるかというとそうでもないんで (>>769 ) これは間違いだろ。784内見る限り、 > Cは、このような型変換をmemcpyを使って実現することを要求している。 なら、memcpy使えば正しい結果が得られるはずだし、そうじゃないとコンパイラのバグになる。 つまり、>>763 のコードは正しく動くはず、と読めるが。 ちなみに>>783 のページで色々試してみた。(もし編集が残っているようならすまん) 全てgcc 7.2.0 で、結果は以下。 ・CはC11/C11(GNU)の両方でwarinigも何もでない。 ・C++はこの中の一番古いC++03/C++03(GNU)の両方でwarinigは出る。 ということはかなり昔からC++ではそうだった、ということだね。全く知らんかったわ。 ここら辺がCの連中がC++を嫌っているところなのかもしれない。 >>788 おお、サンクス、C++89からか。 俺環はVC++2008だからね。MS側が吸収してくれてるわけか。 >>789 いや俺環では問題ないしな。 つかたぶんこれC++の話で、上記試した限りCなら問題ないんだよ。 ただ俺はbetterCの人だから、まあ微妙なわけだが、、、VC++2017とかに移行するときは気をつけるよ。 さてそのリンク先 https://www.gnu.org/software/gcc/news/alias.html も読んでみたが、つまり s->x_m[i] は s->a_m と型が違うから上書きしないはず、 だからループ内で毎回 s->a_m を取らずに前回の値をそのまま使っていい、ということらしい。(s->b_mも同様) ただこれなら for (unsigned long long i = 0; i <= -1; ++i) *(long long*)&f = i; は確実に動くけどな。ここで端折られるのはfのアドレス確認 &f 部分だけだから。 ただしstackoverflowの連中は言っていることが少し違うから、もうちょっと確認が必要だが。
808 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:26:53.00 ID:xhmNfS4m0.net] >>793 んなこたーない。 https://godbolt.org/g/wDD6Zk
809 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:37:45.46 ID:SsMAbqSz0.net] >>791 周回遅れですまんが俺には794に書いたとおり、 ・型違いは全てmemcpy使え。 と読める。だから763のコードはOKだと。 >>791-793 の内容は理解した。 さて再度だが、やはり以下は動くだろ。 for (unsigned long long i = 0; i <= -1; ++i) *(long long*)&f = i; ここで問題なのは、「fがiのアドレスをさしてたら未定義動作(&f==&i等)」であって、 i をコピーしてやらない、ではない。 791-793の言い分どおりなら、これはwarningが出てるだけで全く問題なく動くはず。 ただしstackoverflowの連中はちょっと違うことを言っているが。
810 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:42:26.05 ID:xhmNfS4m0.net] >>794 C の aliasing rule には memcpy, memmove によって宣言型を持たない(たとえば malloc で確保した)オブジェクトの型 (effective type) を変更できるという規定がある。 引用された「memcpyを使って実現することを要求している」はこのことだろう。 でも、 C++ にはこれに相当する規定が無い。
811 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 02:53:12.72 ID:xhmNfS4m0.net] >>796 残念、まだ理解できてないよ。 答えは >778 にある。 > "*(long long*)&f = i" は double 型のオブジェクトに long long 型の参照を通してアクセスしているので > 未定義動作になる。結果は「最適化で削除してしまう」に限らず、何でもアリだよ。 これ以上は規格見てからしゃべってくれ。
812 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 03:03:03.03 ID:SsMAbqSz0.net] てゆーか、見てなかったけど763はfor文回らねーじゃねーかよ! >>798 ちょうどよかったので今>>795 を改造してアセンブラ見てるんだが、、、すまんが今日は寝る。 昼前にはまた書くよ。
813 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 06:07:15.51 ID:p3uF8GIb0.net] 未定義動作マジコエー;;(>>784 のリンク先の次のページ ttp://blog-ja.intransient.info/2011/05/c-23.html
814 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 06:25:20.22 ID:p3uF8GIb0.net] プロセス屋さんががんばってCPUを3年ごとに倍早くしてくれるのだから 我々ソフト屋は口を開けて待っているだけにして 最適化なんてやめてしまえば良いのに 我々が忙しく働くということは、それだけバグを産むということなのだ…!
815 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 07:18:18.83 ID:mXpVaiBzr.net] >>795 出来ると主張する人に対して たまたまできない一例を根拠に 出来ないことの立証を主張されても…
816 名前:デフォルトの名無しさん [2017/11/19(日) 07:18:20.90 ID:Rb2sIcHm0.net] CPUだけ速くなってもDRAMの速度が昔のままだ .7CRなんて法則を持ち出すまでもなく 現実にCPU速度が飽和したと感じたことなどないはずだが
817 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 07:23:52.01 ID:mXpVaiBzr.net] >>795 >>802 は夢をみた。忘れて
818 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 08:50:45.23 ID:OzmZfN1I0.net] >>768 読んでも分からないときは?
819 名前:デフォルトの名無しさん [2017/11/19(日) 10:12:41.15 ID:Rb2sIcHm0.net] >>805 ここで実験してみるとか https://people.rit.edu/meseec/eecc250-winter99/IEEE-754hex32.html
820 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 13:02:38.85 ID:SsMAbqSz0.net] >>795 改造は-fno-strict-aliasing有り無しによらず動くコードが出た。詳細は以下。 https://godbolt.org/g/QaSwTn -O3 -fno-strict-aliasing -std=c++14 -pedantic -Wall -Wextra で mov QWORD PTR [rsp+8], rbx (27,29行目)が出る。 -fno-strict-aliasing を切っても同じ mov 命令が出る。 だからこれはwarningが出ているだけで動くコードが出る。 このときのコードは以下。 void test() { double f = 0; for (long long i = 0; i <= 10; ++i) { *(long long*)&f = i; // (A) std::cout << f << std::endl; // (B) } }
821 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 13:04:16.49 ID:SsMAbqSz0.net] >>798 なお上記のGCC結果、或いは以下GCCのドキュメントは読んだ。 (ついでに後出の仕様書もチラ見したが、やはり今のところ君の理解がずれてるという見解だ。) https://gcc.gnu.org/onlinedocs/gcc-4.4.3/gcc/Optimize-Options.html#index-fstrict_002daliasing-750 ここでは以下コードがアウトだと言っている。 union a_union { int i; double d; }; int f() { double d = 3.0; // (C) return ((union a_union *) &d)->i; // (D) } アウトな理由だが、上記と794内URLによると、「『型違いのaliasはない』と仮定して最適化」する為であり、 つまり(C)はd名でdoubleに書き(D)はi名でint読み出しだから(C)と(D)は関係ない、 よって(C)はデッドコードでいきなり(D)の読み出ししてよし、ということらしい。 ただこれだとやはり上記(A)(B)は動く。(A)も(B)もfの読み書きであり、aliasして無いからだ。 この規定は「型違いの『aliasは』ないものとみなす」であり、aliasしてなければ関係ない。 今のところ見る限り、他の例も必ずalias(別名でアクセス)している。 なお正しくはunionを使え、ということらしい。>>763 まあ確かにunionはこれ用ではあるが、単発ならCキャストする奴が多いとは思う。 そもそもunionは撲滅対象だと思っていたのだが、これは意外だ。 (或いは仕様上 char*, unsigned char* については許可《どう見ても妥協だが》しているので、void*ではなくchar*にすればいい)
822 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 13:06:08.29 ID:SsMAbqSz0.net] 仕様書は以下でいいか?読み慣れてないからだいぶ推測が入るが、 www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf 俺の結論は以下かな。 ・gccのは -fstrict-aliasing で、あくまで alias についてだが、仕様書内は alias なんて関係ない。 ・fstrict-aliasing 出来る理由が3.10.10によるのなら、reinterpret_castの存在価値はなく、仕様書内に矛盾がある。 ・おそらく reinterpret_cast 撲滅で union に書き換えろ、という方向か? aliasってのは多分折衷案で、union 以外は全部アウトにしたいっぽい。 詳細は以下。 5.2.10 Reinterpret castでは特に妙なところはなし、型キャストは為される。 aliasについては3.10.10だが、reinterpret_castしてれば the dynamic type 扱いでアクセスに問題なし、と見る。 3.10.10.の注 54) The intent of this list is to
823 名前: specify those circumstances in which an object may or may not be aliased. なんだから、やはりこれは alias されているかどうか?であって、アクセスできるかどうかではない。 ただしここを根拠に undefined behavior だから最適化してよし、としてるのはかなり強引で、 (というかここでalias云々がかなり唐突で、そもそもaliasの話をここではしていない) (D)がreinterpret_cast扱いだというのなら仕様内に矛盾があることになる。 そしてこの解釈(=reinterpret_castされたものは the dynamic type ではなく undefied behaviorだからどうなってもよし)が通るのなら、 reinterpret_castの存在価値がなくなってしまうし、 aliasとかせこいことを言わず、reinterpret_cast相当のところは全部undefined扱いで削除していいことになる。 というか、多分コンパイラ側はこの主張で、これに対してユーザ側が反対し、 結果、 alias とかいう折衷案でごまかしているように読める。(既に書いたがaliasが唐突過ぎ) 確かに正しくはunionを使うべきであり、この流れだと将来的には reinterpret_cast は廃止で union しろってことになるのか? しかし逆に言えば、C++89以来これで大して変わらないのなら、早々急に変わることもないか。 [] [ここ壊れてます]
824 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:06:40.01 ID:PnhOPMpK0.net] >>787 ポインタの引数が1つしかないのに__restrictつける意味ないからでしょ
825 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:19:11.46 ID:p3uF8GIb0.net] コンパイラがうまくType-Based Alias Analysis出来るケースをいくら列挙したところで Type-Based Alias Analysisできないケースが簡単に生じることは否定できない事実じゃんヤバイじゃん? unionの使用が解決策というのも語弊があって、unionのメンバのアドレスを取ってから関数foo()に渡す手順だと foo()のコンパイル時には渡ってきた2つのポインタが、型が違うけど(ループ変数などの条件次第で)同じ領域を指す(ことがある) かどうか(ループを実際に実行してみねば)判断つかないじゃん?→コンパイラは怖くてループをmemcpy()やmemset()に置き換えられない つまりunionこそ別の翻訳単位に属する関数に下手な渡り方をするとaliasingのすくつと化す気配が微レ存 元を断つにはやっぱID:xhmNfS4m0やGCC様がおっしゃるように、 そもそも型の混同要因(つまりポインタのキャスト)を絶つか、最適化が効いてほしい関数でプログラマが明示的に__restrictするしか、 ※ 個人の感想です
826 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:25:36.63 ID:67VHGIrY0.net] >>808 > ただこれだとやはり上記(A)(B)は動く。(A)も(B)もfの読み書きであり、aliasして無いからだ。 どうも "alias" の有無を名前に基づいて考えてるみたいだけど、 C++ (ほか多くのプログラミング言語)の文脈ではソースコード中で使われる実際の名前は関係ないんだよ。 "*(long long*)&f = i;" は "auto p = (long long*)&f; *p = i;" と等価であり、 これらのうち名前をつけた後者だけがエイリアスの問題があるということはなく、 どちらも f が表すオブジェクトに対してエイリアスがある状態と言う。 (最適化器の気持ちになって考えればわかりやすいんじゃないかと思うんだけど・・・。) 3.10.10 の注が "alias" に言及しているのも、このルールが "aliasing rule" と 呼ばれるのもそういうこと。 > なお正しくはunionを使え、ということらしい。>>763 > まあ確かにunionはこれ用ではあるが、単発ならCキャストする奴が多いとは思う。 union で最後に書いたメンバと別のメンバを読み出すのも C++ では未定義動作だよ。 gcc は( -fstrict-aliasing の説明にもあるとおり)特別ルールを設けてある程度の保証を与えている状態。 https://gcc.gnu.org/bugs/#casting_and_optimization > To fix the code above, you can use a union instead of a cast (note that this is a GCC extension which might not work with other compilers):
827 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:26:49.64 ID:67VHGIrY0.net] >>809 > ・fstrict-aliasing 出来る理由が3.10.10によるのなら、reinterpret_castの存在価値はなく、仕様書内に矛盾がある。 元の型に戻せば元通り使えることが保証されているので、変更できない既存ライブラリの型に情報を無理やりねじ込んだりするのには使える。 3.10 の例外により unsigned char* などによるオブジェクト表現への直接アクセスにも使える。 > aliasについては3.10.10だが、reinterpret_castしてれば the dynamic type 扱いでアクセスに問題なし、と見る。 まだオブジェクトの型 (dynamic type) と式の型との区別がついてないようだねぇ。
828 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:38:42.54 ID:p3uF8GIb0.net] >>810 memset()にわたるbufが__restrictでないポインタでないということは、関数の中で memset(p, 0, 1000); ... memset(p, 0, 1000); と2回呼んだとき、pが非__restrictだったりグローバル変数だったりするとバカ正直に2回memset()されてしまう… また、memset()は該当しないが 一般論としてポインタの引数が1つしかなくとも大域変数経由で(一見別のエリアを指すように見える)ポインタを受け取るケースがあるので 1引数関数でも__restrictが要るケースがあるんじゃわ;
829 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:43:08.58 ID:SsMAbqSz0.net] >>811 808のコードで言うとね、 union a_union { int i; double d; }; int f() { double d = 3.0; // (C) return ((union a_union *) &d)->i; // (D) } がアウトで、 int f(a_union* u) { u->d = 3.0; // (E) return u->i; // (F) } にしろってことだよ多分。これは>>812 内URL内容とも一致する。 >>812 と、ここまではいいとして、これもGCC拡張であり、 > union で最後に書いたメンバと別のメンバを読み出すのも C++ では未定義動作だよ。 これはマジなの?C++のunionのところを読めばいいのか? > 最適化器の気持ちになって考えればわかりやすいんじゃないかと思うんだけど・・・ これの可能性も考えたんだが、これまで全ての例で必ず別名をつけられてる。 LLVMはあまり知らないが、LLVMにおいてはレジスタへの再代入は禁止のはずだから、 同じレジスタがずっと使われてて最適化器からも「同じだ」と見える可能性もあるよ。
830 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:46:54.14 ID:p3uF8GIb0.net] ごめ>>814 の前半は思い過ごしかorz 別にmemset()側に__restrictは要りませんな…
831 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:52:43.00 ID:SsMAbqSz0.net] >>813 3.10.10.4 a type that is the signed or unsigned type corresponding to the dynamic type of the object, って言ってんだから基礎型も the dynamic type に含まれてると思うぞ。 > 変更できない既存ライブラリの型に情報を無理やりねじ込んだりするのには使える。 使えない。 reinterpret_castの結果がlvalueとして正当ではない、だからundefinedで何やってもおk、 というのが最適化していい根拠なんだろ。だったらreinterpret_castしたその値を使う時点で駄目だろ。 lvalueとして正当に使えると言うのなら、undefinedじゃないんだから最適化で削除しては駄目だ。 ただまあ、ここら辺を俺と君でやりあっても意味が無い。 おそらく20年前にガチで同じことが彼らによって既に為されているはず。 俺がコンパイラを作るわけでも無し、俺は現状確認だけでいいよ。
832 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 14:57:33.47 ID:PnhOPMpK0.net] >>814 >>816 >一般論としてポインタの引数が1つしかなくとも大域変数経由で あ、そういうことか・・・ まぁmemset使ってそういう症状出るとしたら、呼び出し側のpでつければいいよね 自分は__restrictそんなに使い倒してないけど、C++の標準に入らないのかな
833 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:03:35.17 ID:xhmNfS4m0.net] >>817 これだけ言われてまだ dynamic type が何なのか読んでないとしか思えない発言が来るか。 https://timsong-cpp.github.io/cppwp/n4659/intro.defs#defns.dynamic.type > reinterpret_castの結果がlvalueとして正当ではない、だからundefinedで何やってもおk、 > というのが最適化していい根拠なんだろ。だったらreinterpret_castしたその値を使う時点で駄目だろ。 ポインタの reinterpret_cast で型違いの結果を得ることは未定義動作にならないし、 それに * を適用して lvalue
834 名前:を得ることも未定義動作にはならない。 得られた lvalue を通したアクセスが aliasing rule に基づいて未定義動作となる可能性がある。 [] [ここ壊れてます]
835 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:04:02.65 ID:p3uF8GIb0.net] >reinterpret_castの結果がlvalueとして正当ではない えっ合法なんじゃ… int x = 10; char* p = reinterpret_cast<char*>(&x); *p = 2; // *pがlvalueであるところの式 x = (int)*p; // 元の型へのキャストバック printf("x=%d\n", x); // 2 多分最適化されると printf("x=%d\n", 2); になる
836 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:19:05.40 ID:SsMAbqSz0.net] >>812 > union で最後に書いたメンバと別のメンバを読み出すのも C++ では未定義動作だよ。 一応unionのところ(9.5)読んだ。これは書いてなかった。 ただしGCCが「独自拡張だ」って言ってんだからどこかにはあるのだとは思うが。 章番号分かればよろしく。まさか、書いて無いから未定義って奴か? なお9.5.5ではanonymous union ってのが定義されてて、どうもこれでやれってことっぽい。 例は以下。 void f() { union { int a; const char* p; }; a = 1; p = "Jennifer"; }
837 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:22:01.05 ID:p3uF8GIb0.net] dynamic_typeはdynamic_cast<>とかtypeidの実装がvtableを悪用した黒魔術なので使わなーい それはそうとして、Type-Based Alias Analysisの障害となるaliasingだけことさら問題視するLLVMの人らのスタンスはフェアではないキモス 同じ型でもaliasingは起こそうと思えばいくらでも起こせるし、コンパイラはプログラマーが意図的にaliasingさせるケースが有り得るのではと 猜疑心にとらわれて十分な最適化ができないのは同じ やっぱC++は関数型プログラミング言語にシフトすべき頃合い
838 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:27:33.98 ID:SsMAbqSz0.net] >>819 3.10.10には the dynamic type と cv-qualified version of the dynamic type しかないのだが、 では double や long long は何型なのだ? > 得られた lvalue を通したアクセスが aliasing rule に基づいて未定義動作となる可能性がある。 ではその aliasing rule を読もう。何章だ? なんとなく aliasing rule はコンパイラ側の仕様で、C++の仕様では無いと思うのだが。
839 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:35:56.40 ID:xhmNfS4m0.net] >>823 なんでせっかくリンク貼られた定義を無視するの?(・・・英語まともに読めないならそう言ってね。) dynamic type は式を評価した結果の属性であって型の分類ではない。 aliasing rule は basic.lval にあるルール "If a program attempts to access ... the behavior is undefined" を指す。 https://timsong-cpp.github.io/cppwp/n4659/basic.lval#8
840 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:36:33.89 ID:BMNBgd4s0.net] 規格キチガイとの会話は不毛 ツルッツルピカピカ
841 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:39:23.48 ID:SsMAbqSz0.net] >>822 違うぞ。 794内リンク読む限り、確かにこの最適化はフェアだし、使われていい。 というか、それ以前はポインタが一つでもあったら全く最適化が出来なくなっており、 確かにそれは問題視されてた。 だから標準化委員会がそっちを選んだ、というのは分かる話だ。 違う型でエイリアスすることはほぼないし。 問題は意図的にやりたいことが偶にあって、そのときにどう回避するかだよ。 763がこれに該当する。
842 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:51:01.10 ID:xhmNfS4m0.net] >>826 現行の規格で保証される範囲でまともな方法を見出そうとしてるなら、苦労に見合う実りは得られないからやめとけと言っておく。 標準化委員会のおおかたもそんな認識だから bit_cast なんていう提案が好意的に進められている。 www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0476r1.html
843 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 15:53:50.85 ID:SsMAbqSz0.net] >>824 では最初から分かるようにそう言え。 こちらは仕様書を読むのが仕事ではないので、そもそも用語も知らない。見て分からなければそれまでの話だ。 つか、lvalue, rvalue もひどいが、 xvalue とかもでてきて、いよいよC++はどうしようもなくなりつつあるなと実感したよ。 Linusが嫌うわけだよこれは。 ただまあこれは本題でもない。 aliasing rule の確認の方が重要だ。 してそのリンク先、3.10.10と同じだ。 > 得られた lvalue を通したアクセスが aliasing rule に基づいて未定義動作となる可能性がある。(>>819 ) これはどこからそう取れるんだ? reinterpret_castをした結果が正当なlvalueなら、それをデリファレンスした結果も正当なlvalueだろ。 この章にはどこにも”aliasしてる場合”なんて記述はない。 だらからここを根拠にするのがそもそもおかしいんだよ。 君が期待することがここに書いてあるとしたら、例えば以下になるべきなんだよ。 the dynamic type of the object IF THE OBJET IS NOT ALIASED, とかね。でも実際はそうじゃない。
844 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:10:52.86 ID:SsMAbqSz0.net] >>827 つか、完全に暴走してるなこれは。 これならmemcpyと同じだし、 わざわざ別に作らずともmemcpyを正式に認めてCと同じ並びにしたほうがいい。 それ以前に reinterpret_cast が使われている関数内は自動的に -fno-strict-aliasing すればいいだけなんだが。 (関数単位でこの最適化を切る。ほぼ全てこれでいけるはず) ただまあ、これが真面目に議論されているのなら、仕様書の文面や俺の感想はともかく、 君の言う通り、今のC++の仕様では対処する方法がない、ということなのだろうね。
845 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:11:41.87 ID:xhmNfS4m0.net] >>828 "If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined" これが lvalue (それ自体は未定義ではない)を通した「アクセス」を未定義とするルールとして読めないのだとしたら、もうどう説明しても無理だろう。 用語を知らないといいながら共通の定義を求めるのではなく開き直って勝手な解釈に基づく話を進められるようではまともな会話にもならない。 説明は諦める。 規格や先人の解説を読みなおすなりして誤りに気づいてもらえれば幸いだ。 https://www.google.com/search?q=aliasing+rule
846 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:30:16.51 ID:SsMAbqSz0.net] >>830 ちげーよ。 俺は、reinterpret_castの結果が正当なlvalueなら、それはド頭の the dynamic type of the object に該当するから、 *(long long*)&f = i はありだろ、と読んでるんだよ。そこは君も同じだろ。 > ポインタの reinterpret_cast で型違いの結果を得ることは未定義動作にならないし (>>819 ) つまり (long long*)&f で long long* 型になるのはおk ←君の見解ね、俺も同意だが。 > それに * を適用して lvalue を得ることも未定義動作にはならない。 得られた lvalue を通したアクセスが aliasing rule に基づいて未定義動 (>>819 ) つまり、*(long long*)&f もおk ←これも君の見解ね、俺も同意で。 > 得られた lvalue を通したアクセスが aliasing rule に基づいて未定義動作となる可能性がある ここが違う。 3.10.10には alias が云々って何も書いてないだろ。 しかも *(long long*)&f = i; は両方とも long long なんだから、「型違い」のaliasではないんだよ。 だからGCC等の -fstrict-aliasing には該当しない。 というのが文面からとれる意味だ。あくまで「文面」な。 ただまあ、実際にはそうじゃないんだろ。
847 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:33:08.86 ID:SsMAbqSz0.net] ああすまん、ちょっと慌ててて余分なコピペされてるわ。 上記1回目の「得られた lvalue を通したアクセスが…」は余分で。
848 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:34:35.29 ID:xhmNfS4m0.net] >>830 > 俺は、reinterpret_castの結果が正当なlvalueなら、それはド頭の > the dynamic type of the object > に該当するから、 > *(long long*)&f = i > はありだろ、と読んでるんだよ。そこは君も同じだろ。 違うねぇ。 オブジェクトの型 dynamic type は式の型とは違うし、式の型の影響を受けるものじゃないんだよ。 何度も区別しろと言ったつもりだったんだけど。
849 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:35:57.16 ID:xhmNfS4m0.net] ごめん、アンカーミスった。 >833 は >831 宛てね。
850 名前:デフォルトの名無しさん [2017/11/19(日) 16:43:31.03 ID:7jEiMXMd0.net] >>825 確かに自分に中身のないやつほどルールブックを神格化するよな 自分なりにどう思うなんて怖くて言えないから で、そういうお前さんは何か内容のある発言ができるのかね?
851 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 16:46:31.93 ID:Q6cWJ/Rgr.net] > *(long long*)&f で long long* 型になるのはおk んなこたーない doubleオブジェクトの領域にlong longでアクセスすることが未定義動作
852 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 17:22:20.65 ID:XAwzlQ9S0.net] double f = 0; と変数fを構築した時点で、「値0.0のdoubleオブジェクト」が作られてメモリに置かれるんだよ(規格で言うstored valueな) それはスタック回収やdeleteで破壊されるまでずーーっとdoubleのままで、変わることはないの 外側でポインタや参照をどれだけいじくり回したって決して変わらないの 家の横に「←ここは馬小屋です」って看板を立てたって、その家は家のままだし、勝手に馬を入れて飼うのは未定義動作なんだよ そろそろ理解したらどうなの
853 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 17:56:59.79 ID:BMNBgd4s0.net] >>835 内容ある発言と言われても別にこんなのは規格をひっくり返して議論するようなことでないし たぶん俺なら(little endianだとして) union Double { double v; struct { uint64_t f:52; // fraction uint64_t e:11; // exponent uint64_t s:1; // sign }; }; とかにするかな、それで何の問題も起こらない
854 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:00:09.08 ID:SsMAbqSz0.net] >>837 多分それが違うぞ。それはどこに書いてある? 少なくとも多くのCプログラマはそう思って無い。だから平気でキャストする。 そして830内ULRも読んだが、これも明示的なエイリアスがあるケースだ。 お前らが過度にびびって拡大解釈してるだけだろ。
855 名前:デフォルトの名無しさん [2017/11/19(日) 18:11:47.43 ID:7jEiMXMd0.net] あー、こいつcast-as-lvalueに完全に洗脳されている手合いかw
856 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:14:47.74 ID:xhmNfS4m0.net] >>839 https://timsong-cpp.github.io/cppwp/n4659/intro.object#1 > ... The properties of an object are determined when the object is created. ... An object has a type. ... 今度からは少なくとも自分でどこをどう探したかぐらい示そうな。
857 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:31:26.29 ID:SsMAbqSz0.net] >>841 嘘つけ。キャストした場合についてはどこにも書いてない。 型が普遍なんてのは、君が勝手に思い込んでいるだけだ。 というか、いわゆる「強い型」ってのはそうらしいが、C++はそうじゃないだろ。 ちなみに俺も反論を用意してたところだ。 https://godbolt.org/g/viYhGj 中身は795の場所で、ついでだから f = *(double*)&i; を試した。 予想通りこちらはfmov(movsd)が出た。(最適化は切ってある) つまり、俺が768で言ったように、 *(long long*)&f = i; // mov命令でコピー または f = *(double*)&i; // fmov命令でコピー になるんだよ。少なくともgccはキャストされればその型だと認識している。 君はこれを矛盾無く説明出来ないだろ。
858 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:51:00.89 ID:Q6cWJ/Rgr.net] >キャストした場合についてはどこにも書いてない はて、N4700の6.10/p8ほぼそのままの文面が少し上に貼り付けてあったような… >>821 N4700 3.9, 4.5/p1, 6.8全般, 6.10/p8, 12.3/p1, 12.3/p(5.3), その他「launder」が登場する記述全般
859 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:52:07.63 ID:p3uF8GIb0.net] 正しいそうなコードが吐かれたことは未定義動作でないという証拠には全くならない なぜなら未定義動作というのは コンパイル時のエラー、実行時のエラー(または例外)、一見正常っぽく気体通り動く、その他、 というあらゆる事象を包含し得るので、、、 もちろんコンパイラの変更で(ことによったらコンパイル条件の変更だけでも) ある日突然狂ったコードが吐かれる危険性があるが そうなっても未定義動作をプログラムした人の責任 よって現時点で正しいげなコードが吐かれることをいかに力説しても無駄で、 規格の矛盾の指摘にはつながらない
860 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 18:53:33.74 ID:xhmNfS4m0.net] >>842 オブジェクトの型に関与しない操作についていちいち記述があるわけないだろ。 まさか「〜によりオブジェクトの方は変わらない」とかの記述が全演算子&標準関数その他諸々について必要だ なんて言うわけじゃないよね? 未定義動作の結果はなんでもアリだと言っただろう。 その結果(想定の命令コードが生成されたこと)が未定義動作の結果のひとつだとして、何の矛盾も無い。
861 名前:片山博文MZ mailto:sage [2017/11/19(日) 19:03:59.08 ID:R56+Z6E80.net] inline const self_type *const_this() { return this; } template <typename T_TYPE> inline T_TYPE *drop_const(const T_TYPE *obj) { return const_cast<T_TYPE *>(obj); }
862 名前:デフォルトの名無しさん [2017/11/19(日) 19:04:38.54 ID:RgqRbH7C0.net] ソースが仕様、ソース読めってやつか。
863 名前:デフォルトの名無しさん [2017/11/19(日) 19:25:00.73 ID:7jEiMXMd0.net] そう言って居直るやつは問題だが ソースを読まない言い訳にするやつもダメ 腐敗は両岸から起きうることだ
864 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 19:53:33.03 ID:SsMAbqSz0.net] >>844-845 うむ。それは一理ある。 >>845 では逆から行こう。reiniterpret_castのど頭、 > 5.2.10 Reinterpret cast > 1. The result of the expression reinterpret_cast<T>(v) is the result of converting the expression v to type T. vをTに型変換したのが結果だとそのまま書いてある。 これはどう解釈すれば、「型はどうやっても変更できない」と取れるのだ? さすがに無理だろ。 > 7. An object pointer can be explicitly converted to an object pointer of a different type. これも型を変更できると読めるが。そして再び1に戻ると、 > 1. ---- If T is an lvalue reference type or an rvalue reference to function type, the result is an lvalue; つまり当然有効なlvalueであり、デリファレンスも可能だ。 だからキャストを反映してmovなりfmovが出るのだ。 違うか? 君が言うようにメモリ上の型が普遍なら、どうやっても i には fmov が出ては駄目だろ。 (と思ったが、君は837ではないのか、、、)
865 名前:デフォルトの名無しさん [2017/11/19(日) 20:02:38.24 ID:7jEiMXMd0.net] >>849 If T is an lvalue reference typeという但し書きがついているよな (double&)ならlvalueだが(double)は違う
866 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 20:09:33.36 ID:xhmNfS4m0.net] >>849 > これはどう解釈すれば、「型はどうやっても変更できない」と取れるのだ? 式の型 (static type) は変わるが、オブジェクトの型 (dynamic type) は変わらない。 > 君が言うようにメモリ上の型が普遍なら、どうやっても i には fmov が出ては駄目だろ。 未定義動作ならなんでもアリだと言った。
867 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 20:15:36.23 ID:SsMAbqSz0.net] >>851 それで突っぱねるのなら平行線だね。 俺は仕様書に詳しいわけでは無いから動作から説明するしかない。 君は仕様書には詳しいようだが、キャストした場合にも型が変更されないという記述を出して来れない。 ま、デッドロックだ。 とはいえ状況は色々分かったよ。ありがとう。
868 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 20:42:27.06 ID:Q6cWJ/Rgr.net] >つまり当然有効なlvalueであり、デリファレンスも可能だ。 仕様を引用して説明されてもこのとんちんかんな発言を繰り返すあたり、 知らないから間違えているのではなくオツムが悪いので必然的に無知になったと言うことに>>851 は気付くべき
869 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 20:47:51.98 ID:xhmNfS4m0.net] >>852 > 俺は仕様書に詳しいわけでは無いから動作から説明するしかない。 なら↓お前の理解に基づいてこの動作を説明できるか試してみるといいかもしれない。 https://wandbox.org/permlink/2aKzO4VN3KRDB6Gu > 君は仕様書には詳しいようだが、キャストした場合にも型が変更されないという記述を出して来れない。 式の型 (static type) とオブジェクトの型 (dynamic type) は別物だという客観的な 前提 [intro.defs] を素直に読みさえすれば何度も見えてるはずなんだけどな。
870 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 20:54:00.37 ID:XAwzlQ9S0.net] こいつわかってて引っ掻き回してるだけのような気がするわ そうじゃなかったら馬鹿すぎる
871 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 21:10:07.51 ID:JvH46D6m0.net] ある型の変数を入力として、別の型にキャストされた値を返すのはそりゃできるだろう 元の変数の型を変えることはそりゃ無理だろう
872 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 21:20:19.91 ID:SsMAbqSz0.net] >>854 それは何も不思議じゃ無いと思うが。 例の最適化もされてるし。 どこが俺の理解と矛盾してるつもりなんだ?
873 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 21:40:24.30 ID:xhmNfS4m0.net] >>857 お前の中でどういう理解になっているかは把握できていない。 その答えからすると、 "*(long long*)&f = i;" なら未定義動作にならないけど "auto p = (long long*)&f; *p = i;" なら未定義動作になる、 という理解なのかな。まぁそんなことは無いんだけどさ。
874 名前:デフォルトの名無しさん [2017/11/19(日) 22:14:48.53 ID:RgqRbH7C0.net] いやまあ無いんだけどな。 いつまで言い張る気なんだろうか。
875 名前:デフォルトの名無しさん [2017/11/19(日) 22:16:28.57 ID:RgqRbH7C0.net] あると言えばあるんだけどな。 そろそろごめんなさいしてはどうか。
876 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 22:24:05.56 ID:kv2+5Ve80.net] 本の虫での解説記事が待たれる
877 名前:デフォルトの名無しさん [2017/11/19(日) 23:33:53.04 ID:qbUCqX2r0.net] strict aliasing ruleについてはここで解りやすく解説されてる。自分で怪しいと思う奴は読め。 d.hatena.ne.jp/yohhoy/touch/20120220/p1
878 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 23:37:47.80 ID:SsMAbqSz0.net] >>858 ああそうだぞ。それは>>815 で既に言ったし、実際に発現事例は今のところ全てaliasされてる。 顕在化させるには、「別型」で「alias」しないといけないんだよ。 オプションの名前も全くそうだろ。 多分君は理屈が分かってないんだ。 あれはtypeグループごとにメモリフェンスしていて、 別typeグループに入っていると結果的にout-of-orderになるだけなんだよ。 それは常時動いている。 ただし different type で alias して無いと顕現しない(ユーザ側には見えない)というだけ。 だからその可能性がある部分にwarningが出る。 しかしwarningというのは「普通やらないけど大丈夫か?」であって「絶対駄目」ではない。 結局君は different type alias について正確に理解出来てないんだよ。 上記を覆したければ、alias無しで different type alias の最適化がかかっている例を持って来い。 君の言う、 > まぁそんなことは無いんだけどさ。 の例だね。多分無いから。 既に言ったがLLVMだからインデックスレジスタは完全に残るんだよ。(多分) キャストを知らないのだから理解出来ないようだが、(long long*) 部分は命令にならない。 (これはC++仕様書にも明記してあるが、C界では常識) だから *&f だけが残り、結果、 *(long long*)&f と *&f (=f) は同じLLVM命令になる。(はず) だからそこは問題視されてないんだよ。最適化器からも同じに見えるから。 逆に考えてみろ。同じtypeグループ内、例えば int と int が out-of-order になったら話にならんだろ。 だから同typeグループ内は alias があっても in-orderになってる。 そして別グループ double と int は常にout-of-orderになってるが、当然、関数でつながれているときにはフェンスされる。 例えば int a = max_idx(double*) みたいな感じで、doubleの配列から最大値の添字を取るときとかね。 だから different type で alias して無いとそれが見えないようになってるんだよ。 というのが俺の理解だ。覆す例があればよろしく。
879 名前:デフォルトの名無しさん mailto:sage [2017/11/19(日) 23:50:16.66 ID:XAwzlQ9S0.net] ダメだこりゃ
880 名前:デフォルトの名無しさん mailto:sage釣 [2017/11/20(月) 00:03:11.09 ID:y/6cZRj30.net] そろそろ専用スレを建てて欲しいな
881 名前:デフォルトの名無しさん [2017/11/20(月) 00:06:21.48 ID:Veq8ZMOx0.net] 最初に質問した奴が謝罪すれば治まるのでは。
882 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 00:12:55.32 ID:gqHMI2DN0.net] 最適化は人類には早すぎた 早すぎたテクノロジー
883 名前: mailto:sage [2017/11/20(月) 00:14:41.52 ID:Y8ntE/6M0.net] いきなりレベルの低い話で割り込んで恐縮です。 よろしくお願いいたします。 久々にJava から C++ に移行して、簡単なイテレータパターンを実装しました。 Java で書いた https://ideone.com/DJ9pI5 を元に C++ で書いてみたのがこれです。 https://ideone.com/FwNlc4 ここで、コンテナにあたる Aggregateクラス(具象クラスは BookShelf) の中に イテレータ(Iterator:具象クラスは BookShelfIterator) を作成して返すメンバ関数 iterator() を定義していますが、 C++ だからデストラクタも定義しないとね、と考えて 当初、Aggregate クラスに仮想メンバ関数 delete_iterator() を書いて Aggregate::iterator() と Aggregate::delete_iterator() を対にするように作っておりました。 しかし教科書をみると Aggregate::delete_iterator() みたいなデストラクタはそもそも定義しないようで、 普通に Iterator *it = BookShelf(具象クラス)->iterator(); delete it; でなんの問題もないようです。 なぜ、これで問題がないのかトンと見当がつきません。 イテレータを作った具象クラスの中でデストラクタを定義する、というのならば分かりやすいのですが、 抽象クラスのポインタをキャストもせずに直接 delete できるのは、どういうからくりになっているのでしょうか? よろしくお願いいたします。
884 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 00:34:03.39 ID:uuALJ8Da0.net] >>863 > 上記を覆したければ、alias無しで different type alias の最適化がかかっている例を持って来い。 これでいいかな。 https://wandbox.org/permlink/RNDO0CIl9UpsaRwQ
885 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 00:41:55.57 ID:uuALJ8Da0.net] >>863 ごめんまちがえた。 >869 じゃわかんないね。 https://wandbox.org/permlink/vuQgmlWOUcxhu5jW
886 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 00:53:02.54 ID:H8zFncfx0.net] >>869 せこいわw gcc7.2.0(そこの最新版)で%eにしたら見えるがな。 まあ努力はご苦労様。 とはいえ、gcc4.4.7ならこのコードでも顕在化するし、「aliasが要る」という要件が怪しいのは認める。 この最適化はまだ発展途上のようだね。
887 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 01:07:57.23 ID:H8zFncfx0.net] >>870 おっとすまん、輻輳してしまったが、869で問題なく分かったぞ。 そして両方とも、gcc7.2.0にするか、globalにすると直る。 したがって、 different type alias で問題が発生するのには 「aliasが要る」という俺の見解は間違いだ。 ただ、過度の最適化による不具合を防ぐ努力は行われており、 gcc4..4.7→gcc7.2.0でこのコードに関しては修正されてる。 とはいえgcc7.2.0でもどこまで動くか分かった物ではないね。
888 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 01:11:14.23 ID:uuALJ8Da0.net] >>872 さぁ、お前の罪を数えろ。
889 名前:デフォルトの名無しさん [2017/11/20(月) 01:32:56.30 ID:Veq8ZMOx0.net] 何で素直に謝罪できないんだろうね。
890 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 01:42:11.88 ID:mEO8F9pQ0.net] >>868 それが virtual の効果だとしか。 基底で virtual 宣言したメンバ関数群はそのポインタをまとめたテーブルが作られ、オブジェクトはそのテーブルを指すポインタを持つ。 派生のオブジェクトは派生側の関数群を指すポインタテーブルへのポインタを持つ。 だから virtual を使うと「変数の型ではなくオブジェクトが呼出すべきメンバ関数を知っている」という状況を作れるんだよ。 ただ、基底のデストラクタを virtual に指定しないときでも見かけ上は型システムをパスしてしまいコンパイルエラーにならない場合がある。 これは未定義だからやっちゃダメだよ。
891 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 01:59:59.63 ID:mEO8F9pQ0.net] >>868 ,875 Wikipedia にも解説があるやないけ https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
892 名前: mailto:sage [2017/11/20(月) 02:35:52.58 ID:Y8ntE/6M0.net] >>875-876 うーん、普通のポリモフィズムの話が同様に適用できるんですね… Base<-Derived1 Base<-Derived2 の基底・派生関係のとき Base *p = new Derived1() ならば、delete p; は delete (Derived1 *)p; Base *p = new Derived2() ならば、delete p; は delete (Derived2 *)p; となる、と考えていいでしょうか。 Base *p = new Derived1() ならば、p->method(); は p->method_Dirived1(); Base *p = new Derived2() ならば、p->method(); は p->method_Dirived2(); という話と同じなんですね。 んーなせ Aggregate::delete_iterator() を作らなくちゃ、と考えたのか逆にわからなくなってしまいました… ありがとうございました。
893 名前: mailto:sage [2017/11/20(月) 02:59:04.07 ID:Y8ntE/6M0.net] 次に >>868 のテンプレート版を書いてみました。 https://ideone.com/LO68r5 void * (Java の Object)をキャストするのを嫌ったという理由になります。 >>868 >class Iterator >virtual void *next() = 0; >class BookShelfIterator : public Iterator { }; >void *BookShelfIterator::next() >Book *book = (Book *)it->next(); https://ideone.com/LO68r5 そこで不思議に思ったことなんですが、 コンストラクタは template <typename T> class Derived : Base { public: Derived(){}; }; とテンプレート引数 T をコンストラクタ名をつけなくていい(public: Derived<T>(){}; としない)のに、 デストラクタは template <typename T> class Derived : Base { public: ~Derived<T>(){}; }; (クラスのメンバ関数宣言) template <typename T> Derived<T>::~Derived<T>() { } (クラスのメンバ関数定義) とテンプレート引数 T をデストラクタ名につけないといけないのでしょうか?何か分かりやすい理由はありますでしょうか?
894 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:03:42.40 ID:mEO8F9pQ0.net] >>877 キャストとは意味が違うんだよ。 上でさんざん議論してる static type と dynamic type の話とも関係あるのかなぁ? 入り組んでてよくわからん。 型はあくまでも Base* で、仮想関数テーブルを辿って必要な関数を呼び出すってだけだ。 繰返すけど、 Base のデストラクタに virtual がついてないときに Base のポインタに対して delete すると Base のデストラクタが呼び出されるだけになってまうので気をつけてな。 派生クラスのデストラクタが空っぽのときでもデストラクタが呼び出される必要はあるらしいぞ。
895 名前: mailto:sage [2017/11/20(月) 03:12:59.68 ID:Y8ntE/6M0.net] >>878 の続きです。 同じく、テンプレート版 https://ideone.com/LO68r5 にて一点不満におもったことがあります。 >>878 では基底クラスの記述について、 template <typename T> class Iterator { public: virtual T *next() = 0; }; 派生クラスは template <typename T> class XXXIterator : Iterato<T> { public: T *next(); }; template <typename T> T *XXXIterator::next() { ... } と書きました。 しかし本当は、基底クラスを純粋に一個にしたいと希望しているのです。 つまり基底クラスにテンプレート引数Tを書きたくない。 class Iterator { public: virtual ○○○ *next() = 0; }; と基底クラスを一つだけにしぼりつつ、 派生クラスにテンプレート引数を使用して記述することは可能でしょうか?○○○に書けるなにかいい記述はないでしょうか? テンプレート引数を使用した具象クラスに対応する、テンプレート引数を使用しない抽象クラスを書くことは可能でしょうか?
896 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:15:21.39 ID:mEO8F9pQ0.net] >>878 付けなくてもいいし、付けても通るってのは私は今初めて知った。
897 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:23:45.23 ID:mEO8F9pQ0.net] >>880 強引なキャストで出来る可能性はあるかもしれないけど、 常識的な方法では出来ないと思う。 ただ、そもそもそういう継承関係を作る必要は無いんじゃないか。
898 名前: mailto:sage [2017/11/20(月) 03:26:59.22 ID:Y8ntE/6M0.net] >>879 ありがとうございます。 meyers の effective C++ 第7章を読み返しています C++ には Java の fainal がないので、うっかり、std::string や std::vector を派生させてしまうところでした、危ないなあ…
899 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 03:30:13.52 ID:iECo0Ul80.net] >>868 混乱するならシンプルに設計したら?例えばこんな感じ?登録して表示するだけなら簡単でしょ? #include <stdio.h> #include <string> #include <vector> class Book{ public: std::string name; Book(std::string _name) :
900 名前: name(_name){} void show(){printf("%s\n",name.c_str());} }; class Books{ public: std::vector<Book *>m_list; Books(){} ~Books(){for (auto p : m_list) if (p) delete p;} void addBook(Book *p){m_list.push_back(p);} }; int main(){ Books books; books.addBook(new Book("aa"));books.addBook(new Book("bb")); books.addBook(new Book("cc"));books.addBook(new Book("dd")); for (auto p : books.m_list) p->show(); // iterator使いたいなら //for (auto it = books.m_list.begin(); it != books.m_list.end; it++) (*it)->show(); return 0; } [] [ここ壊れてます]
901 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:34:54.09 ID:mEO8F9pQ0.net] >>880 Java のことはあまり知らんので元ネタにした Java 版の方をよく見てなったけど、 interface のかわりに抽象クラスを使おうとしてたのか。 似たような機能に見えちゃうかもしれないけど、インターフェイスを強制する方法としては抽象クラスはあまり良くない。 C++ 的にはコンパイル時にディスパッチする多相と実行時の多相があって、 抽象クラスは実行時にディスパッチする仕組みなのでコンパイル時に確定するはずのことを実行時にするのはクソザコという風潮。 だけど「コンセプト」の機能が C++ に導入されるのが延び延びになってていまだ入ってないので、 traits とか SFINAE とかを使ったまわりくどいメタプログラミングで代用してるのが実情なんだ。
902 名前: mailto:sage [2017/11/20(月) 03:45:45.65 ID:Y8ntE/6M0.net] >>881 >付けなくてもいいし うーん、デストラクタの場合はテンプレート引数をつけないとおこられちゃいます… ×https://ideone.com/x5FrwU 69行目 ○https://ideone.com/FUJ3OO 69行目 よくわらからないな…
903 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:53:09.38 ID:mEO8F9pQ0.net] >>886 いや、型名の方には付ける必要あるよ ×: template <typename T> TShelf::~TShelf() { delete [] (this->t_s); } 〇: template <typename T> TShelf<T>::~TShelf() { delete [] (this->t_s); } △: 知らんかった template <typename T> TShelf<T>::~TShelf<T>() { delete [] (this->t_s); }
904 名前: mailto:sage [2017/11/20(月) 03:57:21.44 ID:Y8ntE/6M0.net] >>884 はい、すごくよくわかります!! std::vector とか、std::list とかstd::deque とかは、たぶんいけると思います。 mevius.2ch.net/test/read.cgi/tech/1434079972/14 mevius.2ch.net/test/read.cgi/tech/1434079972/19 なんとなくデザパタ本を読み返していて、車輪の再発明に没頭してしまいましたが、C# のデザパタ本、というのも聞かないし、もうデザパタは古いのかな…
905 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 03:58:54.21 ID:O993TKuI0.net] マジか 役に立つ日が来るかどうかはシランケド
906 名前: mailto:sage [2017/11/20(月) 03:59:06.77 ID:Y8ntE/6M0.net] >>887 ありがとうございます。確認いたしました。
907 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 03:59:26.41 ID:O993TKuI0.net] ↑ >>887
908 名前: mailto:sage [2017/11/20(月) 04:12:32.38 ID:Y8ntE/6M0.net] >>885 夜遅くにコメントいただきありがとうございます。 >C++ 的にはコンパイル時にディスパッチする多相と実行時の多相があって、 理解できます。コンパイル時に確定できるのなら最大限それに努める思想はたとえば constexpr にも現れていると思いました。 >抽象クラスは実行時にディスパッチする仕組みなのでコンパイル時に確定するはずのことを実行時にするのはクソザコという風潮。 うーん、たぶん私が周回遅れなだけだと思いますが、じゃあ、ひところ、あれほどまでにもてはやされたデザインパターンは、どこにいってしまったのでしょう…もう誰もやらないのかな…
909 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 04:13:43.35 ID:mEO8F9pQ0.net] >>887 なんでこうなってるかっていうのは割と感覚的にやっちゃってるからうまいこと説明できひんのやけど。 クラステンプレートの中に関数テンプレートも書けたりするので template<class T> class foo { public: template<class U> void bar(void); }; 実装書くときはどれがどれに掛かってるかわかるようにせんといかん template<class T> template<class U> void foo<T>::bar(void) { } みたいな話なんじゃないかとコンパイラの気持ちになる仁奈ちゃんの気持ちになってた。
910 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 04:30:34.82 ID:mEO8F9pQ0.net] >>892 抽象クラスを使うパターンなんてのがあるわけ? GoF 本とか読んだことないから知らんけど。 それはインターフェイスをまとめた何かを作れって話とかじゃないの? C++ の抽象クラスを使えって話とは違ったりしそうだけど。 デザインパターンはあくまでデザインの話なんだから言語の具体的な機能はその時代に有るものでやるしかないし、 よりよい機能が提供されるようになったら使うだろ、そりゃ。 抽象クラスを使うやり方しかできないなら「デザイン」を学び取れてないってこった。 まあ今は C++ への理解も十分でないからってのもあるだろうけどさ。 ところで QZ って C++ スレの常連みたいに思ってたけど、 その割にアレなのでひょっとして共通トリップだったりするの?
911 名前: mailto:sage [2017/11/20(月) 04:42:32.81 ID:Y8ntE/6M0.net] >>894 >その割にアレなのでひょっとして共通トリップだったりするの? 単に、あれよあれよと、また、次から次へと忘れていくので、ぜんぜん進歩しないだけなのでした。 こんな感じ… https://www.youtube.com/watch?v=Hflpt1-kAl4
912 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 07:05:19.03 ID:8Dez9ldp0.net] 手元に古いGoF日本語訳(1999年初版)があったので覗いてみたら、 Iteratorのサンプル(C++)が>>880 みたいに抽象クラスで実装されていてびっくりした。 抽象クラスを使わなくても、処理の共通化を考えないなら問題ないし、 共通化したい場合でも、そこだけテンプレート化すればよいような気がする。 https://ideone.com/sFzBq4
913 名前:デフォルトの名無しさん [2017/11/20(月) 08:00:57.16 ID:GfOPAtNP0.net] VC++とか今でこそまともだけど昔はテンプレート周りがうんこすぎて風呂釜洗剤教の人のやり方に頼らざるを得なかったらしいね
914 名前:デフォルトの名無しさん [2017/11/20(月) 09:24:05.14 ID:9q5rB25R0.net] そういう「まとも」を求めてVCを選ぶのは情弱のすることだ 意味の違う「まとも」で定評のあるコンパイラであって
915 名前:デフォルトの名無しさん [2017/11/20(月) 09:46:04.69 ID:Veq8ZMOx0.net] Vistaまではgccでコンパイルしてたらしいからな。
916 名前:デフォルトの名無しさん [2017/11/20(月) 10:17:12.94 ID:5dn4op1oM.net] 初心者なんですがusing使い方を教えて下せえ
917 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 10:36:08.17 ID:Fx3rJ6pW0.net] usingは時代によって使える機能が異なる 昔はnamespaceから使える宣言を取り出す役割 最近は=を用いてtypedefの簡略化っぽい書き方が出来る
918 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 10:42:51.51 ID:Fx3rJ6pW0.net] 将来的にはusingがプロパティの役割まで担ってくれると余計な予約後増やさなくて済む希ガス
919 名前:デフォルトの名無しさん mailto:sage釣 [2017/11/20(月) 12:17:25.71 ID:OatlO4rKM.net] >>897 最初なんてタダのマクロだったし、 4.xだってテンプレート使うと名称長さ制限にかかったり STLのBUGは何時までたってもそのままだし
920 名前:デフォルトの名無しさん [2017/11/20(月) 14:57:25.95 ID:ZHV8ZCmh0.net] ratioのバグとかinitializer_listとかね しっかりしているようで時おり大ボケで笑いを取る謎な会社だ
921 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 16:59:42.71 ID:CB3KD7K4p.net] >>883 重箱の隅だけどC++にもfinal導入されたよ、C++11からだっけ stlに付いてるかどうかは覚えてないけどw
922 名前:デフォルトの名無しさん [2017/11/20(月) 17:06:25.94 ID:ZHV8ZCmh0.net] 重箱の隅じゃあんめえ 仮想デストラクタがないことと継承禁止は近いが違う
923 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 17:20:13.60 ID:mEO8F9pQ0.net] std::vector とかを public 継承してもスライシングが起こらないように使う分には全然問題ないわけだしな。 でも人間はアホだからスライシングするし、スライシングしたときにコンパイルエラーにしてくれないから避けようっていう「習慣」なだけで、 言語機能としてはデストラクタが仮想になってないからといって継承が禁止されているってわけではないんだ。 そこらへんは確かに意味づけが違う。
924 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 17:54:47.05 ID:4sV97R+K0.net] デザパタは基本的にGC言語向きだしな C++とは相性が良くない
925 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 19:05:49.28 ID:RcaXyFV8d.net] C++の基本的なコーディングを学ぶのにオススメな書籍あるかな? テクニック集とかもあると読んでみたいと思っている
926 名前:デフォルトの名無しさん [2017/11/20(月) 19:11:23.76 ID:q0WTO8Pn0.net] EffectiveC++シリーズ Exceptional C++ C++ Coding Standards あたりの定番中の定番でいいだろ
927 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 20:12:37.95 ID:rJCmscgl0.net] ここって本職でやってる人らばっかりなんかね 日曜プログラマが気安く書き込んでもいいのだろうか
928 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 20:21:38.03 ID:mEO8F9pQ0.net] >>911 いいよ。 俺も趣味プログラマだけど偉そうに書き込んでるし。
929 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 21:53:59.25 ID:gqHMI2DN0.net] GoF本のうち Stateパターンは抽象クラス必須 Abstractなんちゃら系も抽象クラス必須 な印象
930 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:05:37.00 ID:vFwnmuVP0.net] >>911 プロがここでうんちく垂れてたら引くわな
931 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:07:59.95 ID:H8zFncfx0.net] >>873 最新版で該当ケースを探せず、 わざわざ5年前の版を持ち出してきてまで俺ツエーしたいヘタレを相手にしてしまい、すいませんでしたー gcc4.4.7(2012/3/13)の時点で対応できて無いという情報はものすごく役に立ちますー(棒) つかマジで、賢いつもりなら最新版で該当ケース探してgccに報告しろよ。 問題に遭遇したらとりあえず最新版、というのは基本だ。 ここを問題視する奴がgcc4.4.7なんて今使ってるわけないだろ。お前は馬鹿なのか? お前のその努力は誰の為にも役に立ってないだろ。 これは多分に政治的問題で、コンパイラ屋がごねているだけだ。 既に言ったとおり、 reinterpret_cast相当のことがなされている場合、その関数単位で -fno-strict-aliasing すればいいだけで、 これに関して技術/仕様的問題は何もない。 ただ、「ソースさえ正しければこんな問題は発生しない」とか言って、コンパイラ屋がごねてるんだよ。 だから、力関係が逆転すればいきなり全部直ってもおかしくない。 gcc7.2.0がどっちのアプローチ、 つまり、上記の通りばっさり最適化を切ってしまい、最適化ケースを積み上げる方向にしたのか、 或いは従来どおり、過度の最適化を検出し、最適化を防ぐケースを積み上げることにしたのかは、俺は知らない。 ただ、どちらのケースであっても、最新版で上手く行かないケースがあれば、それはgccにとっては有用な情報なんだよ。 それをわざわざ旧版で、しかも隠してしれっととか、意味無いしせこいわw 最新版で出現しないから焦ったか?小物感ありあり。 > まぁそんなことは無いんだけどさ。 とか言うから、お?釣りか?ならここは全力で釣られてやるさ、該当事例持って来いよ!って流れなのに、 事前に該当事例用意しておかずに釣りとかアホかテメーは。 君が最新版で完全にアウトなケースを用意してれば、ああこれは完全に俺の負けですサーセン、とお後がよろしかったのに、 gcc4.4.7であることにも触れず俺ツエーするとか、小物過ぎて泣ける。 お前もうちょっとスレの流れを考えろよ。
932 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:13:38.04 ID:cvRta7BJM.net] >>908 GoF本はc++とsmalltalkだったろ
933 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:48:11.84 ID:gqHMI2DN0.net] テンキー風のボタンの並びでモードによって意味が変わる(Num Lock ON/OFFのもっと複雑化したようなやつ というユザーインターフェースの実装はStateパターンのどくだんば そこまでレトロなのでなくてもGUIでお絵かきツールを集めたツールボックスなUIとか作ると Abstructなんちゃらパターンのどれかを再発明しているケースが多いと思う
934 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 23:04:17.12 ID:vFwnmuVP0.net] ←なぜか変換できない
935 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 23:35:39.24 ID:mEO8F9pQ0.net] 独擅場 ← どくせんじょう
936 名前:はちみつ餃子 mailto:sage [2017/11/21(火) 00:48:45.97 ID:KkY90WH60.net] >>913 昨日 >>885 でまわりくどいメタプログラミングと言ってたのがそれだ。 State パターンのように特定のメンバ関数を持っていることを強制したいときには それを判定するトレイツを作って対応する。 たとえば >>886 にあるコードを対象に考えて、 「あるクラスがそのクラス自身のポインタを返す next という名前のメンバ関数を持っているか」 を判定するトレイツはこうなる。 template<class T> class has_next { template<class U, class V = T> struct helper : std::false_type {}; template<class U> struct helper<U, typename std::enable_if<std::is_same<decltype(std::declval<U>().next()), U*>::value, T>::type> : std::true_type {}; public: static const bool value = helper<T>::value; }; C++ 標準の type_traits を真似してるので使い方もだいたい同じ。 static_assert(!has_next<TShelfIterator<Book>>::value, "TShelfIterator must has next() method."); みたいに書いておけば TShelfIterator<Book> がメンバ関数 next を持っていることが保証される。 持っていなければコンパイル時にエラーになるから。 ここではひとつのメンバ関数を判定するだけのものを作ったけど、 Boost にはもっと汎用的にいい感じにかけるやつが有った気がする。 知らんけど。
937 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 01:13:43.73 ID:H+r6aFWv0.net] そんなくそレガシーなtraits 久々に見た…
938 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 17:31:41.16 ID:6BA+Ife8d.net] あるファイルに下のような文字が書き込まれていて xxxx=3 これの3を取得する完璧無欠なロジックなにかないかな
939 名前:デフォルトの名無しさん [2017/11/21(火) 17:32:59.03 ID:uRVBPn0b0.net] 完璧無欠とは?
940 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 17:36:16.46 ID:6BA+Ife8d.net] >>923 俺様のアルゴリズムは完璧だぜ!!! ってだけ まあそんなのないんだけど書き込みたかった
941 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 18:10:16.89 ID:B2ib4/wIa.net] 正規表現でよくない?
942 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 19:05:58.85 ID:DIhAB+/L0.net] リバースイテレータをfindしてイコールでセパレート。 って、数行から見つけるのか。 構文解析とかか?
943 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 19:38:49.19 ID:6BA+Ife8d.net] >>926 数行から見つける 設定値の中から見つける 実際は #xxxはdddの設定値 xxx=1 #yyyはcccの設定値 yyy=3 こんなのが繰り返し書かれてる 正規表現確かに良さそう忘れてた
944 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 19:53:50.67 ID:GhiisSyt0.net] (?<=^xxx=)\d+$
945 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 20:30:32.65 ID:0pu32Yjt0.net] float演算がdoubleよりも遅いってアジですか?
946 名前: mailto:sage [2017/11/21(火) 21:02:58.77 ID:xJ15vzkZ0.net] >>929 何が計算するかによる、としか
947 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 21:12:53.35 ID:0pu32Yjt0.net] さいですか
948 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 21:19:38.81 ID:muR8Mwv6r.net] >>922 ほれ https://wandbox.org/permlink/YK6UEOGxMToYE1SK
949 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 21:44:16.41 ID:6BA+Ife8d.net] >>932 すんごく綺麗なコードありがとう 見事に魔改造して糞コードにしてしまう自信がある
950 名前:デフォルトの名無しさん [2017/11/21(火) 21:55:27.92 ID:6jcLJvUW0.net] >>927 そういう設定ファイル的なものを読むならkeyとvalueのペアのリストつまりmapを返す実装を考えた方がいい
951 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:16:59.77 ID:6BA+Ife8d.net] >>934 俺もそうは思ってるのだけどその読み込む処理をどうしたら綺麗にできるかなぁって悩みなんだ マップ作ったあとに検索が綺麗なのかなとは思ってる
952 名前:はちみつ餃子 mailto:sage [2017/11/21(火) 22:33:26.16 ID:KkY90WH60.net] 文法的には LL(1) かな? 素朴なパーサコンビネータでも充分に足りるのでその手のライブラリを導入すると楽にパーサを作れると思う。 それはともかく、「>>922 みたいな」というだけの仕様では ・数値以外が設定値にくることもあるのか? ・要素に改行を含められるのか? ・エスケープも出来るようにするのか? 等々が読み取れないし、多分 >>922 は考えてないんじゃないかなと思う。 オレオレ設定ファイルフォーマットを考えるくらいなら TOML とかいったよくあるフォーマットを採用すれば ライブラリが充実してたりして便利なので考えてみるといいかも。
953 名前:デフォルトの名無しさん [2017/11/21(火) 22:42:43.82 ID:uRVBPn0b0.net] ってかboostのPropertyTreeにiniパーサーがあるからそれ使うといいよ
954 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:42:58.28 ID:6BA+Ife8d.net] >>936 回答すると 数値以外もありうる 改行は値として入れない エスケープってなんだろう? xxxに関しては最大16文字の文字列(大文字小文字計52文字の組み合わせ) たったこれだけでも深いね ソフトウェアって神秘
955 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 23:00:05.88 ID:GhiisSyt0.net] ini-parser
956 名前:てのがなかなか良さそう picojson,rapidxmlなどが好きな人にはいいかも [] [ここ壊れてます]
957 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 02:34:39.84 ID:9vladmL60.net] 構文解析したいならbisonでも使ったらいいんじゃね?
958 名前:デフォルトの名無しさん [2017/11/22(水) 03:34:34.44 ID:ft6g9THr0.net] ム板で公開されたのがあったじゃないか。
959 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 10:29:13.01 ID:wHcXBwMz0.net] >>938 >>922 の完璧無欠なロジックてのは 最初に完璧無欠な入力規則を作ってから議論できるものだろ >数値以外もありうる 数値だけでもいろんな型があるわけだしこの程度じゃ何も語れない xxxx=3のような単純な形式はINIファイルとか>>936 のようなのとか利用するのが便利 最近はXML形式が推奨されてる ただしどれもが完璧無欠とは言えないけど
960 名前:デフォルトの名無しさん [2017/11/22(水) 10:59:36.64 ID:jvBgNmmT0.net] >>942 どこの最近?
961 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 11:55:13.96 ID:/unloUf+0.net] XMLは配列が直接表現できないし手で書くのがクソめんどくさいし見づらい その点JSONの方がずっとマシなんだけど標準JSONだとコメント書けない
962 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 12:48:47.95 ID:PiUoYWXr0.net] 適材適所、の一言で片付く問題 好きな方使え
963 名前:デフォルトの名無しさん [2017/11/22(水) 13:52:54.31 ID:gFgFfMOWM.net] 人が書く設定ファイルならtomlがパースのしやすさと書きやすさでバランスが良いと思う
964 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 16:17:23.80 ID:HDCbnteD0.net] >>946 dein.vimで使われてるの見て知ったけどまったくと言っていいほど広まらないね >>944 ド定番のYAMLでいいじゃん
965 名前:はちみつ餃子 mailto:sage [2017/11/22(水) 20:12:53.57 ID:Rn9KsJdK0.net] Cargo の設定ファイルも TOML やぞ。 モダーンな言語のモダーンなツールは TOML がトレンド。 これ。 YAML みたいにインデントで構造を表現するのってパースめんどくさい。 個人的に YAML は不格好に見えて好きじゃないっていう主観もあるんだけど、 YAML ってそんなに定番ってほど目にしたことが無いな〜と思って考えたら たぶん俺の巣は Scheme スレやからやな。 Lisp 界隈では設定ファイルにはS式を使ってまうもんな。
966 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:00:11.47 ID:h+KIZtFy0.net] luaなんかもよく使われるけど、schemeやluaが設定ファイルとして使われるのは 呼び出し側の言語が同じであるか、他の用途で使うためにすでに組み込んでる場合がほどんどで 設定ファイルだけの為にLL組み込むにはお手軽とは言えないかな TOMLはいいとは思うんだけど 自分が使うなら仕様が固まってからの1.0〜は必須で ↓で300程度は使われてからかな $ apt-file search toml | grep "\.toml$" | wc -l 0 $ apt-file search json | grep "\.json$" | wc -l 3611 $ apt-file search yaml | grep "\.yaml$" | wc -l 1480
967 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:10:35.27 ID:W0SJQGiTM.net] 最近この手の話題に疎いからtomlとか知らんかったのでちょっとググったけどまあ好きなの使えや って感想しかないわ https://gist.github.com/miyakogi/e8631ce5f7c956db2313
968 名前:はちみつ餃子 mailto:sage [2017/11/22(水) 21:16:10.07 ID:Rn9KsJdK0.net] パースの楽さだけで言えば JSON が優勝だけど人が手書きするには色々アレだからな。
969 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:20:22.39 ID:3/I2dLA90.net] 好きなの使えっつっても全部導入して試すの面倒や
970 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:56:28.30 ID:+hB2MqUt0.net] ES5以降ケツコンマOKになったんだからJSONも新規格にすりゃいいのに。
971 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 23:47:16.65 ID:AAzHTorM0.net] >>936 正規表現で済んでいるのになんでスタックが要るんじゃ!!!!!!11!1!!!!
972 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 00:25:32.50 ID:fj1LdTry0.net] >>954 意味がわからないので説明して。
973 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 00:36:02.97 ID:h8NdPAUM0.net] 文脈自由文法は解析にスタック(理論上は無限の段数のやつ)が要るクラスだが 正規言語は有限状態マシンで済む言語のクラス 今話題の設定言語は無限の入れ子は持たなそうなので正規言語で逝ける、
974 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 00:37:37.76 ID:h8NdPAUM0.net] と、 言いたいのでわ…
975 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 01:07:08.12 ID:fj1LdTry0.net] ん〜、そのへんの学問的な分類はよう知らんけど、取りうる状態は有限でもバックトラックは起こるしそのためのスタックは要るんちゃう? 同じ文法の構文解析器を作ればどっちのアプローチでもスタックの消費量はかわらんと思うんだけど。 より制限の強い方で「十分」っつーならそれはわかる。 C++ 標準に入ってる機能で出来りゃ楽だしな。 ただ、正規表現ライブラリだとエラーの検出場所の伝達方法とかで融通が利かなかったりするので、 ユーザーが入力する設定ファイルを解析するパーサを作るとなると作りこみ難いという感触があるかな。
976 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 06:39:00.31 ID:NFzuGiE50.net] 「チョムスキー階層」でググれ
977 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 07:23:17.08 ID:NFzuGiE50.net] >>958 >ん〜、そのへんの学問的な分類はよう知らんけど、取りうる状態は有限でもバックトラックは起こるしそのためのスタックは要るんちゃう? 非決定性有限オートマトンは決定性有限オートマトンに変換できるので、 バックトラックが一切起こらない形に書き換えることは可能。 lexなんかだと、そのような変換を行ったコードを生成していたはず。 ただし、プログラム言語などで一般的に使われる正規表現は、 ここでいう正規言語を拡張したものなので、この限りではない。
978 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 14:40:51.51 ID:QeiOUUJtx.net] C++のプロジェクトに戻りたい。
979 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 18:06:46.17 ID:5yPMgLrz0.net] どうぞどうぞ
980 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 18:56:01.32 ID:h8NdPAUM0.net] もう次スレ要らないのでは
981 名前: mailto:sage [2017/11/23(木) 19:03:52.53 ID:fGVRHt7J0.net] またまた低レベルな質問で恐縮しております。よろしくお願いいたします。 https://ideone.com/MXvhkC ここまで実装できている状態で、演算子 += を定義するには、どのように書けばいいでしょうか? なお実際に作業している対象は自作の多桁長演算ライブラリで、operator+=() を operator=() や operator+() を再利用できればうれしいな、と考えております。 operator+() や operator=() に書いていることを、繰り返して書くのは避けたいと考えているのです。
982 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 19:07:30.71 ID:IGgCkWwq0.net] 普通はoperator+=()を実装してから、それを使ってoperator+を実装する
983 名前: mailto:sage [2017/11/23(木) 19:44:55.34 ID:fGVRHt7J0.net] >>965 なるほど https://ideone.com/t89oo1 しかし、+=, -= ならまだしも、 *=, /=, %= を考えると、なんだか似たようなコードを二箇所に書きそうな雰囲気がします…
984 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 19:54:00.12 ID:IGgCkWwq0.net] だからboostにこんなのがあったりする https://boostjp.github.io/tips/operators.html
985 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 19:56:33.11 ID:5nCr5Wf60.net] CRTP使って自動実装
986 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 20:01:00.33 ID:fj1LdTry0.net] >>964 なんで friend がついてんの?
987 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 20:17:56.76 ID:j5z8beti0.net] >>967 これってなんでprivate継承なのか分からない
988 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 20:23:32.48 ID:fj1LdTry0.net] >>970 スライシングを起こさないようにじゃないの。 デストラクタを virtual にすると要らん仮想関数テーブルが作られちゃうからな。 それでいて定義する関数は friend 関数にしてるから外側からでも見えるんだな。
989 名前: mailto:sage [2017/11/23(木) 20:46:50.20 ID:fGVRHt7J0.net] >>969 こんな小題でもいろいろと試されるんですね… たしかに operator+=() は、意味からいっても friend である必要はまったくないですね。 一方 operator==(), operator+() は式の表現としての対象性を保存したいので、friend をつけたいと考えています。 operator<<() に対しては friend を必ずつけないといけないようですが、その理由はよくわかっていません。 https://ideone.com/pR0EP1
990 名前:デフォルトの名無しさん [2017/11/23(木) 22:59:38.32 ID:vKpvx9Uha.net] IDE使っていて思うのがtemplate関数でデフォルト引数classAを設定すれば、 template<typename T=classA> void Test(T tmp){ tmp.func(1, 2, 3); } 上記のtmp.のところでclassAの関数とかが出て来るようになると嬉しいとか思ったり コンセプトとかで対応できるようになるんでしょうか?
991 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 23:16:02.95 ID:WYrOiD8s0.net] mix-inもまともに知らないやつがなぜ回答してるのか…
992 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 00:17:10.75 ID:mELw8YtS0.net] >>973 言語仕様っていうよりIDEの性能のような。 コンセプトまで構文解析してサジェストするようになれば確かにできるかもしれんけど。
993 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 01:03:21.71 ID:/7rxT1Yr0.net] >>973 技術的には可能だからlibclangでなんとかなるようになるなら誰かやってくれるかもね コード補完にプラグインを使えないIDEなら開発元にリクエストするしかない
994 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 01:39:31.39 ID:Z3szivMI0.net] mix-inで理解が止まっている人がなんか吼えてますな
995 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 08:42:41.97 ID:ZeExn92sr.net] >>973 コンセプトはシンタックスの誤りを判定するのみで型情報を持っていないため その補完は期待できない
996 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 09:00:16.20 ID:nFkUcp0I0.net] >>977 boost operatorsのprivate継承がmix-in以外のなんだと思ってるんだ?
997 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 10:03:13.88 ID:dhAYmdbT0.net] 静的リフレクションが欲しい
998 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 10:21:33.74 ID:Un7I7rhA0.net] 後のプリプロセッサである
999 名前:デフォルトの名無しさん [2017/11/24(金) 12:38:49.19 ID:p8RxfMqqa.net] C++を勉強しようとしてるんだが 基本的にCの書き方が一般なのか C++の書き方が一般なのか教えてもらいたい
1000 名前:デフォルトの名無しさん [2017/11/24(金) 12:51:25.91 ID:l1+FhW7v0.net] コーディングスタイル? そんなの好きにすればいいよ
1001 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 13:21:28.52 ID:w0OmJEj50.net] >>982 Cの書き方とかC++の書き方とか一般的とかない 「一般的」なるものを求めたいならメジャーなIDEのデフォルトのオートフォーマットだろうな
1002 名前: mailto:sage [2017/11/24(金) 13:44:06.80 ID:ZNkp8uW60.net] >>964 結局こうなりました https://ideone.com/SUSTBj
1003 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 14:07:55.96 ID:lG8HVUMw0.net] >>985 operator+= の返却値は参照にしといた方が辻褄が合うので良いよ
1004 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 14:10:30.10 ID:/RqU0h4Pd.net] 関数内で作ったベクターやマップは関数を抜けたらメモリ解放されると考えてよかです?
1005 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 14:13:40.22 ID:lG8HVUMw0.net] >>987 記憶クラスによる。
1006 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 14:25:57.62 ID:/RqU0h4Pd.net] >>988 記憶クラスによるとは スマホで打ってるから書式とかガタガタだけど下みたいなことしてる createmapってのを抜けたときにvectorもmapも解放されると信じている vector XX( *map) { 要素数二個のstring型のvectorデータを作成 return vector<string> ←要素数2 } createmap () { map<string,string> y { vector<string> tmp = XX(&y) y.insert( tmp[1] , tmp[2]) } }
1007 名前:デフォルトの名無しさん [2017/11/24(金) 14:36:50.33 ID:9/UAKu4i0.net] うん、信じていい XXから抜けるときにムーブコンストラクタでtmpへ移動され createmapから抜けるときに解放される このときoperator deleteが呼び出されるが operator deleteがどのようなタイミングで解放しているかには依存すべきでない 我々が関心を持つべきはoperator deleteが呼び出されるタイミングで実装の詳細ではない
1008 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 15:15:03.03 ID:lG8HVUMw0.net] >>989 static 付きで宣言してればプログラムの終わりに解体されるし、 new で作れば delete されたときが解体されるし、 そうでなければスコープの終わりに解体される。 「関数内で作った」というだけでは情報不足。 >>989 のような例であればスコープの終わりで解体されることは保証される。 それと >>990 はムーブコンストラクタの話を出してるけど C++17 以降ではこういう場合は RVO の発動が必須になってなかったっけ?
1009 名前:デフォルトの名無しさん [2017/11/24(金) 15:33:02.71 ID:9/UAKu4i0.net] >>991 990だが、何を言っているのか、悪いがよくわからん XXがcreatemapとは別の翻訳単位から外部結合されている場合でも その何だ、ムーブコンストラクタの回避(?)が必須になったのか?
1010 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 16:06:58.81 ID:lG8HVUMw0.net] >>992 そう。 RVO 必須だからコピーコンストラクタもムーブコンストラクタも無いクラスでも OK っていう新しいルール。 https://wandbox.org/permlink/X6g7JSpkSl82VvtZ
1011 名前:デフォルトの名無しさん [2017/11/24(金) 16:44:55.52 ID:9/UAKu4i0.net] >>993 OK? それは03でも同じことやん
1012 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 16:48:44.24 ID:lG8HVUMw0.net] >>994 いや >>993 みたいなのは C++14 以前では NG になるよ。
1013 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 16:54:03.03 ID:WoNXR2ax0.net] C++相談室 part133 mevius.5ch.net/test/read.cgi/tech/1511509970/
1014 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 16:58:12.64 ID:jkTO/gHT0.net] 乙。
1015 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 17:04:12.57 ID:BCw6/Ft50.net] 彼。
1016 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 17:07:25.34 ID:lG8HVUMw0.net] >>999 なら長門有希は俺の嫁
1017 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 17:07:54.81 ID:lG8HVUMw0.net] >>1000 なら双葉杏も俺の嫁
1018 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 45日 16時間 56分 20秒
1019 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています