19/01/21 08:37:50.82 Kndge7xV.net
大前提が間違ってる
例外なんか最終的にはフレームワークが最上位で纏めてキャッチすりゃいいんだよ
途中でキャッチして処理するのはあくまでベターなオプションであり、それを必須とするような作りにしてはいけない
263:デフォルトの名無しさん
19/01/21 08:55:24.27 NbFzEAOW.net
>>261
> catch忘れたらそのまま上まですっ飛んでいくだけ。
闇雲にキャッチしたいならcatch(...)ってやればいいだけ w
> そこでプログラマが考える「必要なもの」から漏れた例外は上位へ渡されてしまう。
本来キャッチが必要な例外を漏らしているならそれはバグ
それは戻り値スタイルでも同じ話
違うのは例外はキャッチする必要の無い例外についてはそこで考慮する必要はない、自動的に上位に渡されるから上位の然るべき場所で考慮すればいいから
それが>>249の言う
> 例外ならば必要な時に必要なだけ異常系の処理を書けばいいので混乱することはない
ってこと
264:デフォルトの名無しさん
19/01/21 08:56:49.38 vJCo0PxF.net
>>262
半分同意。
結局のところエラーの種類に応じてきっちり対処するなら検査例外的な仕組みが必要になるが
そうでなければエラーの内容など見ずにlet it crash的に対処するしかない。
どっちつかずが一番ダメなやつ。
265:デフォルトの名無しさん
19/01/21 08:58:29.41 Kndge7xV.net
(検査例外とかいうJava自身も認める失敗作は論外として、)例外機構は正しく使えばエラー処理に対する関心の分離に有効なんだよ。
ところがC++では例外を煩わしいノイズと見做す人が多い。これは即ち関心の分離ができてないわけだ。
その一番の原因は、例外型がロクに標準化されてないことだろうね。
最上位での集約処理を実現するには、下位の全てのコードが制御下になければならない。
これは膨大な既存資産と貧弱な標準ライブラリを持つC++においては非現実的な前提である。
266:デフォルトの名無しさん
19/01/21 08:58:39.64 unEY8tjt.net
すべての例外を把握する必要はない
回復可能かつ回復が要件に含まれるなら個別に処理すべき
それ以外はアスペクトで処理すればいい
267:デフォルトの名無しさん
19/01/21 09:04:47.90 nVlZ7k5e.net
>>247
だからさ、比較できるように例外スタイルで一度きちっと異常系対応して
かつスーパーエレガントなのを書いてくれよって言ってんの
お前のは体よく異常系の処理全無視してるだけじゃん
catchしたい人が必要なところでcatchすればとか言うんだろうけど
例外発生場所から遠くなればなるだけ何が原因で例外が発生して、
その回避はどうすればいいかが不明瞭になっていくってのは
散々語られてる例外の欠点
リターンコードは泥臭いが下層からくるエラーをどう処理してるかはコード見れば一目瞭然
エラーを上位に伝搬させるか、リカバリーするか、その場でクラッシュさせるか
ローカルに記述が完結できてる
APIとして外部に公開するときもインタフェースの仕様にきっちり責任持たせることができる
ちなみにプルリクでレビューする文化があればエラー無視してるような雑はコードは突き返されるだろう
見ればすぐわかるんだから
大規模な開発を経験したことない人はこういう観点でソフトウェア開発を
考えられないんだよ
最後にもう一度言っておくけどおれは例外を完全否定してるわけじゃねーから
使える場所は限られるって意見ね
268:デフォルトの名無しさん
19/01/21 09:07:50.76 nVlZ7k5e.net
>>262
> 大前提が間違ってる
> 例外なんか最終的にはフレームワークが最上位で纏めてキャッチすりゃいいんだよ
これがど素人の意見
ソフトウェアの品質について考えたことがない
269:デフォルトの名無しさん
19/01/21 09:11:48.87 nVlZ7k5e.net
「不正な入力です」
「ネットワークでエラーが発生しました」
「書き込みに失敗しました」
こういう情けないダイアログが表示させて終わりのアプリを作るやつね
270:デフォルトの名無しさん
19/01/21 09:19:18.64 9okmCQOj.net
>>269
それでも正常に回復できてるならそれでいいケースは多い
例外の最大の利点は例外安全さえ死守できていればアドホックな例外処理が必須でなくなることで、
より丁寧な処理が必要になれば後から追加すればよい
まあ組み込みとかやってる人には馴染まない考え方だろうね
271:デフォルトの名無しさん
19/01/21 09:35:09.59 9okmCQOj.net
まあC++開発者が未処理例外=クラッシュと短絡的に考えてしまう気持ちはよく分かるよ
呼び出し階層の途中に一つでも if (hoge() != SUCCESS) errorhandle(); があれば例外安全は破綻するわけで、あまりにも非現実的
272:デフォルトの名無しさん
19/01/21 09:54:05.98 NbFzEAOW.net
>>267
仕様は>>218が決めるんだから>>218がコードを提示すべき
>>236みたいに後出しの条件出されても困るからな
273:デフォルトの名無しさん
19/01/21 10:02:59.35 +Z2Zhk1G.net
>>267
> 例外発生場所から遠くなればなるだけ何が原因で例外が発生して、
> その回避はどうすればいいかが不明瞭になっていくってのは
> 散々語られてる例外の欠点
それ戻り値スタイルでも同じだろ
> リターンコードは泥臭いが下層からくるエラーをどう処理してるかはコード見れば一目瞭然
だからそれはすぐ上位で処理することが前提になってるだろ
上位に何度も伝搬したら例外と同じになる上に伝搬するコードをそこら中に書く羽目になる
> ちなみにプルリクでレビューする文化があればエラー無視してるような雑はコードは突き返されるだろう
例外処理を書かないことはエラーを無視するんじゃなくてそのまま上位に伝搬してるだけ
書かないと無視してると取るのは例外をきちんと理解してないってこと
> 見ればすぐわかるんだから
お前の能力がな w
274:デフォルトの名無しさん
19/01/21 12:21:37.48 Di3L4KSP.net
>>267
例外を使いこなせていないね
例外の型とパラメータをみれば何が起こったかはっきりわかる
おそらく君は例外の種類を使い分ける習慣がないだろ?
あったとしてもせいぜい標準ライブラリの例外をなんとなくふり分ける程度だろうね
でないとこんな発言はしないから
まずは例外を定義するところから初めてごらん
それと大規模開発をしたことがないのはそちらだろう
関数コールするたびにずらずらと変数や分岐を書かれたらあっという間に管理不能になる
大規模だからこそ標準的なコード、必要十分なコードというのが大切になる
275:デフォルトの名無しさん
19/01/21 12:52:23.62 Di3L4KSP.net
リターンコードスタイルをレビューに出すと袋叩きにされるぞ
・ノイズが多すぎて正常系のレビューが不可能
・同じくどのエラーが上位伝達、エラー変換、共通対応、個別対応なのか見てすぐにわからない
・同じく要件漏れを見落としやすい
・正常系、異常系、判断、伝達などあらゆる要素が密集して強く結合しているため仕様変更があった場合の影響が大きすぎてレビューしきれない
276:デフォルトの名無しさん
19/01/21 13:00:29.05 9okmCQOj.net
>>275
考え方自体には同意するけど、>>271で示したように例外安全が破綻しているケースについてどう考える?
エラーコードを前提にクリーンアップ処理が記述されているコードが混入しているような場合ね
あくまでC++に限った話だけど、大規模開発で完全な例外安全を維持するのは極めて困難だか実際には絵に書いた餅と思ってる
277:デフォルトの名無しさん
19/01/21 13:01:15.22 9okmCQOj.net
>>276
訂正
極めて困難で、実際には絵に描いた餅
278:デフォルトの名無しさん
19/01/21 13:05:57.47 eQbQQa6X.net
レビュアーの経験値不足って感が否めない
279:デフォルトの名無しさん
19/01/21 13:14:15.22 NbFzEAOW.net
>>276-277
必要なら直せばいいだけ
非常に稀な事象についてまで例外安全を遵守する必要はないでしょ
そもそもそういう変なコードが混入してる体質の組織で何を言ってるんだよ? って話だと思うけど
280:デフォルトの名無しさん
19/01/21 13:20:41.40 9okmCQOj.net
>>279
文化と素養の問題だよ
例外の是非でこれだけ荒れる現状を見てれば、例外のスルーなんて怖くてできねえよ
そりゃあんたが全てのコードをレビューしてマサカリ投げまくってくれるなら別だけどねえ
281:デフォルトの名無しさん
19/01/21 13:46:08.82 NbFzEAOW.net
>>280
ごめん、言ってることがよくわからん
そもそも
if (hoge() != SUCCESS) errorhandle();
なんてコードがあったら戻り値スタイルでもどうしようもない
例外は魔法の杖じゃないんだから何でもかんでも例外使えば解決するわけじゃなくて戻り値スタイルより楽にできるというだけの事だよ
プログラムがデカくなるほどその差は開くけど
282:デフォルトの名無しさん
19/01/21 15:00:28.97 9okmCQOj.net
>>281
result = hogehoge();
if (failure(result)) エラー処理();
リソース解放();
これhogehogeが例外起こしたらリークするだろ
283:デフォルトの名無しさん
19/01/21 15:09:35.03 NbFzEAOW.net
>>282
スマートポインタ使うなりcatchしてリソース解放して例外再送出するなりいくらでもやりようはあるだろ…
ちょっとレベル低くね?
284:デフォルトの名無しさん
19/01/21 15:25:30.15 9okmCQOj.net
>>283
だからそれが例外安全だよ
勉強になったね
285:デフォルトの名無しさん
19/01/21 15:27:04.68 NbFzEAOW.net
流石に恥ずかしくね? w
286:デフォルトの名無しさん
19/01/21 15:51:37.78 GjW/cezm.net
>>283
基本的にデストラクタやリソース開放系は例外投げられると大変なことになる
catchしてなんて簡単にいってるけどもcatch(...)をそこに入れることになるのはわかるかね
287:デフォルトの名無しさん
19/01/21 16:15:33.27 NbFzEAOW.net
で、そんな当たり前のことを言って何が言いたいの?
聞きかじりの知識を披露してるとしか思えないんだが… w
288:デフォルトの名無しさん
19/01/21 18:01:37.80 .net
例外機構は宗教
多くの人が正しいと盲信しているに過ぎない
289:デフォルトの名無しさん
19/01/21 21:32:31.75 sP4gcHu6.net
戻り値でイベント投げるという選択肢がない言語使用自体くそじゃね?
290:デフォルトの名無しさん
19/01/21 22:06:05.18 5kYBxhZB.net
Cにそんな機能あったっけ?
それとも別の言語の信者が折伏に来ているの?
291:デフォルトの名無しさん
19/01/21 23:00:01.73 vJCo0PxF.net
>>265
そう、検査例外を正しく使うのはしばしば困難で批判も多いな。ただ、呼び出す処理がどのような
例外を返すか、静的な型検査による保証を与えてくれる仕組みとしては他に無いのも事実。
検査例外を否定するのであれば例外型に頼らない(>>264の後者)か、プログラマの努力で
整合をとってやる(>>261の最後)カウボーイ的プログラミングになる。
>>265はあくまでも例外に型を期待しているようだからカウボーイの方なんだろう。
292:
19/01/21 23:52:35.55 N0KGcgmj.net
>>291
>プログラマの努力で整合をとってやる(>>261の最後)カウボーイ的プログラミングになる。
…
…
これって「カウボーイ的」と形容されるべきものだったんですか?
catch の引数は値ではなくて、「型」だから、
テキトーな super class ERROR の下に個別エラー用派生クラスを列挙しておき、
臨機応変に catch (ERROR &e) を噛ましています…
>>256
一応例外を投げておくけれども、まじめにサポートする気はさらさらなく、
そもそもやる気は皆無・全くゼロであることを、ただ、それだけを全心全霊で表現するためだけに
throw 13;
293:はちみつ餃子
19/01/22 02:54:09.24 FdSNzm47.net
例外の処理速度については、こういう提案もある。
URLリンク(ezoeryou.github.io)
要するに、投げるオブジェクトが条件を満たすときは、
暗黙の返却値のような形で例外を伝播する仕組み。
バイナリレベルの取り扱いも ABI を決めさえすれば済むだろうし、
互換性も確保しやすそうに思う。
294:デフォルトの名無しさん
19/01/22 07:12:53.52 c7vqWXz4.net
どう見ても例外否定派の方が宗教がかってる…
295:デフォルトの名無しさん
19/01/22 08:50:21.38 Z/sMOZE7.net
環境の方の質問NGなら完全スルーでお願いします
Windows8.1 64bit のうえで Windows98SE でも動く C のバイナリを作ろうと思ってるのですが
LSI C 試食版以外に何か良い方法がないかなあと…
Windows98SE の方に Visual C++ 6.0 & SP6 をインストールしても良いのかも知れませんが
DLL の整合性とか不安
VC++ 2005 は iso 持ってるだけ…Windows98SE で動くバイナリが生成できるとか何とか
296:デフォルトの名無しさん
19/01/22 09:09:13.74 Z/sMOZE7.net
業務で使った経験は一切ないです
使い捨てレベルのものを書くのが目的です
297:デフォルトの名無しさん
19/01/22 12:47:22.45 beRmTaV+.net
TEST::TEST()
{
うんたら
}
ってコンストラスタがあって、このクラスにパラメータ付のコンストラスタを追加したいとき
C# だったら
TEST::TEST(int param) : this()
{
増やす機能
}
みたいに書きますが C++ の場合はどうやって書きますか
298:デフォルトの名無しさん
19/01/22 13:28:39.91 /wbMKv3O.net
TEST::TEST(int param) : クラスのパラメータ(param)
{
増やす機能
}
299:デフォルトの名無しさん
19/01/22 14:01:29.45 mZt3aCP3.net
>>297
委譲コンストラクタでググると出てくると思う。
たしかC++11で追加された機能。
300:はちみつ餃子
19/01/22 14:03:25.02 FdSNzm47.net
>>295-296
LSI-C試食版 って Windows 用どころか MS-DOS (16bit) の、しかもスモールモデルしか作れないじゃん。
使い捨ての、いいかげんな富豪的プログラミングしたらすぐメモリ足りなくなるぞ。
ワイとしては Open Watcom C++ を推すやで。
301:デフォルトの名無しさん
19/01/22 14:11:32.02 /wbMKv3O.net
>>295
URLリンク(bellard.org)
URLリンク(en.wikipedia.org)
URLリンク(dyama.org)
URLリンク(github.com)
302:デフォルトの名無しさん
19/01/22 15:51:04.50 DsO4NZlu.net
LSI-Cとかなっつw
昔の勉強用コンパイラといったらこれだったな
303:デフォルトの名無しさん
19/01/22 16:10:30.87 3oaAhSoC.net
LS愛ちゃん
304:はちみつ餃子
19/01/22 16:47:15.38 FdSNzm47.net
>>302
Cマガの付録CDに常に収録されてたよな!
305:デフォルトの名無しさん
19/01/22 17:01:23.17 8l7UUA+M.net
LatticeCとかBDS-Cとか使ってたわ
306:デフォルトの名無しさん
19/01/22 17:22:22.39 beRmTaV+.net
>>298-299
TEST::TEST(int param) : TEST()
{
増やす機能
}
で出来ました。ありがとうございました。
307:デフォルトの名無しさん
19/01/22 18:21:52.81 Z/sMOZE7.net
bcc32c でコンパイルしたバイナリが Win98SE 上で動くことを確認…
Win98SE 上だと Turbo C が動くことを確認…
Open Watcom C++ というのは存じませんでした
確認してみます
308:デフォルトの名無しさん
19/01/22 18:30:45.76 hELj0NVW.net
森公一郎さん、4年前に亡くなってる
309:デフォルトの名無しさん
19/01/22 18:51:51.72 c7vqWXz4.net
>>295
> VC++ 2005 は iso 持ってるだけ…Windows98SE で動くバイナリが生成できるとか何とか
なんで試さんの?
310:デフォルトの名無しさん
19/01/22 20:54:28.21 Z/sMOZE7.net
DLL hell に躊躇
311:デフォルトの名無しさん
19/01/22 23:43:17.99 f8uEJHYw.net
LSI-C試食版www
懐かしいなあ
あの頃はものすごくCPU遅かったよね
486にして感激したからな
もうC言語でプログラムはしたくない
C++だ・・・
312:デフォルトの名無しさん
19/01/23 03:50:30.92 2NaZdHzA.net
コメントに//が使えない時点でもうダメだな俺はw
313:デフォルトの名無しさん
19/01/23 06:49:23.93 u7DJzLvn.net
古いOSでも動作させたいけど、ソースは新しい規格で書きたい、
と言うのは要望としてはありうるな。
>>295 はLSI-C試食版(C89相当だっけ?)を使ってるようだから、
そのクチではないのかも知れんけど。
314:デフォルトの名無しさん
19/01/23 07:14:34.51 aGw/aeEH.net
>>310
今時なら仮想マシンでやればいいだけだろ
315:デフォルトの名無しさん
19/01/23 08:57:06.72 A4LjhfFf.net
>>312
コメント前に // つけるより
/*
コメント
*/
あるいは
#if 0
コメント
#endif
のほうがすっきりしないか?
316:315
19/01/23 08:57:45.81 A4LjhfFf.net
コメントが複数行にわたる前提ね
317:デフォルトの名無しさん
19/01/23 09:18:31.94 NxchbiGL.net
だから何?
それに同意しようがしまいが単一行コメントのときに面倒なのは変わらないよね
個人的にはエディタがコメントの一括付け外しに対応してるなら複数行でも//の方が見やすいと思ってるけど
318:デフォルトの名無しさん
19/01/23 09:36:35.20 WSWjtujW.net
C言語の a=b; って
アセンブラで言うと、メモリ→レジスタ→メモリって移し替えてるのと同じ?
メモリ→メモリにデータコピーする時って、必ずレジスタを経由しないとだめなのかな?
アセンブラ勉強初めたばっかで何言ってんだこいつ的な感じだったらごめん。
319:はちみつ餃子
19/01/23 10:06:54.98 +T2/7smM.net
>>318
CPU の種類による。
アセンブラはアセンブラという言語の規格があるわけではなくて、
各コンピュータの機械語の単語を便宜的に読みやすい書式に置き換えた
ものの総称なので、使える命令は各アーキテクチャのデザインに従うし、
書式のバリエーションもある。 いくつかの伝統的な習慣はあるけれど。
データの移送にレジスタを経由しなければならないようなデザインの CPU もあるし、
そうでないものもある。
メモリアクセスをする命令とその他演算の命令を明確に分離するようなデザインの
アーキテクチャを特に Load?store architecture と呼んでる。
URLリンク(en.wikipedia.org)
コンピュータの設計の根本を左右する方針の違いなので、
理解があやふやとはいえ、ここに引っかかりを感じたというのは才能を感じる。
320:デフォルトの名無しさん
19/01/23 15:54:30.09 WSWjtujW.net
>>319
自分が勉強してたCPUがたまたまレジスタ必要とするものだったということですね。ありがとうございます。
あと、intelとryzenは、どちらのCPUであっても殆どのソフトは動作しますが
この2つのCPUのアーキテクチャオペランドは同じということでしょうか?
ゲームなんかは高速化の部分でアセンブラ使う場所も頻繁にあるんじゃないかなと思うのですが。
321:デフォルトの名無しさん
19/01/23 16:07:56.74 WSWjtujW.net
すみません自己解決。
x64ですね。
322:デフォルトの名無しさん
19/01/23 22:57:36.31 A4LjhfFf.net
>>317
wwww
逆に、だから何?
エディタが/* 入力と同時に
*/ を自動挿入してくれるなら全く変わらないだろ
それともおまえのエディタは / 入力で
もひとつ/ を自動挿入するように設定でもしてるのか?
ゆとりもここまで来るとどーしよーもねーな。
323:デフォルトの名無しさん
19/01/23 23:18:56.27 A4LjhfFf.net
>>318
>>319
状況によるが、
a = b;
はメモリを介せず、できるだけレジスタ間コピーになるように最適化される。
んでメモリ to メモリを許すのはCISCと相場が決まってる
RISCはメモリ to メモリは命令にない 。命令セットを減らしてるからこそ reduce
このおかげで回路が簡単になり、所用クロック数をほぼ等しくして、クロック(Hz)をあげることができた。
このタイプはメモリ→レジスタ→メモリとせざるを得ない
今は、パイプラインを深くして、CISCでもクロックをあげられるようになったのでRISC/CISCはあんまり関係なくなった。
CICSの代表はx86なのでメモリ→メモリ命令セット調べてみ。
CISCの歴史的な経緯がわかるのは、これもCISC代表のx68kやH8は、命令セットごとに大幅に所用クロック数が違う。
それに対してx86の流れをくむ最新設計のRL78だとほとんどの命令セットが1クロックとなって。RISCと変わらない上に、
メモリ to メモリが可能となってる。それでも メモリ to レジスタに比べて1クロック増えてる。
メモリ to メモリ とレジスタ to メモリを同クロック数で実行しようとするなら、 バスラインがもう一組(例えば32bit)必要になった上に、
2ポートメモリが必要になってしまうwwww
324:デフォルトの名無しさん
19/01/23 23:20:08.21 A4LjhfFf.net
アンカー違い
× >>319
○ >>320
325:デフォルトの名無しさん
19/01/23 23:21:30.54 MK/3pF0O.net
>>322
自分で複数行が前提だと言っときながら何言ってんの君
326:デフォルトの名無しさん
19/01/24 00:07:57.67 sZmPY6bv.net
>>325
*/の自動補完は複数行だろうが単一行だろうが関係ないだろが。
おまえがエディタ支援による入力補助を持ち出したから応じてやっただけだろゆとり
入力の手間はむしろ/* */の方が楽なんだよお馬鹿さん
327:デフォルトの名無しさん
19/01/24 00:17:17.17 sZmPY6bv.net
>>325
それとさ俺が複数行限定といってるのに
>>317
>単一行コメントのときに面倒なのは変わらないよね
また単一行の話をしてるのはそっちだろーが。
おまえは朝鮮人か?それともボケてんのか?
328:はちみつ餃子
19/01/25 04:31:55.12 D9LdM3uI.net
まあ例えばインテルアーキテクチャでも、
機械語の命令列を内部で μop に分解して最適化してから実行したりするので、
機械語のレベルなんてまだまだ高級な層。
内側では RISC 的なデザインとも融合していて
正直言って、そこで何が起きているのか正確に理解するのは無理。
(結果に影響しない範囲で) 命令を並べ替えることすらあり、
しかし、マルチスレッドと絡むとわけわかんなくなりがち。
Z80 の牧歌的な世界を知ってると隔世の感がある。
実際、演算能力で言えば何百倍とか何千倍とかいう規模で違うもんな……
329:デフォルトの名無しさん
19/01/25 04:48:14.16 RBnOR415.net
Z80Aで、おおむね4Mhzだったような
無印Z80は知らない
日本人だとZ80AよりμPD870Cの方が普及???
330:デフォルトの名無しさん
19/01/25 05:29:09.86 VVNAHEZ9.net
>>329
μPD780C-1な。870だと電卓チップになってしまう。
詰めが甘いな :-P
331:デフォルトの名無しさん
19/01/25 09:28:14.11 U8XeH6tm.net
>>328
自分もこの結論に達した
332:デフォルトの名無しさん
19/01/26 10:50:23.69 ibgF9MiT.net
初心者です
関数の引数の1つとして3種類の構造体を受け入れたいという場合オーバーライドで3つ書くのよりスマートなやり方ありますか?
333:デフォルトの名無しさん
19/01/26 11:07:13.35 MaEquCGy.net
オーバーロードで3つ書く方がスマートですよ
334:デフォルトの名無しさん
19/01/26 11:19:38.97 UuAHSy+r.net
関数テンプレートというものが一応存在する。
tempate<class T> void func(T arg)
{
...
}
このように記述すると、型に応じたオーバーライドをコンパイラが自動で作成してくれるという機能。
ただ、実際に呼び出すコードを書かないと(型が確定してないから)コンパイル対象にならなず限定的なエラーチェックしか行われない、
エラーが出た時に問題が関数内なのか呼び出し元なのかが分かりづらい、エラーメッセージもわけわからない、という欠点があるので、
あまり初心者向きとは言えない。すごく便利なんだけどね。
335:デフォルトの名無しさん
19/01/26 13:38:51.24 ibgF9MiT.net
>>333-334
ありがとうございます
オーバーロードでしたね^^;
336:デフォルトの名無しさん
19/01/26 17:08:07.75 a/6Wmtam.net
>>335
Variantが使えるならVariant
対照的にunionはおすすめしない
337:デフォルトの名無しさん
19/01/26 18:04:32.62 wmp8xlgD.net
結局中で分岐だろ
338:デフォルトの名無しさん
19/01/27 04:46:54.79 tVyD3cTv.net
>>336
variant勉強します
ありがとうございます
339:デフォルトの名無しさん
19/01/27 23:53:20.30 PNYmCs1E.net
投機実行がセキュリティホールになるなんて
当時の技術者は予見できたのだろうか
340:デフォルトの名無しさん
19/01/30 21:22:57.38 pEOkr0Qg.net
いやー
論文ネタに困った情報系の役にたたん学者がひねり出したネタだろ
投機実行を攻撃に使った実例なんてあるのか?
341:デフォルトの名無しさん
19/01/31 10:11:52.05 .net
煽ってたら論文ネタに困った情報系の役にたたん学者が投機実行を攻撃に使った実用法をひねり出したらどうすんだ
342:
19/01/31 23:01:04.87 GI5VQ7Hx.net
>>340
手元にようやく SandyBridge(IvyBridge) を確保しましたのでいろいろ試してみようと思っています
343:デフォルトの名無しさん
19/01/31 23:07:28.54 sIpyZVmV.net
Googleだったっけ、見つけたのは?
役に立たない暇な部門があったんだ
344:デフォルトの名無しさん
19/02/01 03:34:40.30 fFpCRDyYq
twitter で見かけたのですが、a[i++] = 0; って定義済みですよね?
345:デフォルトの名無しさん
19/02/02 08:27:42.12 tJohl//6.net
C++って未だにasync,awaitがないんだな?
江添とかtemplate使えないC++プログラマはポインタを使えないCプログラマと同じゴミとかいってるんだが、
templateは確かに面白いし頭の体操になるけど、templateはひな形があれば、泥臭くエディタちょい編集して使い回したり、
yacc/lex使うとか、ループのアンロールはスクリプトで展開するとかいくらでも手段はあるので、
どう考えてもasync,awaitあたりの実装の方が重要だと思うけどな。
346:デフォルトの名無しさん
19/02/02 08:50:29.54 UyxpbyFe.net
futureでいいんじゃね。C#のawaitもFutureパターンの実装でしょ。
347:デフォルトの名無しさん
19/02/02 11:01:27.11 tJohl//6.net
>>346
.net動いてるのとそれが前提でないC++では全く同じにはいかんのだろな
教えてくれてありがと
348:デフォルトの名無しさん
19/02/02 11:23:05.73 ZfwOhOL2.net
コルーチン拡張は提案段階なんだっけ?
MS界隈ならC++/WinRTで使用例があるけど
349:デフォルトの名無しさん
19/02/02 11:47:15.38 qgXcCvEo.net
>>347
いや別に
C#のasync/awaitって単なるステートマシンジェネレータだし
標準化は至難だろうけど技術的にはC++でできない理由はない
350:デフォルトの名無しさん
19/02/02 13:08:31.83 cZfjknnV.net
>>345
再帰includeとdefineの組み合わせでも大抵はなんとかなったりするなw
templateは型に縛られてるから安全な反面、不便なこともあるよね。
sjisとutf8が区別できないし。なぜchar8_tを作らなかった…(´・ω・`)
351:デフォルトの名無しさん
19/02/02 13:11:59.53 OjPcxytf.net
テンプレートよりObjective-Cのやり方の方が好き
352:デフォルトの名無しさん
19/02/03 12:10:14.76 JIYTTgNa.net
江添なんて最新仕様知ってる俺スゲーやりたいだけの奴だからな。
まともに使えるプログラムを書いてるわけじゃない。
353:デフォルトの名無しさん
19/02/03 14:07:26.32 IhqR/Csp.net
でもプログラム書くなんて誰でも出来るじゃん
354:デフォルトの名無しさん
19/02/03 14:11:00.19 s/ZudwPt.net
おまえのgithubさらせよ
355:デフォルトの名無しさん
19/02/03 14:15:39.93 IhqR/Csp.net
>>354
お前が先に晒せ
356:デフォルトの名無しさん
19/02/03 14:56:06.74 nprxb46h.net
きっとはぶられる
357:
19/02/03 15:08:24.54 t4xt++Qj.net
>>354
そろそろ github に移行しようか…
スレリンク(tech板)
スレリンク(tech板)
スレリンク(tech板)
スレリンク(tech板)
スレリンク(tech板)
358:デフォルトの名無しさん
19/02/04 12:56:22.82 Y0slw8we.net
>>352
江添とか書いてることみてるとムカっ腹立たないか?
何様だこいつ。しかもやってることキチガイだろ
359:デフォルトの名無しさん
19/02/04 13:07:21.17 qU4d2Hmv.net
>>358
は?お前じゃあ江添より仕様に詳しくてC++のコンパイラを実装出来るような能力なのかね?ええ?
360:デフォルトの名無しさん
19/02/04 14:02:36.47 zmkNdOJF.net
工学部生よりましやろ
361:デフォルトの名無しさん
19/02/04 14:08:27.48 n76odGjc.net
例え世界一の物知りでもそんな口の効き方をする人とは
付き合いたくないな
RMSにはEMACSやgccといった作品があるから許される
362:デフォルトの名無しさん
19/02/04 14:56:20.34 iZ37iel0.net
この3冊は、日本人が作った神の書。
皆、基地外。基地外しか、こんな本を書けない
Linux プログラミング・インタフェース、Michael Kerrisk、2012
この本は、神の書と言われていて、翻訳本は日本しか出ていない。
著者は10年、man-pagesを書いてきた人で、翻訳者・アドバイスの千住治郎も、技術者
C++11/14 コア言語、江添 亮、2015
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006
ドワンゴ江添は需要があれば、テンプレートの本を出そうか、なんて言ってるけど、既にこの本がある
C++テンプレートテクニック 第2版、
επιστημη(えぴすてーめー)・高橋 晶、2014
363:デフォルトの名無しさん
19/02/04 15:06:30.08 zmkNdOJF.net
ステマ宣伝乙
5ちゃんでは禁止
364:デフォルトの名無しさん
19/02/04 15:58:27.96 n76odGjc.net
Linuxの黎明期にman page 書いていたのは janneさん事、中谷千絵さんだよ
エピスメーテーさんは昔っから雑誌に記事を書いていたな
The Basicだった?
真ん中の人は知らないけどどんな貢献をしたの?
365:はちみつ餃子
19/02/04 16:09:06.48 kMmgpke2.net
>>364
ざべは読んだことないけど、Cマガでεπιστημηの名前はよく見たな。
今では Teratail で C++ の質問をするとたまに回答者として出現するよ。
366:デフォルトの名無しさん
19/02/04 16:27:32.33 n76odGjc.net
>>365
そうでしたか、CUJJとかは買っていたけど...CMAGは
時々だったので
367:デフォルトの名無しさん
19/02/04 17:40:44.94 Y0slw8we.net
>>362
えぴすてーめーと高橋のC++テンプレ本は神だわ。
なんというか、読者に理解させてあげたいという熱意が伝わってくる
江添とは大違い
江添にお布施するつもりは毛頭ない。死ねばいいのに
368:デフォルトの名無しさん
19/02/04 17:42:39.71 Y0slw8we.net
>>359
本人様のご登場wwww
369:361
19/02/04 18:14:10.83 iZ37iel0.net
>362 の3冊は、単なる規格の文章ではなく、それをソースコードの実例にした所がすごい!
だから、プログラマーは皆、Kerrisk の本を枕にして寝ろって、言われている
たぶん、江添やMISRA‐C の本も、外国で発売されていれば、大絶賛されるはず!
370:デフォルトの名無しさん
19/02/04 19:01:28.11 GH1lEwiX.net
エピスや高橋ageて江添sageってのもよくわからんな
立ち位置違うし江添は委員会の人間だから
仕様や提案について素晴らしいとかクソとか言う権利や責務がある
それをsageるってことは「現行仕様マンセー、標準規格に欠点など無い!」みたいなことか?
371:
19/02/04 19:11:50.08 CLpqTC7n.net
>>362
エピさん単著は買わないですね、エピさんの文章は今の言葉で表現するとすれば「ポエマー」が近い
同じくポエマーに分類される私がいうことではないのですけど…
372:361
19/02/04 19:22:56.32 iZ37iel0.net
元々は、Kerrisk も、江添やMISRA‐C のメンバーも、
規格をソースコードの実例で、表示してやろうという、とんでもない企画!
よく規格厨みたいな香具師がいて、企画書を読めって言うけど、
文章で書かれてもわからないし、全く出来るようにならないから、業を煮やして書き始めた
こんな面倒くさいことを、何年も掛けて書くかね?
こういうのは、忍耐力がある日本人が得意なんだろう。
外人は、まずやらない
373:デフォルトの名無しさん
19/02/04 19:24:18.62 n76odGjc.net
MISRA はBOSCH を引き込み損なった時点で絵に描いた餅でしょうね
デンソーが勝利すれば勝ちの目も出て来るかもしれないが
374:デフォルトの名無しさん
19/02/04 19:29:03.26 Y0slw8we.net
>>372
>規格をソースコードの実例で、表示してやろうという、とんでもない企画
いや言語の解説本は規格をわかりやすく、ソースコードを例示して解説するでしょ。
それがなければ、規格だけでいいわけで、解説にならない。
わかりやすく書こうとしてるけど、そこの熱意の持ち方と、おつむのレベルでほんとにわかりやすいかどうかが問題なんだろ。
375:デフォルトの名無しさん
19/02/04 19:32:47.98 GH1lEwiX.net
そら商業目的の本だったらわかりやすく書くの当たり前だろ
江添の本は読んだことないから分からんけど
売られてる本とブログで比較してないか?
376:デフォルトの名無しさん
19/02/04 19:36:24.60 Y0slw8we.net
>>372
>こういうのは、忍耐力がある日本人が得意なんだろう。
>外人は、まずやらない
K&R も Stroustrapも規格になるまえからやってますがな
ソース示してこつこつと。
何もプログラム言語だけじゃないわ。人に説くこと、伝道師のようなwriterは日本人よりむしろ、英米人に多い。
クヌースの The Art of Computer Programmingあたり読んでみ。
377:デフォルトの名無しさん
19/02/04 19:46:25.23 Y0slw8we.net
>>375
反響見て、読んだやつにバグだしさせてたあとブログ印刷物なり、ebook販売するんだから
金取ろうが、無償でやるかはどーでもいい話
日本語のコンピュータ書籍なんて販売数からしてとてもとてもメシ食えないから
ほぼ実益のないめんどくさいだけの作業
ブログでわかりにくければ本になってもわかりにくいことは保証する
378:デフォルトの名無しさん
19/02/04 19:48:43.30 9WmylojK.net
クヌースの4-1巻目は、かなりの分量をZDD/BDDの説明に割いていて
このアルゴリズムは北海道大学で日本人が考えた物だね
で、その江添さんという方はどの様な技術貢献をしたの?
379:デフォルトの名無しさん
19/02/04 20:02:32.24 Y0slw8we.net
>>378
警察に喧嘩売って訴訟おこしたこと以外知りませんがな
きちがいの所業なんざ
380:デフォルトの名無しさん
19/02/04 20:32:13.56 GH1lEwiX.net
まぁC++テンプレートテクニックがわかりやすい良書なのは同意するけど
高橋晶ってたまにテクニックのメリットを語るときに
デメリットに気づいてない(またはスルーしてる)ことがあるんだよな
わかりやすくても鵜呑みには出来ない
381:デフォルトの名無しさん
19/02/04 20:36:58.42 Y0slw8we.net
ま、江添が好きならどーぞご勝手に俺は願い下げってだけ
382:デフォルトの名無しさん
19/02/04 20:39:36.21 GH1lEwiX.net
好きとは言ってないよ
結局役に立つ&正確な情報を書いてるかどうかが全てだ
383:デフォルトの名無しさん
19/02/04 20:41:05.88 GH1lEwiX.net
というか江添のブログでも「あれ?おかしくね?」みたいなことあったから
どっちがどうとも言えないけど
384:デフォルトの名無しさん
19/02/04 21:00:45.66 Y0slw8we.net
だいたい
ドマンコ
とかいう社名が下品すぎる
385:デフォルトの名無しさん
19/02/04 22:23:14.32 ZVfvG47Q.net
>>365
毎月題材がカウンタークラスの人…
386:デフォルトの名無しさん
19/02/04 23:23:10.64 Y0slw8we.net
URLリンク(qiita.com)
実に参考になった
387:デフォルトの名無しさん
19/02/04 23:47:34.63 xjVdC68S.net
型指定するのが嫌だから最初にautoを使うc++入門書籍を書こうとしてたり、
まともにプログラム開発してたら最新の仕様を追えないので開発しないとか言い出す奴とか
普通の精神してりゃ信用せんわな。
根本的にありゃ馬鹿だよ。
388:デフォルトの名無しさん
19/02/04 23:59:20.89 GH1lEwiX.net
>まともにプログラム開発してたら最新の仕様を追えないので開発しないとか言い出す奴とか
江添みたいに標準化委員会に属してたら正しいと思うけどね
何もコミュニティに貢献しない趣味グラマだったりライターでもない奴が言ってたらアホだが
389:デフォルトの名無しさん
19/02/05 01:34:09.47 PwKFrksX.net
趣味グラマにドワンゴが給料払ってるんだろwww
390:デフォルトの名無しさん
19/02/05 06:14:00.98 sYtbTM3p.net
すみません
n秒ごとに関数foo()を繰り返し実行するような、かつ「低負荷な」方法を教えてください。
n秒は、精度はだいたいでよくて、たぶんnは600(つまり10分)程度にしたいと思っています。
windows 10 で、gccで最新の標準C++ とboost C++ が使用可能です
よろしくお願いいたします
391:はちみつ餃子
19/02/05 06:20:20.09 VmiK9YL/.net
>>390
SetTimer API を使って WM_TIMER イベントの発生を待つのが妥当な方法だと思う。
イベントが発生するまでは何もせずに待つだけなので低負荷。
392:389
19/02/05 06:57:10.23 sYtbTM3p.net
>>391
windows API をつかう方法で行ってみます
ありがとうございます。
標準C++ で導入された
thread とchrono を用いて、while (1 )を回すという方法がGoogle検索で 出てきますが、低負荷な方が良いので、windows API で行ってみます。
ありがとうございます。
393:デフォルトの名無しさん
19/02/05 07:12:26.12 kZRbw8C2.net
whileは単なる無限ループじゃなく、スレッドが立ち上がるまで、sleep で CPU を眠らせてるんじゃないの?
whileだけだと、負荷かかるし、sleep一発だと、繰り返し待ちできないから
394:デフォルトの名無しさん
19/02/05 07:23:19.83 kZRbw8C2.net
URLリンク(ja.cppreference.com)
gccは並列STLまだ実装できてないんだな。がかーり
C++2xは後回しでいいから先に実装してもらいたいな
msvcがしらん間にgccを上回るC++17準拠状況になってるんだな
msがかなり頑張ってるのがかなり意外
395:デフォルトの名無しさん
19/02/05 10:24:17.44 Jquzc2Ph.net
趣味グラマーって本職が焼そば職人だっけ
396:デフォルトの名無しさん
19/02/05 10:36:43.43 PCiHKxWL.net
MSが標準をわざと外して潰し合う戦略を取ってたのは遥か昔
今は協調してシェアを取り込んでから独占する戦略がメイン
397:デフォルトの名無しさん
19/02/05 13:32:56.11 HSCecGQW.net
>>395
ブロガーで良くね?
398:デフォルトの名無しさん
19/02/05 18:47:37.04 VoURnPvV.net
スパゲッティーでは?
399:デフォルトの名無しさん
19/02/05 21:03:29.46 6rjCuhxB.net
>>397
つ URLリンク(cpplover.blogspot.com)
400:デフォルトの名無しさん
19/02/06 08:14:04.23 QvJUH+Yd.net
>>395
Oishii Sru Paの話?
401:デフォルトの名無しさん
19/02/07 11:49:12.65 nCm+DDSJX
【製作中 の wasm(WebAssembly)/MS Windows 共通の Window System】
URLリンク(nowsmartsoft.atwebpages.com)
ひきこもりの L より。
402:デフォルトの名無しさん
19/02/07 12:01:48.93 nCm+DDSJX
>>401
何日か前から5chで公開した(「つもり」だ)けど、Ninja Analyzer によれば、そのリンク先
を訪れたユニークユーザー数は、今のところ「1」。
どうなってるの。
403:デフォルトの名無しさん
19/02/09 10:04:34.12 Js3eMSlM.net
6
だまれ朝鮮人
失せろ
404:デフォルトの名無しさん
19/02/09 13:43:15.52 n731AUSx.net
Class TA{
public:
TB B;
}
Class TB{
・・・
}
Class TA::TA(){ //コンストラクタ
B = new TB;
}
で、TAのデストラクタが走った時点でBも一緒に消えるんですかね。
それともTAのデストラクタで delete B が必要なんですかね。
405:
19/02/09 14:02:51.11 1JWnTnfH.net
>>404
new したのなら delete は必ず書かないといけない
URLリンク(ideone.com)
406:デフォルトの名無しさん
19/02/09 14:24:00.17 6TG0Gkwe.net
必ずというわけではないよ
407:
19/02/09 14:36:03.78 1JWnTnfH.net
>>406
理解はしますが薦める気にはならないのです…
408:デフォルトの名無しさん
19/02/09 15:47:27.40 YAWSonmT.net
>B = new TB;
エラーになるんじゃね?
409:デフォルトの名無しさん
19/02/09 16:20:31.91 NnmcfWng.net
>>408
それぐらいは忖度してやれよ
410:デフォルトの名無しさん
19/02/10 13:20:38.44 MWi64iyD.net
メンバ変数にクラスを持つときはポインタ型にしてコピーコンストラクタを作るべきですか?
それともクラスの実体を持たせても大差ありませんか?
411:デフォルトの名無しさん
19/02/10 13:21:20.82 XMMc9iis.net
クラスと用途による
412:デフォルトの名無しさん
19/02/10 13:40:02.39 Ix0Ul5tp.net
実体で用が足りるならすべて実体でよい
効率云々はまず一通り動くものが出来上がった上でそこが問題になってから考えろ
413:デフォルトの名無しさん
19/02/10 13:41:09.49 MWi64iyD.net
わかりました
ありがとうございます
414:デフォルトの名無しさん
19/02/10 14:15:19.12 0+1G/wKU.net
値型とエンティティを意識して作って下さい
エンティティはスマポで管理、値型は実体を持たせるべきでしょう
415:デフォルトの名無しさん
19/02/10 14:26:23.71 KPch74RC.net
エンティエィって何?
定性的な定義を頼むわ
416:デフォルトの名無しさん
19/02/10 14:30:03.09 0+1G/wKU.net
>>415
インスタンスがアイデンティティを持つならエンティティ
417:
19/02/10 15:14:36.29 nGIVWkyn.net
>>416
実数はエンティティですか?
符号付整数はエンティティですか?
418:デフォルトの名無しさん
19/02/10 15:16:29.18 sKzQuR0e.net
あーやだやだ
こういう宗教じみた設計論語るやつ
419:デフォルトの名無しさん
19/02/10 15:16:40.47 0+1G/wKU.net
>>417
値です
420:デフォルトの名無しさん
19/02/10 15:17:40.51 0+1G/wKU.net
>>418
現実を見据えて追求すると自然と出てくる答えです
421:デフォルトの名無しさん
19/02/10 16:25:18.62 scT3207q.net
親クラスとライフサイクルが同じか数値型なら実体、そうでないならポインタでいいだろ。
動的確保よりコピーやmoveのほうがコストが低い場合とか検討の余地はあるけど、考えすぎると禿げる。
422:デフォルトの名無しさん
19/02/10 16:31:34.44 25jgEgQt.net
>>404
デストラクタは virtual に汁
423:デフォルトの名無しさん
19/02/10 20:26:50.17 EWmLbbO6.net
どうせそこまで最適化も厳密なメモリ管理も必要なプログラムじゃないだろ。
424:デフォルトの名無しさん
19/02/10 21:57:11.00 sKzQuR0e.net
>>420
ほらね、こういう精神論がでてくる
425:デフォルトの名無しさん
19/02/11 01:02:52.04 QKPibkAC.net
組み込み以外に使い道あるんですか?
426:デフォルトの名無しさん
19/02/11 07:24:34.72 KN5ZTrY9.net
OS作ったり、ブラウザ作ったり、3Dバリバリのゲームを作ったり、他の言語向けに機械学習や科技計算等のライブラリを作ったり、いろいろあるよ
427:デフォルトの名無しさん
19/02/11 12:01:51.83 itY+kGJR.net
RubyはC++が嫌いだからCで書かれている
428:デフォルトの名無しさん
19/02/11 12:06:46.94 QKPibkAC.net
>>426
天才達だけに許された言語なのでしょうか?
もっと身近なプロダクトはないんですか?
429:デフォルトの名無しさん
19/02/11 12:32:11.46 PRVQuzHN.net
古い例だとニコニコ動画がC++
まあおかげで開発がスケールせずオワコン化したわけだが
430:デフォルトの名無しさん
19/02/11 12:32:14.48 itY+kGJR.net
the door is open
431:デフォルトの名無しさん
19/02/11 12:43:40.65 MmPS3pUZ.net
>>428
聞いてばっかりじゃなくてお前がどういうものを探しているか書いたら?
432:デフォルトの名無しさん
19/02/11 13:10:19.37 Y0EVtjJ+.net
CADとか画像処理とかビット演算系アルゴリズム(cf.ZDD)なんかは
まだまだ他の言語には負けないね
433:
19/02/11 13:44:01.42 HT+vwAFW.net
>>429
>開発がスケールせずオワコン化した
これってどういう意味ですか?
434:デフォルトの名無しさん
19/02/11 13:51:23.27 awXFg/MG.net
JavaからC++勉強中です
C++の場合、他のクラスのオブジェクトを複数持たせるときは、一般的にどうするんでしょうか
・コンテナにオブジェクトそのものを突っ込む(一番わかりやすいけど、ムーブの定義忘れとかでミスが出そう)
・コンテナにオブジェクトへのポインタを持たせる(コンテナ解放時に、クラスごとに同じようなメモリ解放処理書くのかしら)
・コンテナにポインタをスマートポインタで持たせる
辺りをネットで読ませてもらいましたが、こんな感じで良いんでしょうか?
不勉強な上、他のオブジェクト持つという基本的なことなので、なんかもっと簡単な方法を見落としてる気がしてしまいまして
435:デフォルトの名無しさん
19/02/11 13:54:24.78 QKPibkAC.net
>>434
時と場合によりますので一般的な答えはありません
436:さまよえる蟻人間
19/02/11 14:06:14.14 fD0IDjkv.net
>>434
Javaのオブジェクト参照はC++のポインタに該当する。
C++のオブジェクトは、型を持ったバイト列だと考えていい。
C++で自動変数を宣言すると、スタックにバイト列が割り当てられる。
newやスマポやコンテナを使うと、ポインタによりヒープでメモリーが割り当てられる。
ポインタも型を持ったバイト列。ポインタは配列のように周りのメモリーにアクセスできる。
C++のクラスは構造体に関数群を追加したもの。C++でクラスを継承すると、関数群とバイト列を引き継いだサブクラスになる。
437:デフォルトの名無しさん
19/02/11 14:12:14.41 0TxoCFW6.net
>>434
大体、その3つの通りで、そこに述べられたものの上から優先的に選ぶ。
つまり、普通にメンバ変数にオブジェクトとして宣言するのがC++では
最も効率が良くて伝統的な書き方。それでは問題が生じる場合にオブジェクトの
ポインタとして持たせる。スマートポインタは後になって導入されたもので、
人気があるものではないので無視して良い。
二番目のポインタとして持たせるのは、例えば、今定義している最中の
クラス(自分自身)と同じ型のデータで、子どもや親にあたるデータへ
リンクを作りたいようなときか、または、ある基本クラスを継承した
色々なクラスのオブジェクトを持ちたい場合に用いる。
438:さまよえる蟻人間
19/02/11 14:16:41.10 fD0IDjkv.net
C/C++では、sizeofキーワードを使えば、簡単にvoid以外の型のサイズがコンパイル時に取得できる。Javaではオブジェクトのサイズを簡単に取得することはできない。
C/C++はよくオブジェクトのサイズやバイトの並びを意識してプログラミングする。
439:デフォルトの名無しさん
19/02/11 14:17:25.55 a3vDiVrE.net
結局CのポインタってJavaとかの言語で表すなら何なんだ?
440:さまよえる蟻人間
19/02/11 14:23:20.42 fD0IDjkv.net
なぜなら、例えばスタックに巨大なデータを割り当てると、スタックオーバーフローというエラーが発生するし、
ヒープだって、巨大なデータの割り当ては失敗することがある。
また、構造体を変更すると、構造体のサイズやデータ構造が変化して、互換性の問題が発生することがある。
441:デフォルトの名無しさん
19/02/11 14:24:23.31 awXFg/MG.net
>>437氏他
丁度今、ウェブ上のC++で書かれたCompositeパターンのソースを読ませて頂いてました
正に2番目で実装されてましたが、都度メモリ解放処理書くくらい当たり前なんですね、流石C++です
独学なもんで、こうはっきり言ってもらえると本当にありがたいです、使い分けて行きたいと思います
他の皆様もありがとうございました、勉強になりました
442:さまよえる蟻人間
19/02/11 14:34:10.39 fD0IDjkv.net
>>439
Javaの動的配列はCのポインタに近いが、Javaの配列では危険なアクセスは制限されているし、参照カウントで管理されている点が異なる。
Javaのオブジェクト参照は、参照カウントで管理されており、C++の構造体/クラス型に対するstd::shared_ptrに該当する。
443:さまよえる蟻人間
19/02/11 14:37:16.50 BEdrdhIs.net
しかし、std::shared_ptrはヌルポを指定できるが、Javaはできない。
444:デフォルトの名無しさん
19/02/11 14:49:43.57 0TxoCFW6.net
>>441
C++ は、デストラクタに必ずメモリ解放処理を書いておけば、そんなに
メモリーリークを気にすることはない。多くの場合にはそれで完全に処理できるから。
次のように書くだけで、ほとんどの場合、メモリーリークは起きない:
class CMyClass {
BYTE *m_pBuf;
CMyClass() { // コンストラクタ
m_pBuf = NULL; // メモリをまだ未割り当てであることをマークするためにこうしておく
}
~CMyClass() { // デストラクタ
if ( m_pBuf != NULL ) {
delete [] m_pBuf; // メモリの解放
}
}
}
445:デフォルトの名無しさん
19/02/11 14:52:47.12 dGdUrFsa.net
すごく古い書き方だ
446:さまよえる蟻人間
19/02/11 14:54:57.57 BEdrdhIs.net
>>444
ナマポの場合、代入したらまずいよ。例外安全にも問題があるし。
447:デフォルトの名無しさん
19/02/11 14:55:46.62 DnOcmNTU.net
確かに、人に教えるレベルじゃないね
448:デフォルトの名無しさん
19/02/11 14:56:36.09 0TxoCFW6.net
>>444
正しくは、次のようにアクセス制御のための「public :」を書かないといけない。
class CMyClass {
protected :
BYTE *m_pBuf; // 高速化のため、自動的には初期化はされないのでコンストラクタで初期化する。
public :
CMyClass() { // コンストラクタ
m_pBuf = NULL; // メモリをまだ未割り当てであることをマークするためにこうしておく
}
~CMyClass() { // デストラクタ
if ( m_pBuf != NULL ) {
delete [] m_pBuf; // メモリの解放
}
}
}
なお、必要に応じて、コンストラクタの中で、m_pBuf = new BYTE [xxx]; のように書いても良い。
それと、BYTE は、「オブジェクト」ではないので、あなたの書いているような場合には、
BYTE *m_pBuf の部分を CSomeObject m_pObj; のように変えて、m_pObj = new CSomeObject;
のようにする。
449:さまよえる蟻人間
19/02/11 14:58:34.69 BEdrdhIs.net
>>448
ダメだこりゃ。
450:デフォルトの名無しさん
19/02/11 15:03:05.98 MkFOBvt9.net
良い子のみんなは>>444の危険性が理解できるまではスマートポインタを使ってね
おじさんとのお約束だよ
451:デフォルトの名無しさん
19/02/11 15:11:57.93 Qk3j4qw0.net
>>448のデストラクタでnullチェック必要?
nullポインタをdeleteしても問題ないはずだが
二重解放防止にはならんし意味わからん
452:さまよえる蟻人間
19/02/11 15:18:49.80 BEdrdhIs.net
>>451
超独自仕様の組み込み開発とか、メモリー管理がbuggyなプログラムでは意味があるらしい。
例えば解放したメモリーブロックをアクセスするような行儀の悪いプログラムでは意味がある。
453:はちみつ餃子
19/02/11 15:19:34.89 eS7AzULV.net
>>444 >>448
・ 初期化を初期化リストでやらずに代入でやるのは邪悪。
・ delete に NULL を渡した場合には何もしないことが保証されているので、
無駄にヌルチェックする必要はない。
・ ポインタ型や整数型の値もまたそういう型の「オブジェクト」である。
(元質問者が Java から入ってきてるから「Java の用語で言うところの」という意味?)
454:デフォルトの名無しさん
19/02/11 15:19:51.73 3tLemvMU.net
初心者なので確認
コンストラクタの中に飛び込む前のメンバの初期化で例外発生したら m_pBuf は中途半端になるから
コンストラクタの中で代入するんじゃなく、メンバ初期化子で初期化しろ
という認識でいいのかしら
455:さまよえる蟻人間
19/02/11 15:29:14.84 BEdrdhIs.net
>>454
「C++ 例外安全」でググれ。ナマポを使わずに、素直に生配列、コンテナ、スマポのどれかを使えば済むこと。マネージされてないナマポは村八分にしろ。
456:デフォルトの名無しさん
19/02/11 15:39:02.97 3tLemvMU.net
なんとなくわかった ような気がする
生ポそのものはコンストラクタもデストラクタに何ら操作しないから宙ぶらりんこになるのか
457:デフォルトの名無しさん
19/02/11 15:41:57.41 dGdUrFsa.net
ちょっち理解は大変だけど生ポはスマポにドンドン置き換えたい
458:さまよえる蟻人間
19/02/11 15:43:11.94 BEdrdhIs.net
スマポならコピーコンストラクター・代入のややこしさからも解放される。
459:はちみつ餃子
19/02/11 15:52:25.23 eS7AzULV.net
まあまあ。
スマートポインタを活用しろというのはその通りだが、
ポインタ (や例外機構) を理解せずに
思考停止してスマートポインタを使うのはあかんやろ。
ここの元質問者はまだそこを理解しようとしている
ところなんだから、スマートポインタを使わなかった場合にどう書けば良いのか、
きちんと書くと面倒くさすぎるという体験も必要だろ。
460:さまよえる蟻人間
19/02/11 16:16:38.24 fD0IDjkv.net
所有権の管理は人類には早すぎる。
所有権が変動するときは、スマポでOK.
461:さまよえる蟻人間
19/02/11 16:28:46.52 fD0IDjkv.net
こんなときはナマポを使ってもよい:
処理の中で所有権が移動・消滅しない場合。
バイナリーデータやPODを生で扱う場合。
処理系がナマポやトークンやハンドルの入力を要求する場合。
462:デフォルトの名無しさん
19/02/11 16:36:19.07 QKPibkAC.net
生ポはスマポのオーバーヘッドすら許容できないときに使うものです
だから初心者は無理して生ポを使わなくていいです
463:デフォルトの名無しさん
19/02/11 16:59:08.84 V2lM2C5l.net
>>437
スマポは後になって導入されたもので人気がない、なんて意見は一般的ではないので無視して良い
464:デフォルトの名無しさん
19/02/11 18:19:37.85 j549IniP.net
スマポをC#のusing感覚で使ってる
465:デフォルトの名無しさん
19/02/12 13:19:56.52 VqanzRzk.net
エアプwwwwwwwww今は参照カウントじゃねーよw残念だったなクソ蟻wwww
466:デフォルトの名無しさん
19/02/12 13:20:43.00 VqanzRzk.net
それで、Cの生ポってC/C++以外で表現するなら何なんだ?
467:デフォルトの名無しさん
19/02/12 16:02:24.32 VerJGrBE.net
>>466
native int
468:デフォルトの名無しさん
19/02/12 17:27:09.82 VqanzRzk.net
>>467
仮装アドレス的な意味で来るとは思ってなかったwでも本質はそうだよなあ
469:デフォルトの名無しさん
19/02/12 17:29:23.18 t+DTqVP+.net
CALL -151
470:デフォルトの名無しさん
19/02/13 06:16:37.08 2WlGbphz.net
>>466 今の言語は極力「生のポインタ」が見えないようにしてるからなぁ。
オレの乏しい知識で無理矢理ヒネリ出すなら、
「古いBASICの peek, poke のアドレス指定に変数を使った場合」かのう。
型のない単なるアドレスって言うか数値だけど。
471:デフォルトの名無しさん
19/02/13 15:13:52.62 Yg4iFXpY.net
upvar
472:デフォルトの名無しさん
19/02/13 15:46:18.41 SgfrIpbp.net
>>466
BYTE ptr = アドレス値;
BYTE MEM[4096 * 1024]; // 4GB のメモリ配列
*ptr ---> MEM[ptr] // ptr は MEM[] 配列の添え字
473:デフォルトの名無しさん
19/02/13 15:46:56.07 GHq8zte2.net
訂正:
BYTE MEM[4096 * 1024 * 1024]; // 4GB のメモリ配列
474:デフォルトの名無しさん
19/02/13 15:48:00.46 GHq8zte2.net
訂正:
Uint32 ptr = アドレス値;
475:デフォルトの名無しさん
19/02/13 18:19:07.37 QnNf1eu6.net
恥の上塗り
476:デフォルトの名無しさん
19/02/13 19:18:53.91 BFnAt9lr.net
intptr_t とか、INTPTRとか。
477:デフォルトの名無しさん
19/02/13 19:41:39.99 D91GFqhb.net
eax
478:デフォルトの名無しさん
19/02/13 22:43:21.58 8CyDgeqf.net
行儀よく バッファなんて 守れやしなかった
夜のサーバ オーバフロー起こしてまわった
*印見て アナルといわれた 早く添え字になりたかった
信じられぬ カーニハンとの 争いの中で
許しあい いったい何 解りあえただろう
うんざりしながら それでも過ごした ひとつだけ解ってたこと
このポインタからの 卒業
479:デフォルトの名無しさん
19/02/14 07:38:16.87 fSoz/vTj.net
まあstatic変数やglobal変数使ってリークしてないとか言い張るバカよりかは
ナマポ使えやとは思う。
それならまだコード修正効くからな。
初心者にスマポ使わせればリークしないコード書かせることができるって考えははっきりいって幻想だわ。
480:デフォルトの名無しさん
19/02/14 22:35:36.88 vW9ukCJU.net
昔研究室の後輩でポインタがわからないから全部グローバル変数でプログラム作ってるって奴がいて、
それはそれである意味すごいなって思ったわ。
マルチメディア系ライブラリを触る必要がある研究室なのだが。
元々組込系が得意な奴だったってのもあると思うけど。
481:デフォルトの名無しさん
19/02/14 22:50:47.58 tlcLfILV.net
COBOLERだったんじゃね
482:デフォルトの名無しさん
19/02/15 00:04:29.72 tnuHGyjk.net
一度切りの使い捨て用途とかなら全然よくね
483:デフォルトの名無しさん
19/02/15 00:36:18.42 kpfA4lgp.net
>>479
スマートポインタを使うとコード修正効かなくなるの?どういうこと?
484:デフォルトの名無しさん
19/02/15 00:46:46.72 TR5VS7Vw.net
mp4boxをちょこっといじったのを作ろうとしたんだけど、
signed int32の計算で -2112000 / 48000 の結果が 89434 になるんですが。
VS2015のx64です。
485:デフォルトの名無しさん
19/02/15 06:57:51.95 OZ8Dcboc.net
>>484 「-2112000 / 48000 の結果が 89434」
その環境を持ってないんで分からないけど、
-2112000 の32bit16進数表現が 0xffdfc600
89434 * 48000 == 4292832000.000 == 0xffdf6b00
両者のビットパターンが一致することと関係ありそうね。
被除数の -2112000 を64bitで表現する際に
符号拡張 0x_ffff_ffff_ffdf_c600 とすべきなのに
ゼロ拡張 0x_0000_0000_ffdf_c600 にしちゃって、
その後の計算は64bit正数でやってる感じかな。
486:デフォルトの名無しさん
19/02/15 07:20:58.81 1DfV94Wg.net
>>483
本人がスマポ理解できてないってオチだろ
487:デフォルトの名無しさん
19/02/15 07:22:53.73 1DfV94Wg.net
>>480
組み込みが得意でポインタがわからない後輩
設定に無理がありすぎw
488:482
19/02/15 07:53:28.61 OZ8Dcboc.net
再び >>484 「-2112000 / 48000 の結果が 89434」 (間違いを訂正)
-2112000 の32bit16進数表現が 0xffdfc600
89434 * 48000 == 4292832000.000 == 0xffdf6b00
ビットパターン一致してないね。桁数多くて見間違えちゃった(テヘペロ)。
-2112000 を32bitで表現すると 0xffdfc600 であり、
これをゼロ拡張した 0x_0000_0000_ffdf_fc600 == 4292855330 を
48000 で割り算して小数部を捨てれば 89434 という答えが出る。
ということなら合ってるかな。
489:
19/02/15 07:57:48.46 8MeM2Ami.net
>>484
コードを URLリンク(ideone.com) に貼っていただけませんか?
490:デフォルトの名無しさん
19/02/15 09:49:31.73 tuwIijw4.net
>>484
どうせ48000がunsignedなんじゃねーの
それにつられて -2112000もunsignedになって4292855296
その結果が薬師美代ちゃん
491:デフォルトの名無しさん
19/02/15 13:45:38.25 TNDmXWGM.net
>>482
自分が何してるか判って使う分には問題無いな
適材適所だ
492:デフォルトの名無しさん
19/02/15 21:13:40.77 kkRd+/gL.net
>>483
>スマートポインタを使うとコード修正効かなくなる
どういう風に読むとそういう理解になるのか。。
まずは日本語の理解が必要だな。
493:デフォルトの名無しさん
19/02/17 07:14:37.91 KxX3tJEE.net
超初歩的な質問になるのですが
scanf関数を使って20個未満の任意の数だけ、数値を配列変数で受け取りたいです
たとえば「2 4 8 9」と入力し、Enterが押されたらそれで確定
num[0]=2
num[1]=4
num[2]=8
num[3]=9
としたいわけです。
どうしたらよいでしょうか?
一応自分で考えたコード(期待通りの動きをしません)を掲載します
for(i=0;i<20;i++){
scanf("%d",&num[i]);
if(num[i]==‘¥n’){
break;
}
}
494:デフォルトの名無しさん
19/02/17 07:30:35.53 a45/WyPQ.net
for(i=0;i<20;i++) if (scanf("%d",&num[i]) != 1) break;
495:デフォルトの名無しさん
19/02/17 09:09:16.12 uZDoAvc4.net
>>493
scanfや標準ライブラリの関数など、参考書とかで普通の使い方はわかると思うけど、細かい仕様をmsdnやmanコマンドで調べるようにするとかなり理解が広がると思うよ。
496:デフォルトの名無しさん
19/02/17 22:37:58.74 O/E0SKNM.net
中途半端なUI使うよりもcsvパーサーを作るかどっかからとってくるかすれば?
497:デフォルトの名無しさん
19/02/18 00:02:29.61 yZfkTbdS.net
autoってコンパイル遅くなりますか?
498:
19/02/18 00:59:53.43 aN2QSVsl.net
>>497
むしろ遅くなる方に振れるでしょうけれど、そんなのどうでもいいのでは?
499:デフォルトの名無しさん
19/02/18 01:22:44.39 c9cLPpQ7.net
autoって変数の型宣言の話だよね?
コンパイルは遅くなるのか
速くしたい時はどうすりゃ良いの?
500:はちみつ餃子
19/02/18 01:27:51.06 ViRlfcsh.net
C++ の auto は右辺と一致させるように推論するだけの単純機構で、
ややこしい演算で推論するわけではないので、
コンパイル速度ではほとんど差はないと思うよ。
501:デフォルトの名無しさん
19/02/18 01:30:04.86 tKsXQ0K5.net
autoはむしろコンパイル速くなるんじゃない?
いちいち型を解決せずとも、既に解決済みの型を右から左へコピーするだけでいいんだから
C++でコンパイルを速くするのは簡単で、単純にソースファイル数とインクルードするヘッダを減らせばいい
C++のコンパイルが遅いのは主にコンパイル単位という時代遅れで極めて非効率なコンパイル戦略に起因しており、実はコードの複雑さ自体はわりとどうでもいい
502:
19/02/18 01:31:11.50 aN2QSVsl.net
>>499
C++を言語として選択した時点で「記述の時間やコンパイル時間を投資して実行時間を稼ぐ」という思想なのでは?コンパイル時間を短くする努力はする気がないと思います
503:
19/02/18 01:32:21.67 aN2QSVsl.net
>>501
>いちいち型を解決せずとも、既に解決済みの型を右から左へコピーするだけ
この記述はコンパイル時を想定しているの?それとも実行時を想定しているの?
はっきりさせたいので念のために確認します
504:デフォルトの名無しさん
19/02/18 05:41:12.34 KTgkm+s5.net
>>493 サーバーの 503 エラーに引っかかって昨日のうちに書けなかったんだが…。
>>494 の方法だと Enter が単純に読み捨てられて scanf() が終了せず
まだ入力をよこせと言ってくるからダメみたいね。
11 22 33 (Enter) だと読み込みが継続、期待通りに動作しない
11 22 33 x (Enter) なら x を解釈する時点で scanf() が 0 を返してループ脱出
先に文字列として1行読み込んで sscanf() と思ったけど…
ndat = sscanf(s, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d",
&num[0], &num[1], &num[2], &num[3], &num[4], &num[5], &num[6], &num[7], &num[8], &num[9],
&num[10], &num[11], &num[12], &num[13], &num[14], &num[15], &num[16], &num[17], &num[18], &num[19]);
実際に読めた値の個数は ndat に入る。
これは書くのもメンテナンスするのも嫌だなぁ。
strtol() で1個ずつ数値を拾いつつ、地道にポインタ進める方が良いかも。
505:デフォルトの名無しさん
19/02/18 05:53:27.02 KTgkm+s5.net
>>503 自分は >>501 の人じゃないけど。
ごく簡単な場合ながら、例えば
int val_a = func(para); // func() がint互換の値を返すかチェックが必要
auto val_b = func(para); // func() の返す型そのまんまで val_b を作ればいい
てな具合に考えると auto で定義した方がコンパイル時の手間が少ない、
という考え方にも一理あるかと。
506:デフォルトの名無しさん
19/02/18 08:39:38.41 KTgkm+s5.net
瑣末なことだけど val_a, val_b って変数名は良くなかったね。
変数 variable の例なんだから var_a, var_b だわな。
というか、この場合は a, b で十分だ。
507:デフォルトの名無しさん
19/02/18 10:06:03.91 PGieQvh3.net
まず計測しろよ
508:491
19/02/18 13:24:52.92 fHtoi1qq.net
>>504
ありがとう。ちゃんと確認してなかったわ。
タブに空白に改行はスキップしやがるんでしたか
別案としては fgets() ⇒ sscanf() になるんかな
509:デフォルトの名無しさん
19/02/18 13:29:17.97 fHtoi1qq.net
505の後半は無しで
1文字ずつ切り出して解析してったほうがよさそうね
510:デフォルトの名無しさん
19/02/18 15:27:41.58 bbNHvPxv.net
コンパイル時間にリンク時間は含まれますか?
511:デフォルトの名無しさん
19/02/18 15:28:58.14 bbNHvPxv.net
>>504
scanf は禁止
>>508 が正しい
512:デフォルトの名無しさん
19/02/18 15:34:26.17 c9cLPpQ7.net
人間の様な邪悪なものからの入力でscanfは使うなと、ばっちゃは言ってた
513:
19/02/18 20:54:12.82 aN2QSVsl.net
>>505
>func() の返す型そのまんまで val_b を作ればいい
この発想は実行時なのでは?
>てな具合に考えると auto で定義した方がコンパイル時の手間が少ない、
実行時の発想をコンパイル時に適用していいのでしょうか?
514:
19/02/18 20:54:41.05 aN2QSVsl.net
>>507
コンパイル時間を計測するのですか?…
515:
19/02/18 20:57:23.82 aN2QSVsl.net
>>512
賛成です、そういうのは1ラインを秘術を尽くして何とか読み込み、後で sscanf() とかを使うべき
516:デフォルトの名無しさん
19/02/18 21:15:24.03 JRPNr6+t.net
>>515
今回の例(>>493) のように可能な限り %d で抜き出して打ち切るとなると sscanf 単発では面倒
なんとか行単位でバッファに詰めた後
連続空白などでトークンに区切ってそのトークン単位で sscanf をぶんまわすような
ほのかな中途半端感が
517:デフォルトの名無しさん
19/02/18 21:20:31.62 etvvcICH.net
>>513
別に実行時の発想じゃないでしょ
型を書けばコンパイラはその型名に対応する型を解決しなければならないし、
型変換の要否や可否のチェックも必要
518:
19/02/18 23:19:20.43 aN2QSVsl.net
>>517
>型変換の要否や可否のチェック
これは10中8, 9 コンパイル時にすることなのでは?
519:デフォルトの名無しさん
19/02/18 23:37:20.44 Q29xkQ9H.net
>>518
初めからずっとコンパイル時間の話をしている。お前さんだけ噛み合ってないから、もう黙っててくれ。
520:デフォルトの名無しさん
19/02/19 15:32:09.41 Hz70ZqtS.net
C++です
インクルードガードがあっても関数の定義がヘッダに書かれていればヘッダが複数回読み込まれていた場合リンク時に多重インクルードでエラーが出る
ここまではわかるのですが、同じことをクラス関数で実験した結果エラーになりませんでした
具体的にはヘッダのクラス内に関数定義を書いて複数のファイルからインクルードしました
これはどういうことなのでしょうか?
521:デフォルトの名無しさん
19/02/19 16:00:36.20 uP1odnYQ.net
>>520
クラス定義の中に書かれたメンバ関数の定義は
自動的にインライン関数になる(関数の実体の定義ではない)
この場合は、複数の場所にメンバ関数の実体が作られるわけじゃない、
という説明でどうかな。
522:
19/02/19 17:19:54.69 BVj1SDNF.net
>>519
そもそも「実行時」「コンパイル時」の区別がついていないのでは、コンパイル時間の話なんかできないのでは?
だから「実行時」「コンパイル時」どちらを適用するかに執着しているだけです
523:デフォルトの名無しさん
19/02/19 17:23:21.85 Hz70ZqtS.net
>>521
なるほど
クラス内に定義を書くとインライン関数になって普通の関数としては扱われないんですね
もう少し理解するために調べたのですが、インライン関数は内部リンケージのみを持つものとしてコンパイラに解釈されるらしいですね
だからコンパイラはファイル間での関数の重複を調べようとしない
そしてインクルードによって複数のファイルで同じものを読み込んだとしてもエラーにはならないと・・・
理解です
勉強になりました
ありがとうございました
524:502
19/02/19 17:39:36.16 uP1odnYQ.net
失礼、なぜか >>513 を見逃してて(黙殺するような意図はまったくなかった)。
C++ は関数を宣言・定義するときに返り値型を書くから
auto で受けてもコンパイル時に曖昧さは生じないと考えたんだけど。
実行時まで返り値の型が決まらない関数って作れるんだっけ?
これは純粋に質問、教えを乞いたい。
あんまり高度な話だと振り落とされるかも知れないけど。
525:デフォルトの名無しさん
19/02/19 17:48:52.81 h1wI7nx1.net
型推論が実行時に行われるとかトンチキこいてるやつが一人騒いでるだけ
526:デフォルトの名無しさん
19/02/19 18:43:18.16 +3biNeIC.net
>>524
おそらく君の書いた「func()の返す型~」をqz某が勝手に勘違いしているだけだからスルーしていいよ。
初心者が必ずしも正確な用語を使わないことくらい想像つくだろうし、文脈からして普通ならそんな勘違いはしないはずなのだが。
527:はちみつ餃子
19/02/20 00:20:40.27 C98K3aY7.net
>>524
出来ない。
強いて言えば C++17 からは std::any があるけれど、
これはこれで実行時に型が決まるわけではなくて
コンパイル時に std::any 型であることは確定する。
528:デフォルトの名無しさん
19/02/20 00:28:15.76 qDW9CRq2.net
>>523
> もう少し理解するために調べたのですが、インライン関数は内部リンケージのみを持つものとしてコンパイラに解釈されるらしいですね
どこにそんな嘘書いてあった?
URLリンク(timsong-cpp.github.io)
> The inline keyword has no effect on the linkage of a function.
529:デフォルトの名無しさん
19/02/20 00:47:02.04 rsRaa5eC.net
>>528
IBMのサイトに書いてありました・・・
と思って今見返したらこれはIBMの統合開発環境のページなのでその開発環境の仕様かもしれないですね
失礼しました
URLリンク(www.ibm.com)
>インライン関数は内部リンケージを持っているものとして処理されるので
530:デフォルトの名無しさん
19/02/20 09:09:52.38 qDW9CRq2.net
>>529
「C のみの始まり」~「C のみの終わり」で囲まれているとおり、それはCの仕様だね。
531:
19/02/20 19:50:21.82 P8vN2pc3.net
>>528
それは inline キーワードで束縛された関数は、inline 展開される多数の実体と、外部リンケージによって外部からコールできるものとで別の実体をコンパイラは作成する、ってことですか
まあ inline しまくって無駄にバイナリーを増やすくらいだったら、ついでに1 個の外部リンケージで呼べる実体を追加したって、いろいろな面で大差がない、とはいえますね
532:デフォルトの名無しさん
19/02/21 01:44:35.45 HXHB3ZEN.net
>>531
「それ」が何を指して言ってるのかよくわかんないけど、 inline 関数に対して
インライン展開されてない「実体」を生成するのもしないのもコンパイラの自由。
外部リンケージを持つ関数について複数のコンパイル単位でアドレスを取って
==, != で比較した場合には一致させないといけないので、アドレスを取られた場合には
そういうコード生成をするのが一般的だろうとは思う。
533:デフォルトの名無しさん
19/02/21 14:52:33.25 68lFGCx0t
主にc++でJSON editor作ってみた mac専用だけど
URLリンク(www.quite-funny.com)
534:デフォルトの名無しさん
19/02/22 22:57:05.70 LZ/mWRas.net
引数や関数にはconstつけられるところは全部つけるべきですか?
535:デフォルトの名無しさん
19/02/23 00:51:14.65 CdF18mGW.net
つけて問題ないならつけるべきだけど、まあ実際は面倒くさくなければという程度…
536:デフォルトの名無しさん
19/02/23 10:37:02.21 6erMuDJl.net
>>534
内部で書き換えないポインタや参照の引数には必ずconstをつけるべき。より自己文書化されるし、付けてないと使う側の手間が増える。>>535は元javaプログラマ
537:デフォルトの名無しさん
19/02/23 10:39:40.19 Iy1q86mj.net
今は良いけど、半年後の自分は既に他人だと思わないと
538:デフォルトの名無しさん
19/02/23 11:45:29.73 +DV3f+Dk.net
const連鎖まんどくせ
539:デフォルトの名無しさん
19/02/23 12:40:33.73 aRr2CtyI.net
530みたいな質問する奴はそもそもconst気にする前に関数が長すぎたり
参照と実値渡しの違いもわかってないと思われるのでその辺をしっかりやった方が良い。
540:デフォルトの名無しさん
19/02/23 17:32:16.44 7GKXwuwj.net
入門書の類が、最初のうちは const なしで説明しておいて、
本の後半でおもむろにポインタの引数に const つけることを
載せてたりするせいかもな。
高度な、マニアックな話題みたいな感じで。
文字列(charへのポインタ)を受け取る関数を紹介したら、
すかさず const char* の説明も合わせてすべきって気がする。
const の一般的な価値が分かれば、メンバ関数での func() const {...} の
ありがた味もすぐ飲み込めて const つけまくり派になるでしょ。
541:デフォルトの名無しさん
19/02/23 21:02:55.45 kvfLWeS8.net
戻り値を const char* してても、
char* const してなければさほど意味がない。
542:デフォルトの名無しさん
19/02/23 21:20:57.14 JpeZVvP/.net
それは質問なの初心者君?
543:デフォルトの名無しさん
19/02/23 23:45:27.99 Z+wYSHT9.net
クソミソみたいなjavaのconstと違ってC++のconstは
コードの安全性を高めるのに必須といっていいぐらいのキーワード
とりあえず片っぱしから全部const付けて、どう頑張ってもここは
constはずさないと動くコードにできないよな・・ていうぐらいの
時だけはずす。このぐらいの気構えでコードを書けば、かなり安全な
コードになってる。他のやつが書きかえちゃダメなものをいじろうと
しても、強引なキャストでもしない限りどうやってもコンパイルが
通らなくなる。強引なキャストしてでも無理矢理強姦してくる強姦魔は
そもそも犯罪者気質なのでそんなやつに仕事をやらせてる時点で間違い
544:デフォルトの名無しさん
19/02/23 23:48:50.01 Iy1q86mj.net
「かなり安全な」
ここで思わず笑ってしまったではないか
545:デフォルトの名無しさん
19/02/24 00:00:52.25 qLJosHl4.net
残念ながらバカはmutable使い出すから無意味。
546:デフォルトの名無しさん
19/02/24 00:06:41.22 2wDVhIfR.net
俺は書換られたりはしない たぶんしないと思う
しないんじゃないかな ま、ちょっと覚悟はしておけ
547:デフォルトの名無しさん
19/02/24 00:47:53.06 ORSkBdqU.net
constっていちいち書くのめんどい
548:デフォルトの名無しさん
19/02/24 00:48:50.68 haqs87u6.net
>>541
何を言ってるのか分かりません
549:デフォルトの名無しさん
19/02/24 01:15:50.47 is7scwjD.net
いやまてまて・・このスレの99%はネタでできてるけど
そこ分からないのはダメだぞ
まさに初心者向けの話題ではある
550:デフォルトの名無しさん
19/02/24 07:21:28.17 kwD2lttR.net
>>545
mutable使ったらいかんのか
551:デフォルトの名無しさん
19/02/24 08:50:14.25 FFCpIhtq.net
こいつ能力低いなと思う奴のソースを見ると、
constなんて全く付いていない場合が多い
552:デフォルトの名無しさん
19/02/24 09:00:44.87 eyx8DEIH.net
>>547
ちょっとわかるわw
あと3文字くらいが良かった
553:デフォルトの名無しさん
19/02/24 09:02:28.69 zE1f0a65.net
cnst
554:デフォルトの名無しさん
19/02/24 09:40:01.37 4ommn3XM.net
constはキーボード入力の観点からはそんなに苦じゃない
stdとかarrayが割りと入力しづらい
左右均等に割り振られてると楽な感じ
555:デフォルトの名無しさん
19/02/24 09:57:22.91 FGRIaiAP.net
const char* a = "hoge";
const char* const a = "hoge";
の違いがわからんやつは死ねとよい
556:デフォルトの名無しさん
19/02/24 10:22:22.64 qLJosHl4.net
そんな違いを意識しないと読めないコード書く方がバカだと思う。
557:デフォルトの名無しさん
19/02/24 10:24:20.55 eyx8DEIH.net
(そんな初歩中の初歩でマウンティングドヤ顔して大丈夫っすか先輩)
558:デフォルトの名無しさん
19/02/24 10:37:36.70 haqs87u6.net
>>549
>>548のこと言ってるの?
>>541は、ポインタの指し先だけでなく、戻り値を格納する変数自体を定数にしなければさほど意味がないっていう主張だと理解したけど、合ってる?
ローカル変数を定数化したければ呼び出し元が勝手にやればいいし、戻り値をconst char*にする重要性に比べたらそれをする必要性なんてごく僅かで"さほど意味がない"なんてとても言えないと思うけど
559:デフォルトの名無しさん
19/02/24 12:08:33.20 6sZPiHms.net
>>555
ドヤ顔して噛むなよ
560:デフォルトの名無しさん
19/02/24 12:15:09.98 sIV9Z0cV.net
C++ってC言語の負の遺産を引き継いだ言語だろ?
constは廃止すべき
561:デフォルトの名無しさん
19/02/24 15:05:59.28 uFOuUY9d.net
constみたいな糞どうでもいい些末なことより
配列のサイズとオーバーフローの管理を強化するべきだったんだよ
互換性捨てなきゃならんが
562:デフォルトの名無しさん
19/02/24 15:35:26.16 2tRfk65D.net
>>561
そこはCの負の遺産を引き継いだのではなく、可能な限り実行時オーバーヘッドを小さくする実装手段を提供するというCの基本スタンスを継承しただけだろう。それが負の遺産というなら他の言語の方が適切なんだからそれを選択すればいいよ。
C++を使いたく、ある程度の実行時オーバーヘッドが許容できるときはstd::vectorという選択肢があるけど、それじゃダメなのか?
563:デフォルトの名無しさん
19/02/24 16:47:00.15 RgZ/0jGo.net
>>560
const に関しては C++ で新規導入された仕様を ANSI C に逆輸入、
みたいな感じじゃなかったっけ?
そのせいか、定数としてconst変数を使えないとか中途半端になってる。
C++ が C の負の遺産を切り捨てるべきだったとしても、
const はその「C の負の遺産」の範疇に含まれないかと。
いずれにせよ、今さら言っても、現に存在する C++ はどうもならんよね。
そういう新プログラミング言語が出ても、それは C++ じゃない別物ってことで。
564:デフォルトの名無しさん
19/02/24 16:57:30.90 2fcQjxFq.net
そういうのはDで良いと思う
565:デフォルトの名無しさん
19/02/24 17:18:54.78 NUlc6EOn.net
とりあえず数値以外はconst参照渡しが基本でおk?
566:デフォルトの名無しさん
19/02/24 17:34:26.40 qxqTarkR.net
>>561
at()使え。
>>560
constが負の遺産とか頭おかしい。
ドキュメントにこの変数は内部で変更しませんとか書くよりよっぽど楽だろ
567:はちみつ餃子
19/02/24 17:36:09.20 gUJTdPsI.net
>>566
負の遺産だよ。
const キーワードを廃止して
デフォルトの挙動を const に出来れば
どれほど良いことか。
という意味で。