- 1 名前:デフォルトの名無しさん mailto:sage [2020/01/31(金) 20:54:06.26 ID:Nt0XFA2s.net]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part147 https://mevius.5ch.net/test/read.cgi/tech/1576659413/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.105【環境依存OK】 mevius.5ch.net/test/read.cgi/tech/1556142878/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語)
- 250 名前:デフォルトの名無しさん mailto:sage [2020/02/03(月) 00:38:27 ID:e9E2NTEb.net]
- その問題だけなら
2次キャッシュに収まるくらいに分けてふるえば速い 間隔も大して大きくならないので ヒストグラムはオンメモリで済む スレッドも簡単に分割出来るので 論理コア数と同じだけスレッドを作って回す
- 251 名前:◆QZaw55cn4c mailto:sage [2020/02/03(月) 00:44:34 ID:X2PbBOAI.net]
- >>246
コメントありがとうございます >間隔も大して大きくならないのでヒストグラムはオンメモリで済む 確かに 10^10 まででも最大 354 というのには驚きました、案外密に分布しているんですね >2次キャッシュに収まるくらいに分けてふるえば速い constexpr unsigned int windowSize_Default = 30 * 5000000; はでかすぎ、ですか いただいたアイディアは、どれも私には難易度が高いのですが、ぼちぼち書いていきます…
- 252 名前:デフォルトの名無しさん mailto:sage [2020/02/03(月) 00:44:55 ID:e9E2NTEb.net]
- AVXレジスタを使って小さな素数の倍数を消して
ビット命令で大きな素数の倍数を消す 大きな素数の倍数は210ずつ処理する 昔素数の数を数えるプログラムを書いたことがあって 記憶に残ってる範囲ではこんな感じ
- 253 名前:デフォルトの名無しさん mailto:sage [2020/02/03(月) 00:55:53 ID:jdU9ROmC.net]
- >>229
100 WIDTH 80,25:CONSOLE 0,25,0,1:SCREEN 1:CLS 3 110 XXX 120 XXX 130 IF XXX = XXX GOTO 110 のようなもので、最初に入れるときは自分で行番号も手で打つのが基本ではありました。 115 YYY と入れると、110と120の間に行が挿入されると言う仕組みです。 それだと9個以上は挿入できなくなるので RENUM 命令を使うと行番号を自動的に 振り直すことができました。その場合、GOTOやGOSUBの行番号も連動して変わる 仕組みです。
- 254 名前:◆QZaw55cn4c mailto:sage [2020/02/03(月) 00:55:55 ID:X2PbBOAI.net]
- >>248
コメントありがとうございます! >大きな素数の倍数は210ずつ処理する 私は、2*3*5 = 30 でわりと満足していましたが、2*3*5*7=210 まで拡張されたのですか!?うーむ…
- 255 名前:◆QZaw55cn4c mailto:sage [2020/02/03(月) 00:57:46 ID:X2PbBOAI.net]
- >>249
mon に入って、プログラムタイトルのコメントの行番号を手打ちで全部 0 にする、とか… どうでもいい話でごめんなさい…
- 256 名前:デフォルトの名無しさん mailto:sage [2020/02/03(月) 01:52:57 ID:YoBHNt10.net]
- 素数は、6n ± 1 か。
6n + 1, 6n + 5 だけ 6n + 3 は、3の倍数だから、素数じゃない
- 257 名前:252 mailto:sage [2020/02/03(月) 01:58:12 ID:YoBHNt10.net]
- A = 6n + 1, B = 6n + 5 とすると、
AA の並びなら、差は6 AB なら、4 BA なら、2 BB なら、6 A,B になる確率がランダムとすると、6 になる確率が2倍!
- 258 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/03(月) 11:14:43 ID:HBzF0G80.net]
- >>242
たぶんこの一文。 > A joint file position is maintained for both the input sequence and the output sequence. N3337 だと 27.9.1.1 の第 3 段落にある。 あくまでも std::basic_filebuf ではそうなってるってだけなので、 ストリームバッファ全般に言えるわけではなくて、 独立した位置情報を持つようなものも作れないわけではない。 FILE の fseek のラッピングとして実装することを想定したんじゃないかなぁ。
- 259 名前:デフォルトの名無しさん mailto:sage [2020/02/03(月) 12:59:28 ID:jOrmfTQL.net]
- >>250
ビット命令が48個続くだけ それほど大変じゃない 今だともっと
- 260 名前:良い命令があるかも []
- [ここ壊れてます]
- 261 名前:◆QZaw55cn4c mailto:sage [2020/02/03(月) 20:59:04 ID:X2PbBOAI.net]
- >>254
コメントありがとうございます。いまいちよくわかっていない iostream. の全体像を掴めるよう、いただいたヒントも頼りに潜ってみます >FILE の fseek のラッピングとして実装することを想定したんじゃないかなぁ。 fseek() が 64bit オフセットならいいのですが あるいは win32api::SetEndOfFile() のような、オフセットを指定して trunc する方法があればいいのですが >>242 のバイナリファイルは単に uint64_t な素数を突っ込んでいるものですが、ある日末尾が中途半端にちょん切れてしまったのです…
- 262 名前:デフォルトの名無しさん mailto:sage [2020/02/03(月) 21:17:59 ID:Exvuz9nd.net]
- >>256
それファイルに書く必要ある? 仮想メモリ頼りにメモリでやれば?
- 263 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/03(月) 21:26:54 ID:HBzF0G80.net]
- >>256
巨大なファイルにちょくちょくシークしながらアクセスするなら メモリマップトファイルを使った方が楽やで。
- 264 名前:はちみつ餃子 mailto:sage [2020/02/03(月) 22:20:22.51 ID:HBzF0G80.net]
- >>256
ググってみたら iostream まわりの継承関係を表した図がすぐ見つかったわ。 https://www.ntu.edu.sg/home/ehchua/programming/cpp/cp10_IO.html だけど継承関係の他にストリームがバッファとロケールを所有しているという関係もあるのが分かり難いかも。 cpprefjp の rdbuf の項目を見たらストリームのバッファを入れ替える例が載ってる。 https://cpprefjp.github.io/reference/ios/basic_ios/rdbuf.html 本当に「入出力」を司っているのはバッファであって、 ストリームはそれに書式化の機能をかぶせている感じ。
- 265 名前:◆QZaw55cn4c mailto:sage [2020/02/05(水) 22:01:06 ID:uTOW/8lH.net]
- >>257
それはダメでした。win7, 16GB、素数の大きさが10^11 程度でスラッシングが発生して win7 では使い物になりません GIMPS cli のように、普段は意識することなく3年くらいかけて計算するようにしたいです >>258 着々と容量が増加するファイルに対して mmap は使えるのですか?win32api::CreateFileMapping では mmap を確立した後にファイルサイズを増やしてはいけない制限がありました
- 266 名前:デフォルトの名無しさん mailto:sage [2020/02/05(水) 22:31:00 ID:zWcxLf4u.net]
- 最初から最大ファイルサイズにしとくとか
- 267 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/05(水) 22:32:01 ID:85RuEno5.net]
- >>260
そんな制限があるんか。 連続した巨大なメモリを予約しておいて、 適当な大きさに区切ってファイルにマッピングすればええで。 ファイルを複数に分けることになるけど、 見かけ上は巨大なメモリとして扱えるし、 容量が増加する都度に新しいファイルを作って割り当てればええ。 というやり方を思いついたので具体的に出来るんかいなと思って調べてみたら MapViewOfFileEx の最後の要素でアドレスを指定する機能がある。 VirtualAlloc で予約した範囲は MapViewOfFileEx で使えないので、 どうやって空いているメモリ空間を探せばええんやろと思ったら VirtualAlloc で予約した直後に VirtualFree をつこうたらええんやて。 https://stackoverflow.com/questions/12121843/mapviewoffileex-valid-lpbaseaddress なんという泥臭い方法や……。 てなわけで、若干の面倒くさい手順が要るけどそれっぽいことは出来る。 この手順をいい感じに抽象化するクラスを作ったら色々と使えそうやな。 期待してるで!
- 268 名前:デフォルトの名無しさん mailto:sage [2020/02/05(水) 22:35:23 ID:bIRSo9XQ.net]
- 普通にAPIで巨大ファイル作れてるけど
CreateFile / WriteFile
- 269 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/05(水) 22:50:53 ID:85RuEno5.net]
- 最初からどでかいファイルを作る余裕があるならその方が簡単で
- 270 名前:はあるわな。
どんくらいデカいのがいるんや? せいぜい数十ギガとかそんなもんやろ? ケチらんと行くっちゅうのもアリや。 [] - [ここ壊れてます]
- 271 名前:デフォルトの名無しさん mailto:sage [2020/02/05(水) 23:33:50.77 ID:bIRSo9XQ.net]
- CreateFile
WriteFile ReadFile SetFilePointerEx SetEndOfFile
- 272 名前:デフォルトの名無しさん [2020/02/06(木) 13:03:55.59 ID:sNihMBVC.net]
- こんな感じ?
.... 0101 0000 0100 0101 0001 0100 0101 0110
- 273 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 16:50:43 ID:zCd4f5nI.net]
- STLコンテナ (仮にvとする) のサイズの分だけfor文を回したいってときに
for(int i=0; i<v.size(); i++) と書くことが多いんだが、v.size()はintじゃないので警告が出る。 警告を一つ残らず潰したいタチだから毎回こういうのはintにキャストしてるんだが、キャストのコストってどんなもんなんだろ。 「大したことないからOK」って立場と「そもそもv.size()が毎回呼ばれてる時点でナンセンスだから改善すべき」って立場と「その警告は無視しなさい」って立場などがあると思うが、皆はどうしてる? 逆順にしたいことなどがよくあるので、範囲for文を使えってのは今回はナシで。 特定の環境、コードでのテストはできるが、一般論として、あるいは皆さんのスタンスとしてはどうですか。
- 274 名前:デフォルトの名無しさん [2020/02/06(Thu) 17:11:56 ID:v+RXRHu+.net]
- コンパイルの警告のためだけだから
実行時コストは0じゃね
- 275 名前:デフォルトの名無しさん [2020/02/06(Thu) 17:13:00 ID:v+RXRHu+.net]
- 手でタイプするコストうんぬん言うなら
マクロで #define LEN(s) ((int)s.size())
- 276 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/06(Thu) 17:18:31 ID:jSrTrJa0.net]
- >>267
最も正統派なのはこうかな? for(decltype(v)::size_type i=0; i<v.size(); i++) 常識的に考えてコンテナの size_type が std::size_t より大きいことはあまりない (大抵は等しい) と思うので、面倒なときは std::size_t を使う。 本当に上限が限られていてその上限が変更されることがあり得ないほどそのプログラムにとって 本質的なものだと判断すれば int でいいやってこともあるといえばあるだろうし、 同じようなパターンが何度も現れるならアダプタを作った上で範囲forというのも考えられる。 状況によるでしょ。
- 277 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 17:24:46 ID:2fVM4odH.net]
- int i = 0; と書かずに size_t i = 0; と書くのはどうだい?
v.size() が本当に size_t を返すか、という問題はあるが。 for (decltype(v.size()) i = 0; i < v.size(); i++) と書くこともできるね。 i の型が int でないと不味いのかも知れんけど。
- 278 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 17:39:05 ID:/W9iMVJD.net]
- >>267
コスト(性能)最優先か 見やすさ最優先か タイプ数最優先か 次第 キャストのコストって言うけど intとv.size()のサイズが違えば どのみち型変換する コンテナ使うような場所でこんな微妙なコストを気にしてもしょうがないし >>270は面倒 (業務外だと)私は警告放置が多い 警告を消したい場合はsize_tにするか コンパイラの設定を変えるか 業務で集団でのコーディングの場合は 他の部分を見て空気を読む
- 279 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 17:43:47 ID:/W9iMVJD.net]
- >>269は色々な理由で無い
- 280 名前:デフォルトの名無しさん [2020/02/06(Thu) 17:44:41 ID:v+RXRHu+.net]
- for(unsigned int i=0, len=v.size(); i<len; i++)
これもよく見るか
- 281 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 17:46:58 ID:5ihPHl5F.net]
- auto i=0uにしてるな
- 282 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 17:48:08 ID:VEO7DUBt.net]
- >>269
template <typename T> inline auto len(T s) { return s.size(); }
- 283 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 17:48:51 ID:VEO7DUBt.net]
- あ、右辺値参照わすれたw わりーわりー
- 284 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 17:49:18 ID:/W9iMVJD.net]
- 警告を消す為だけなら設定を変えるのが良い
- 285 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 17:50:35 ID:/W9iMVJD.net]
- >>276
- 286 名前:何の解決にもなってない []
- [ここ壊れてます]
- 287 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/06(Thu) 17:54:27 ID:jSrTrJa0.net]
- >>279
良くはないがマクロよりはマシ
- 288 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 18:09:13 ID:3IyMYliq.net]
- >>274
その形が一番、速度的には良い。 forの第二式は毎回評価されるが、v.size()の部分をコンパイラが自動的に最適化するのは非常に難しい場合があるから。
- 289 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 18:11:29 ID:3IyMYliq.net]
- v.size()の値が、ループ内で変化しない「ループ定数」であると判断するのは
コンパイラにとってはものすごく難しい場合がある。 ループ定数であると判断された場合にのみ、>>274のような最適化が行われる可能性が出てくるが、判定できなければループするたびに毎回評価されてしまうのでループの実行速度が遅くなってしまう。
- 290 名前:デフォルトの名無しさん [2020/02/06(Thu) 18:30:55 ID:F7wYIGq0.net]
- マクロってそんなに危険なんですか。
- 291 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 18:33:27 ID:3IyMYliq.net]
- >>283
本人だけが開発していて、記憶力が優れていて絶対に使い方を間違いなければ特に問題ないと思うが、使い方を間違うと危険なことがある。 エラーも出ずに変な動作をしてしまうことがある。 でもそれさえ気を付けていれば特に問題ないとも言える。
- 292 名前:デフォルトの名無しさん [2020/02/06(Thu) 18:37:31 ID:3IyMYliq.net]
- >>269
マクロで書く場合、 #define LEN(_s_) ((int)((_s_).size())) と書いたほうが良い。 特に、s や _s_ を()で囲むのは必須。 sを_s_と書くのは、ミスタイプがあった場合の備え。 例えば、マクロの仮引数にsと書いているのに、マクロの定義部分をtと 書き間違えていて、かつ、マクロを使う場所に t という変数がたまたま使われて いたとすれば、エラーにならないのに間違った動作をしてしまう。 _s_と書いていれば、_s_という変数は絶対に使われないのでこの心配がない。 そのため、マクロの引数は伝統的に、_s_などのように書くことが推奨されている。
- 293 名前:デフォルトの名無しさん [2020/02/06(Thu) 18:50:57 ID:v+RXRHu+.net]
- バッドノウハウ紹介乙
>>285 >>276
- 294 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 19:30:05 ID:/W9iMVJD.net]
- >>280
適してるかどうかはともかく >>269は解決にはなってる >>276は解決になってない
- 295 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 19:38:40 ID:zCd4f5nI.net]
- 皆さんありがとうごさいます。
結構難しいですね。 >>274 > for(unsigned int i=0, len=v.size(); i<len; i++) これは for(int i=0, len=(int)v.size(); i<len; i++) としても性能上そう変わらないですよね? ループ変数はintであってほしいと思うので、これが自分には向いているように思いました。
- 296 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 19:42:58 ID:bk3hpXlE.net]
- >>275に一票
- 297 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 20:10:32 ID:9e+8kNR/.net]
- キャスト一回って機械語4つくらいじゃあないの?
そこまでシビアってのは競技プログラミングか脳手術ロボットでも作ってんの?
- 298 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 20:24:03 ID:/W9iMVJD.net]
- 4個もいらん
- 299 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 20:29:38 ID:/W9iMVJD.net]
- 糞コンパイラまで考えてパフォーマンスを考えると>>288だけど
そもそもコンテナ経由でアクセスする時点でそんな事は誤差 そのループに非常に時間がかかるなら ループ全体で最適化しないと
- 300 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 20:40:31 ID:3IyMYliq.net]
- >>290
同じBIT数やBIT数が少なくなる場合の整数型から整数型へのcastは、マシン語では0命令(命令が出力されない)。 高級言語では違う型でもマシン語レベルでは変わらないため。 BIT数が多くなる場合には、x86の場合は、movzx や movsx が使われる。
- 301 名前:デフォルトの名無しさん [2020/02/06(Thu) 20:41:12 ID:3IyMYliq.net]
- >>292
実際には、最適化が上手く行かないことも多いので差が出てくることは多い。
- 302 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 20:42:39 ID:3IyMYliq.net]
- >>293
つまり、符号無しや符号付の区別はマシン語ではないので C/C++言語で castしても高級言語レベルでの意味が変わるだけでマシン語レベルでは 何の命令も増えることはない。
- 303 名前:デフォルトの名無しさん mailto:sage [2020/02/06(木) 20:49:08.28 ID:VEO7DUBt.net]
- 素直にrange-based-for
これが出てきたことの影響のでかさがわかってないやつ多すぎ 禿4にはfor_eachを使う前にもっと適した関数を探せとあるが 本当にそうか自分の頭で考えろ
- 304 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 20:56:38 ID:/W9iMVJD.net]
- コストを気にしてる人に対してトンチンカン
- 305 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 21:03:18 ID:/W9iMVJD.net]
- 普通のコンパイラなら
コンパイル単位内の関数は一緒に最適化するので .size() の中で値を返してるだけなら ループの外に追い出してくれる ターゲットがPCなら気にするな それよりv[i]の方が重い
- 306 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 21:03:40 ID:VEO7DUBt.net]
- 何もわかってねえやつ
- 307 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 21:17:40 ID:X3a4Tx/S.net]
- 未だindexループよりrange-basedのほうが早い処理系がない件
>>298 v[i]が重いってどんなstlコンテナだよ
- 308 名前:◆QZaw55cn4c mailto:sage [2020/02/06(Thu) 22:12:04 ID:6P0xXhLK.net]
- >>267
>警告を一つ残らず潰したいタチだから ここまでは同感です >毎回こういうのはintにキャストしてるんだが、 私なら int i を unsigned int i にしますが
- 309 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 22:16:59 ID:cE8ku0Th.net]
- templete<typename T>auto LEN(const T& v)->signed T{return (signed T)v;}
- 310 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 22:22:15 ID:j/UITOXa.net]
- とりあえず大きい方に合わせとけば間違いないんだからsize_tでいいじゃん
そのvの要素が将来に渡って21億個を超えない保証がどこにある?
- 311 名前:デフォルトの名無しさん mailto:sage [2020/02/06(木) 22:45:07.03 ID:/W9iMVJD.net]
- >>300
整数のキャストに比べればはるかに重い そのレベルを気にするなら生ポ
- 312 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 22:53:37 ID:sigCaOr9.net]
- x86なら32bit命令使った方がバイナリ小さい
- 313 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 22:57:14 ID:sigCaOr9.net]
- >>304
vectorだと生ポと変わらんでしょ もちろん最適化前提で
- 314 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 23:03:20 ID:YUB/hFRs.net]
- >>300
range-basedはiterator c++のiteratorはindexが速くなる連続アドレスのコンテナならpointerと同じコンパイル結果になる indexアクセスがpointerより遅くないなら、それはコンパイラの最適化のお陰
- 315 名前:デフォルトの名無しさん mailto:sage [2020/02/06(Thu) 23:13:46 ID:/W9iMVJD.net]
- >>306
生ポと変わらなきゃ良いんだけど 変わるんだよ VisualStudioやチープなコンパイラだと いずれにしろここから先は 具体的な環境とループ回数やループの中身全体で考えないと意味がない なんせ1クロックレベルのことを気にしてるようなので 実はメモリアクセスが支配的で 他の最適化は全く意味がないとか
- 316 名前:デフォルトの名無しさん mailto:sage [2020/02/06(木) 23:20:09.64 ID:/W9iMVJD.net]
- SIMD命令 / DSP命令 / スレッド分け / GPU
他のループと合わせる / ループを分ける ループアンロール 依存性の削減 / 式変形 アルゴリズムの改善 キャッシュ化 / テーブル化 いろんな最適化がある
- 317 名前:デフォルトの名無しさん mailto:sage [2020/02/06(木) 23:45:25.65 ID:f00f0WlE.net]
- vectorの[]は定数時間
- 318 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/07(金) 01:10:19 ID:BIRgOLIs.net]
- ところで元々の質問の >>267 は整数の型が合わないのどのくらい気にする?
っていうのを「一般論として」聞いてるので、これに対しての選択肢を派閥系統樹形式にしてみた ├→ きちんと合わせる派 │ ├→ その環境で合ってれば良いよ派 (移植性は気にしない派) │ ├→ コンパイラの警告は潰す派 │ │ ├→ 理解しなくてもキャストで合わせるので十分派 │ │ └→ 警告される箇所は仕様の詳細を調べる派 │ └→ size_t とか size_type とか使え派 (言語仕様原理主義派) ├→ 問題がなければ気にしない派 │ ├→ 問題に気づかない派 (鈍感派) │ ├→ 実行コストに敏感派 │ │ ├→ 最適化はあてにする派 (モダン開発環境派) │ │ └→ 最適化はあてになんないよ派 │ │ ├→ 低レイヤ派 │ │ ├→ 老害派 │ │ ├→ 諦め派 │ │ └→ ベータ開発環境追いかけ派 │ └→ 状況と程度による派 (柔軟派) └→ えっ、それって駄目だったん? 派 ├→ 初心者派 └→ 無知派
- 319 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 02:51:26 ID:dGY
]
- [ここ壊れてます]
- 320 名前:48don.net mailto: >>278
業務外だと、とは書いてあるけど一応突っ込んでおくと もしそれがコンパイラの警告レベルを下げるとか小さい型へのキャストの警告を無くすとかなら それはバッドノウハウだよ、真似しないように [] - [ここ壊れてます]
- 321 名前:デフォルトの名無しさん [2020/02/07(金) 03:23:36 ID:yxrGSGnH.net]
- じゃあ俺、えっ、それって駄目だったん? 派でお願いします。
- 322 名前:デフォルトの名無しさん [2020/02/07(金) 03:50:27 ID:yxrGSGnH.net]
- テストの品質がすべてを決めるような気がしてきた。
- 323 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 03:57:04 ID:plErZoHk.net]
- >>311
わし、こうみえて「警告される箇所は仕様の詳細を調べる派」や その上で、問題なければ「状況と程度による派 (柔軟派)」に再度ブランチする派
- 324 名前:デフォルトの名無しさん [2020/02/07(金) 04:00:36 ID:yxrGSGnH.net]
- Boostは警告を無視する派、GoogleはMicrosoftの問題なので修正する予定はない派。
ってことは、警告だしっぱなしで構わないって事では?
- 325 名前:デフォルトの名無しさん [2020/02/07(金) 04:01:58 ID:yxrGSGnH.net]
- 目grepが難しいので、警告は消すしかないんだけど。
- 326 名前:デフォルトの名無しさん [2020/02/07(金) 04:04:17.66 ID:yxrGSGnH.net]
- 変数の大きさが変わると同じ値のビット表現が変わるのはしんどいので、符号が一番右端にあったほうが良かったんじゃないの。
右端ならビット表現が変わらない。
- 327 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 05:13:16 ID:zrCiCWWN.net]
- 型違い面倒だからautoにしても警告出るから何でやおもたらi=0でintだったでござる派
- 328 名前:デフォルトの名無しさん [2020/02/07(金) 06:00:43 ID:yxrGSGnH.net]
- HTMLにしろコンパイラにしろ、Microsoft案のほうが合理的と思うけどな。
規格は政治だよね。
- 329 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 06:42:07 ID:52vnIbYM.net]
- >>302
signed Tはできねえぞ std::make_signed_t<T>にしないと
- 330 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 06:57:58 ID:52vnIbYM.net]
- > コンパイラの警告は潰す派
キャストつーか、#pragmaを使ったりもするね もち、規格票で自分が悪いのかコンパイラのお節介かはっきりさせてからだけど
- 331 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 07:21:23 ID:9DO99WJ1.net]
- 基本的にはsize_tとかsize_typeとか使え派
面倒でもちゃんとやった方が後のテストや検証は楽なんだよ まあ無理だったり異様に面倒だったりする場合も現実的にはあるからそこは仕方ないけど
- 332 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 07:52:22 ID:+bDqT2Wz.net]
- i は int にしたいって言ってるんだから
ここの型をsize()に合わせたら キャストが他に移るだけ
- 333 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 08:31:14.28 ID:z6HtA7Ca.net]
- >>288
いえいえ
- 334 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 10:49:20 ID:/rNOv2pQ.net]
- >>298
vがグローバルなオブジェクトである場合や、ヒープから確保されたオブジェクトの参照型である場合、コンパイラには v.size() がループ定数であるかどうかを判定するのは難しいことが多い。 このスレでもグローバルに確保された構造体型のメンバを参照する場合、最適化され無い事が指摘されていたが、それと同じことが原因。 C/C++ではポインタや参照があるのでグローバル変数やグローバルなオブジェクトのメンバ変数が変化しないことをコンパイラが見極めるのが難しい。
- 335 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 10:52:27 ID:VWyX2qgb.net]
- for(auto i=v.size()+1; 0<len; --i)
for(auto i : my_range(v.size())
- 336 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 11:01:57 ID:52vnIbYM.net]
- reverse_iterator first(v.end()), last(v.begin());
for_each(first, last, [](auto& x) { cout << x; });
- 337 名前:デフォルトの名無しさん [2020/02/07(金) 11:41:09.54 ID:jtk/IwGo.net]
- 64bit/32bitまたぎできるソース汎用性を考えれば、負の数が必要ないなら size_tを使うのが最善でしょ。
- 338 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 12:00:59.89 ID:VWyX2qgb.net]
- size_tはunsignedなのがうざい
c言語初心者が決めただろこれ
- 339 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 12:07:12.14 ID:VWyX2qgb.net]
- あ、上にかいたやつ+1は間違いや
- 340 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 12:12:42.12 ID:52vnIbYM.net]
- ポインタ
- 341 名前:+ size_t == ポインタ
ポインタ - ポインタ == ptrdiff_t おかしいね [] - [ここ壊れてます]
- 342 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 12:33:14.78 ID:8FC0VQS8.net]
- >>326
仮に毎回アクセスしたとしてもv[i]の方が重い 毎回アドレスを計算して毎回メモリアクセスするわけで
- 343 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 12:48:40.15 ID:Nrn3Ov0h.net]
- indexにintはlp64環境だと怖すぎる
- 344 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 12:51:13 ID:cytAyAiU.net]
- そんなバカでかいインデックス作る方が怖い
- 345 名前:デフォルトの名無しさん [2020/02/07(金) 13:01:32 ID:jtk/IwGo.net]
- ファイルポインタは4GB越えが当たり前だし。
- 346 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 13:18:28 ID:8FC0VQS8.net]
- ばかでかいループをたくさん作るなら
性能を心配した方が良い 中身にもよるが、ほぼメモリアクセス時間になりかねない 帯域の無駄遣い ループをまとめるとか細切れにするとか キャッシュを有効に使う処理にしないと キャストのコストとか完全に誤差
- 347 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 13:30:18 ID:QoBXk/kf.net]
- メモリポインタも4GB超えは当たり前だしな
- 348 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 13:33:10 ID:52vnIbYM.net]
- 8086時代の苦しみを知っている人なら
リニアでないポインタやインデックスが どんなにウザいものかよく知っている 64bit空間なら64bitを使っとけって悪いこと言わないから
- 349 名前:デフォルトの名無しさん mailto:sage [2020/02/07(金) 13:45:59 ID:8FC0VQS8.net]
- ループの中身も知らないで良く言うね
int変換必須なら問題点の場所を移動させただけ
- 350 名前:デフォルトの名無しさん [2020/02/07(金) 13:58:09.08 ID:jtk/IwGo.net]
- 今日日4GB越えとかWindowsNT4.0サービスパックですか、と。
|

|