C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part147
https://mevius.5ch.net/test/read.cgi/tech/1576659413/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
探検
C++相談室 part148
■ このスレッドは過去ログ倉庫に格納されています
2020/01/31(金) 20:54:06.26ID:Nt0XFA2s
211デフォルトの名無しさん
2020/02/02(日) 16:20:03.66ID:gXxB23XL foobarやhogeを超える人気なダミー文字列を考えたほうがよほど建設的だぞ、君たち。
212デフォルトの名無しさん
2020/02/02(日) 16:35:55.51ID:SWo7Ruqh break 5; //C
GOTO 5 : REM BASIC
GOTO 5 : REM BASIC
213デフォルトの名無しさん
2020/02/02(日) 16:37:04.55ID:gkoi3ncl マジックナンバーがイヤなら
break break;
break break;
214デフォルトの名無しさん
2020/02/02(日) 16:50:03.80ID:DTIMfhpJ 関数で置き換える
引数がめんどうならラムダで置き換える
returnが多重breakの代わりになる
引数がめんどうならラムダで置き換える
returnが多重breakの代わりになる
215デフォルトの名無しさん
2020/02/02(日) 16:58:55.02ID:SWo7Ruqh >>214
多重ループを単一関数に書くって前提だね
多重ループを単一関数に書くって前提だね
216デフォルトの名無しさん
2020/02/02(日) 17:03:09.93ID:7b/FZYuN >引数がめんどうならラムダで置き換える ←New!
これは場合による
for (i=0; i<INT_MAX; i++) {
for (j=0; j<INT_MAX; j++) {
(何がしかの処理)
}
}
を
for (i=0; i<INT_MAX; i++) {
for (j=0; j<INT_MAX; j++) {
((何がしかの処理)を行うラムダ式fを定義)
f();
}
}
とするのではご利益が無いが、
((何がしかの処理)を行うラムダ式fを定義)
for (i=0; i<INT_MAX; i++) {
for (j=0; j<INT_MAX; j++) {
f();
}
}
とするのではラムダ式定義時点でループ内の変数を参照できないから場合によっては詰む
結局f()は引数がぞろぞろ並ばねばならない
これは場合による
for (i=0; i<INT_MAX; i++) {
for (j=0; j<INT_MAX; j++) {
(何がしかの処理)
}
}
を
for (i=0; i<INT_MAX; i++) {
for (j=0; j<INT_MAX; j++) {
((何がしかの処理)を行うラムダ式fを定義)
f();
}
}
とするのではご利益が無いが、
((何がしかの処理)を行うラムダ式fを定義)
for (i=0; i<INT_MAX; i++) {
for (j=0; j<INT_MAX; j++) {
f();
}
}
とするのではラムダ式定義時点でループ内の変数を参照できないから場合によっては詰む
結局f()は引数がぞろぞろ並ばねばならない
217デフォルトの名無しさん
2020/02/02(日) 17:05:11.10ID:+9zyTEwm218デフォルトの名無しさん
2020/02/02(日) 17:06:58.49ID:7b/FZYuN219デフォルトの名無しさん
2020/02/02(日) 17:15:36.03ID:SWo7Ruqh ジーオーティーオーというスペルでなければ
制御構造はそのままでいいと言うクソ論法
制御構造はそのままでいいと言うクソ論法
220デフォルトの名無しさん
2020/02/02(日) 17:52:12.55ID:mzCY/+E0 スレとはあまり関係ないんだけど、nodiscard属性を無視するにはどうしたらいいですか?
221デフォルトの名無しさん
2020/02/02(日) 17:59:47.60ID:MNdu0823 変数で受けといてその変数をガン無視すればいいんじゃないの
未使用変数の警告出るだろうけど
未使用変数の警告出るだろうけど
222デフォルトの名無しさん
2020/02/02(日) 18:00:14.37ID:mzCY/+E0 やってみます。
アリガト。
アリガト。
223デフォルトの名無しさん
2020/02/02(日) 18:11:02.03ID:o79zkFFu224デフォルトの名無しさん
2020/02/02(日) 18:13:54.31ID:mzCY/+E0 あと三日くらいしたらお前より出来るようになってるから。
225デフォルトの名無しさん
2020/02/02(日) 18:24:38.31ID:jpTipLln >>220
(void)func();
(void)func();
226デフォルトの名無しさん
2020/02/02(日) 18:28:22.08ID:x1m+isRG >>208
昔のBASICは、行番号を勝手に付けてくれていたのでgotoでもラベル名を考えなくて済んだのでとても便利だった。
昔のBASICは、行番号を勝手に付けてくれていたのでgotoでもラベル名を考えなくて済んだのでとても便利だった。
227デフォルトの名無しさん
2020/02/02(日) 18:30:04.52ID:x1m+isRG >>226
なお、アセンブラでは行番号がなかったのでラベル名を考える必要があったが、
意味のあるラベル名を考え出すのは大変だったので、分かり易い場所以外は、
多くの人が、lab1: lab2: lab3: のような連番を使う傾向があった。
なお、アセンブラでは行番号がなかったのでラベル名を考える必要があったが、
意味のあるラベル名を考え出すのは大変だったので、分かり易い場所以外は、
多くの人が、lab1: lab2: lab3: のような連番を使う傾向があった。
228デフォルトの名無しさん
2020/02/02(日) 18:30:14.15ID:mzCY/+E0230デフォルトの名無しさん
2020/02/02(日) 19:36:27.12ID:7b/FZYuN VB6には行番号は無かった
231デフォルトの名無しさん
2020/02/02(日) 20:26:55.80ID:GV9CDSqK みんなってc++で何を作ってるの?
ゲーム?
ゲーム?
232デフォルトの名無しさん
2020/02/02(日) 21:07:54.17ID:YP+sfqkD 何も作ってないやつがほとんどだろ
233デフォルトの名無しさん
2020/02/02(日) 21:15:29.52ID:GV9CDSqK すまん俺の聞き方が悪かったのかもしれん
最近プログラミングの勉強始めて、各言語の用途とか調べたんだけど、ここでも一応聞いてみたかったの
何を作ってるって言うより、どんな開発に携わってるかっていうのを聞きたかった
最近プログラミングの勉強始めて、各言語の用途とか調べたんだけど、ここでも一応聞いてみたかったの
何を作ってるって言うより、どんな開発に携わってるかっていうのを聞きたかった
234デフォルトの名無しさん
2020/02/02(日) 21:21:43.96ID:DTIMfhpJ テキストエディター
3Dモデラー
メーラー
3Dモデラー
メーラー
235デフォルトの名無しさん
2020/02/02(日) 21:25:09.08ID:vTjBAXNr 競技プログラミング
236デフォルトの名無しさん
2020/02/02(日) 21:39:16.36ID:GV9CDSqK アプリ開発にも使われるのかー
あざした
あざした
237デフォルトの名無しさん
2020/02/02(日) 22:06:04.81ID:mzCY/+E0 いまダブルアレイやってる。
238デフォルトの名無しさん
2020/02/02(日) 22:08:30.12ID:mzCY/+E0 検索はstd::setやstd::unorderd_setより速いけど、挿入が一桁遅い。
静的構築が速いというので、それもやってみたけど、2/3くらいにしかならなかった。
静的構築が速いというので、それもやってみたけど、2/3くらいにしかならなかった。
239デフォルトの名無しさん
2020/02/02(日) 22:10:09.36ID:mzCY/+E0 検索はstd::setの10倍くらい早いな。
240デフォルトの名無しさん
2020/02/02(日) 22:15:25.20ID:0Gqmr542 >>239
相談ができたらまた来い
相談ができたらまた来い
241デフォルトの名無しさん
2020/02/02(日) 22:54:22.23ID:mzCY/+E0 >>240
よろしくお願いします。
よろしくお願いします。
初学者的な質問です、よろしくお願いいたします。
バイナリーファイルを
std::fstream f;
f.open(filename, std::ios::in | std::ios::out | std::ios::binary);
でオープンし、同一ファイルのオープン中に
f.read(), f.seekg() でガンガン読むと同時に
f.write(), f.seekp() でガンガン書き込む
を試しているのですが、seekg(), tellg() と seekp() tellp() は名前は別でもあるにもかかわらず、実はファイルポインタの実体は両者で同一なのでは?
という疑いが発生しました。つまり、seekg()/tellg() と seekp()/tellp() とは独立でない、と推測しています
@この解釈で正しいですか?
Aこういうのは、C++ iostream レファレンスのどこを見て洞察するべきなのでしょうか?
実際のお題は相変わらずエラトステネスのふるいです https://ideone.com/6Ww9nq
バイナリーファイルを
std::fstream f;
f.open(filename, std::ios::in | std::ios::out | std::ios::binary);
でオープンし、同一ファイルのオープン中に
f.read(), f.seekg() でガンガン読むと同時に
f.write(), f.seekp() でガンガン書き込む
を試しているのですが、seekg(), tellg() と seekp() tellp() は名前は別でもあるにもかかわらず、実はファイルポインタの実体は両者で同一なのでは?
という疑いが発生しました。つまり、seekg()/tellg() と seekp()/tellp() とは独立でない、と推測しています
@この解釈で正しいですか?
Aこういうのは、C++ iostream レファレンスのどこを見て洞察するべきなのでしょうか?
実際のお題は相変わらずエラトステネスのふるいです https://ideone.com/6Ww9nq
>>231,233
私は今のところエラトステネスの篩にご執心、という体たらくです…
私は今のところエラトステネスの篩にご執心、という体たらくです…
244デフォルトの名無しさん
2020/02/03(月) 00:01:01.18ID:8riGTZSm エラトステネスのふるいで
なんでファイルのリードが必要?
なんでファイルのリードが必要?
>>244
結構昔から
http://www.asahi-net.or.jp/~KC2H-MSM/pbsb/pbsbm006.htm
にとても興味を持っていたのです、二つの隣り合った素数の差を「素数のギャップ」と呼ぶことにしたとき、
『素数のギャップが取りうる値の頻度。はじめは2、4が多いが、そのうち、6の方が多くなる。』
『6がチャンピオンの座を降りるのはいつか。』
『少なくとも 10^14 以下では6がトップであり、それ以降、いつ、6以外の数がトップになるかは、知られていない。』
10^14 までの数であっても全部、篩としてメモリに載せられないので、さてどうしたものかと思案中です、最終的には年スパンでずっと計算させ続けるのに耐えられるようにしたい、と
結構昔から
http://www.asahi-net.or.jp/~KC2H-MSM/pbsb/pbsbm006.htm
にとても興味を持っていたのです、二つの隣り合った素数の差を「素数のギャップ」と呼ぶことにしたとき、
『素数のギャップが取りうる値の頻度。はじめは2、4が多いが、そのうち、6の方が多くなる。』
『6がチャンピオンの座を降りるのはいつか。』
『少なくとも 10^14 以下では6がトップであり、それ以降、いつ、6以外の数がトップになるかは、知られていない。』
10^14 までの数であっても全部、篩としてメモリに載せられないので、さてどうしたものかと思案中です、最終的には年スパンでずっと計算させ続けるのに耐えられるようにしたい、と
246デフォルトの名無しさん
2020/02/03(月) 00:38:27.28ID:e9E2NTEb その問題だけなら
2次キャッシュに収まるくらいに分けてふるえば速い
間隔も大して大きくならないので
ヒストグラムはオンメモリで済む
スレッドも簡単に分割出来るので
論理コア数と同じだけスレッドを作って回す
2次キャッシュに収まるくらいに分けてふるえば速い
間隔も大して大きくならないので
ヒストグラムはオンメモリで済む
スレッドも簡単に分割出来るので
論理コア数と同じだけスレッドを作って回す
>>246
コメントありがとうございます
>間隔も大して大きくならないのでヒストグラムはオンメモリで済む
確かに 10^10 まででも最大 354 というのには驚きました、案外密に分布しているんですね
>2次キャッシュに収まるくらいに分けてふるえば速い
constexpr unsigned int windowSize_Default = 30 * 5000000; はでかすぎ、ですか
いただいたアイディアは、どれも私には難易度が高いのですが、ぼちぼち書いていきます…
コメントありがとうございます
>間隔も大して大きくならないのでヒストグラムはオンメモリで済む
確かに 10^10 まででも最大 354 というのには驚きました、案外密に分布しているんですね
>2次キャッシュに収まるくらいに分けてふるえば速い
constexpr unsigned int windowSize_Default = 30 * 5000000; はでかすぎ、ですか
いただいたアイディアは、どれも私には難易度が高いのですが、ぼちぼち書いていきます…
248デフォルトの名無しさん
2020/02/03(月) 00:44:55.23ID:e9E2NTEb AVXレジスタを使って小さな素数の倍数を消して
ビット命令で大きな素数の倍数を消す
大きな素数の倍数は210ずつ処理する
昔素数の数を数えるプログラムを書いたことがあって
記憶に残ってる範囲ではこんな感じ
ビット命令で大きな素数の倍数を消す
大きな素数の倍数は210ずつ処理する
昔素数の数を数えるプログラムを書いたことがあって
記憶に残ってる範囲ではこんな感じ
249デフォルトの名無しさん
2020/02/03(月) 00:55:53.66ID:jdU9ROmC >>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の行番号も連動して変わる
仕組みです。
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の行番号も連動して変わる
仕組みです。
252デフォルトの名無しさん
2020/02/03(月) 01:52:57.35ID:YoBHNt10 素数は、6n ± 1 か。
6n + 1, 6n + 5 だけ
6n + 3 は、3の倍数だから、素数じゃない
6n + 1, 6n + 5 だけ
6n + 3 は、3の倍数だから、素数じゃない
253252
2020/02/03(月) 01:58:12.48ID:YoBHNt10 A = 6n + 1, B = 6n + 5 とすると、
AA の並びなら、差は6
AB なら、4
BA なら、2
BB なら、6
A,B になる確率がランダムとすると、6 になる確率が2倍!
AA の並びなら、差は6
AB なら、4
BA なら、2
BB なら、6
A,B になる確率がランダムとすると、6 になる確率が2倍!
254はちみつ餃子 ◆8X2XSCHEME
2020/02/03(月) 11:14:43.40ID:HBzF0G80 >>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 のラッピングとして実装することを想定したんじゃないかなぁ。
たぶんこの一文。
> 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 のラッピングとして実装することを想定したんじゃないかなぁ。
255デフォルトの名無しさん
2020/02/03(月) 12:59:28.21ID:jOrmfTQL257デフォルトの名無しさん
2020/02/03(月) 21:17:59.99ID:Exvuz9nd258はちみつ餃子 ◆8X2XSCHEME
2020/02/03(月) 21:26:54.32ID:HBzF0G80259はちみつ餃子 ◆8X2XSCHEME
2020/02/03(月) 22:20:22.51ID:HBzF0G80 >>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
本当に「入出力」を司っているのはバッファであって、
ストリームはそれに書式化の機能をかぶせている感じ。
ググってみたら 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
本当に「入出力」を司っているのはバッファであって、
ストリームはそれに書式化の機能をかぶせている感じ。
261デフォルトの名無しさん
2020/02/05(水) 22:31:00.17ID:zWcxLf4u 最初から最大ファイルサイズにしとくとか
262はちみつ餃子 ◆8X2XSCHEME
2020/02/05(水) 22:32:01.15ID:85RuEno5 >>260
そんな制限があるんか。
連続した巨大なメモリを予約しておいて、
適当な大きさに区切ってファイルにマッピングすればええで。
ファイルを複数に分けることになるけど、
見かけ上は巨大なメモリとして扱えるし、
容量が増加する都度に新しいファイルを作って割り当てればええ。
というやり方を思いついたので具体的に出来るんかいなと思って調べてみたら
MapViewOfFileEx の最後の要素でアドレスを指定する機能がある。
VirtualAlloc で予約した範囲は MapViewOfFileEx で使えないので、
どうやって空いているメモリ空間を探せばええんやろと思ったら
VirtualAlloc で予約した直後に VirtualFree をつこうたらええんやて。
https://stackoverflow.com/questions/12121843/mapviewoffileex-valid-lpbaseaddress
なんという泥臭い方法や……。
てなわけで、若干の面倒くさい手順が要るけどそれっぽいことは出来る。
この手順をいい感じに抽象化するクラスを作ったら色々と使えそうやな。
期待してるで!
そんな制限があるんか。
連続した巨大なメモリを予約しておいて、
適当な大きさに区切ってファイルにマッピングすればええで。
ファイルを複数に分けることになるけど、
見かけ上は巨大なメモリとして扱えるし、
容量が増加する都度に新しいファイルを作って割り当てればええ。
というやり方を思いついたので具体的に出来るんかいなと思って調べてみたら
MapViewOfFileEx の最後の要素でアドレスを指定する機能がある。
VirtualAlloc で予約した範囲は MapViewOfFileEx で使えないので、
どうやって空いているメモリ空間を探せばええんやろと思ったら
VirtualAlloc で予約した直後に VirtualFree をつこうたらええんやて。
https://stackoverflow.com/questions/12121843/mapviewoffileex-valid-lpbaseaddress
なんという泥臭い方法や……。
てなわけで、若干の面倒くさい手順が要るけどそれっぽいことは出来る。
この手順をいい感じに抽象化するクラスを作ったら色々と使えそうやな。
期待してるで!
263デフォルトの名無しさん
2020/02/05(水) 22:35:23.33ID:bIRSo9XQ 普通にAPIで巨大ファイル作れてるけど
CreateFile / WriteFile
CreateFile / WriteFile
264はちみつ餃子 ◆8X2XSCHEME
2020/02/05(水) 22:50:53.65ID:85RuEno5 最初からどでかいファイルを作る余裕があるならその方が簡単ではあるわな。
どんくらいデカいのがいるんや?
せいぜい数十ギガとかそんなもんやろ?
ケチらんと行くっちゅうのもアリや。
どんくらいデカいのがいるんや?
せいぜい数十ギガとかそんなもんやろ?
ケチらんと行くっちゅうのもアリや。
265デフォルトの名無しさん
2020/02/05(水) 23:33:50.77ID:bIRSo9XQ CreateFile
WriteFile
ReadFile
SetFilePointerEx
SetEndOfFile
WriteFile
ReadFile
SetFilePointerEx
SetEndOfFile
266デフォルトの名無しさん
2020/02/06(木) 13:03:55.59ID:sNihMBVC こんな感じ?
.... 0101 0000 0100 0101 0001 0100 0101 0110
.... 0101 0000 0100 0101 0001 0100 0101 0110
267デフォルトの名無しさん
2020/02/06(木) 16:50:43.13ID:zCd4f5nI STLコンテナ (仮にvとする) のサイズの分だけfor文を回したいってときに
for(int i=0; i<v.size(); i++)
と書くことが多いんだが、v.size()はintじゃないので警告が出る。
警告を一つ残らず潰したいタチだから毎回こういうのはintにキャストしてるんだが、キャストのコストってどんなもんなんだろ。
「大したことないからOK」って立場と「そもそもv.size()が毎回呼ばれてる時点でナンセンスだから改善すべき」って立場と「その警告は無視しなさい」って立場などがあると思うが、皆はどうしてる?
逆順にしたいことなどがよくあるので、範囲for文を使えってのは今回はナシで。
特定の環境、コードでのテストはできるが、一般論として、あるいは皆さんのスタンスとしてはどうですか。
for(int i=0; i<v.size(); i++)
と書くことが多いんだが、v.size()はintじゃないので警告が出る。
警告を一つ残らず潰したいタチだから毎回こういうのはintにキャストしてるんだが、キャストのコストってどんなもんなんだろ。
「大したことないからOK」って立場と「そもそもv.size()が毎回呼ばれてる時点でナンセンスだから改善すべき」って立場と「その警告は無視しなさい」って立場などがあると思うが、皆はどうしてる?
逆順にしたいことなどがよくあるので、範囲for文を使えってのは今回はナシで。
特定の環境、コードでのテストはできるが、一般論として、あるいは皆さんのスタンスとしてはどうですか。
268デフォルトの名無しさん
2020/02/06(木) 17:11:56.16ID:v+RXRHu+ コンパイルの警告のためだけだから
実行時コストは0じゃね
実行時コストは0じゃね
269デフォルトの名無しさん
2020/02/06(木) 17:13:00.89ID:v+RXRHu+ 手でタイプするコストうんぬん言うなら
マクロで #define LEN(s) ((int)s.size())
マクロで #define LEN(s) ((int)s.size())
270はちみつ餃子 ◆8X2XSCHEME
2020/02/06(木) 17:18:31.70ID:jSrTrJa0 >>267
最も正統派なのはこうかな?
for(decltype(v)::size_type i=0; i<v.size(); i++)
常識的に考えてコンテナの size_type が std::size_t より大きいことはあまりない (大抵は等しい) と思うので、面倒なときは std::size_t を使う。
本当に上限が限られていてその上限が変更されることがあり得ないほどそのプログラムにとって
本質的なものだと判断すれば int でいいやってこともあるといえばあるだろうし、
同じようなパターンが何度も現れるならアダプタを作った上で範囲forというのも考えられる。
状況によるでしょ。
最も正統派なのはこうかな?
for(decltype(v)::size_type i=0; i<v.size(); i++)
常識的に考えてコンテナの size_type が std::size_t より大きいことはあまりない (大抵は等しい) と思うので、面倒なときは std::size_t を使う。
本当に上限が限られていてその上限が変更されることがあり得ないほどそのプログラムにとって
本質的なものだと判断すれば int でいいやってこともあるといえばあるだろうし、
同じようなパターンが何度も現れるならアダプタを作った上で範囲forというのも考えられる。
状況によるでしょ。
271デフォルトの名無しさん
2020/02/06(木) 17:24:46.97ID:2fVM4odH int i = 0; と書かずに size_t i = 0; と書くのはどうだい?
v.size() が本当に size_t を返すか、という問題はあるが。
for (decltype(v.size()) i = 0; i < v.size(); i++)
と書くこともできるね。
i の型が int でないと不味いのかも知れんけど。
v.size() が本当に size_t を返すか、という問題はあるが。
for (decltype(v.size()) i = 0; i < v.size(); i++)
と書くこともできるね。
i の型が int でないと不味いのかも知れんけど。
272デフォルトの名無しさん
2020/02/06(木) 17:39:05.78ID:/W9iMVJD273デフォルトの名無しさん
2020/02/06(木) 17:43:47.39ID:/W9iMVJD >>269は色々な理由で無い
274デフォルトの名無しさん
2020/02/06(木) 17:44:41.65ID:v+RXRHu+ for(unsigned int i=0, len=v.size(); i<len; i++)
これもよく見るか
これもよく見るか
275デフォルトの名無しさん
2020/02/06(木) 17:46:58.02ID:5ihPHl5F auto i=0uにしてるな
276デフォルトの名無しさん
2020/02/06(木) 17:48:08.30ID:VEO7DUBt >>269
template <typename T> inline auto len(T s) { return s.size(); }
template <typename T> inline auto len(T s) { return s.size(); }
277デフォルトの名無しさん
2020/02/06(木) 17:48:51.04ID:VEO7DUBt あ、右辺値参照わすれたw わりーわりー
278デフォルトの名無しさん
2020/02/06(木) 17:49:18.67ID:/W9iMVJD 警告を消す為だけなら設定を変えるのが良い
279デフォルトの名無しさん
2020/02/06(木) 17:50:35.38ID:/W9iMVJD >>276
何の解決にもなってない
何の解決にもなってない
281デフォルトの名無しさん
2020/02/06(木) 18:09:13.09ID:3IyMYliq282デフォルトの名無しさん
2020/02/06(木) 18:11:29.18ID:3IyMYliq v.size()の値が、ループ内で変化しない「ループ定数」であると判断するのは
コンパイラにとってはものすごく難しい場合がある。
ループ定数であると判断された場合にのみ、>>274のような最適化が行われる可能性が出てくるが、判定できなければループするたびに毎回評価されてしまうのでループの実行速度が遅くなってしまう。
コンパイラにとってはものすごく難しい場合がある。
ループ定数であると判断された場合にのみ、>>274のような最適化が行われる可能性が出てくるが、判定できなければループするたびに毎回評価されてしまうのでループの実行速度が遅くなってしまう。
283デフォルトの名無しさん
2020/02/06(木) 18:30:55.84ID:F7wYIGq0 マクロってそんなに危険なんですか。
284デフォルトの名無しさん
2020/02/06(木) 18:33:27.11ID:3IyMYliq >>283
本人だけが開発していて、記憶力が優れていて絶対に使い方を間違いなければ特に問題ないと思うが、使い方を間違うと危険なことがある。
エラーも出ずに変な動作をしてしまうことがある。
でもそれさえ気を付けていれば特に問題ないとも言える。
本人だけが開発していて、記憶力が優れていて絶対に使い方を間違いなければ特に問題ないと思うが、使い方を間違うと危険なことがある。
エラーも出ずに変な動作をしてしまうことがある。
でもそれさえ気を付けていれば特に問題ないとも言える。
285デフォルトの名無しさん
2020/02/06(木) 18:37:31.86ID:3IyMYliq >>269
マクロで書く場合、
#define LEN(_s_) ((int)((_s_).size()))
と書いたほうが良い。
特に、s や _s_ を()で囲むのは必須。
sを_s_と書くのは、ミスタイプがあった場合の備え。
例えば、マクロの仮引数にsと書いているのに、マクロの定義部分をtと
書き間違えていて、かつ、マクロを使う場所に t という変数がたまたま使われて
いたとすれば、エラーにならないのに間違った動作をしてしまう。
_s_と書いていれば、_s_という変数は絶対に使われないのでこの心配がない。
そのため、マクロの引数は伝統的に、_s_などのように書くことが推奨されている。
マクロで書く場合、
#define LEN(_s_) ((int)((_s_).size()))
と書いたほうが良い。
特に、s や _s_ を()で囲むのは必須。
sを_s_と書くのは、ミスタイプがあった場合の備え。
例えば、マクロの仮引数にsと書いているのに、マクロの定義部分をtと
書き間違えていて、かつ、マクロを使う場所に t という変数がたまたま使われて
いたとすれば、エラーにならないのに間違った動作をしてしまう。
_s_と書いていれば、_s_という変数は絶対に使われないのでこの心配がない。
そのため、マクロの引数は伝統的に、_s_などのように書くことが推奨されている。
287デフォルトの名無しさん
2020/02/06(木) 19:30:05.95ID:/W9iMVJD288デフォルトの名無しさん
2020/02/06(木) 19:38:40.11ID:zCd4f5nI 皆さんありがとうごさいます。
結構難しいですね。
>>274
> for(unsigned int i=0, len=v.size(); i<len; i++)
これは
for(int i=0, len=(int)v.size(); i<len; i++)
としても性能上そう変わらないですよね?
ループ変数はintであってほしいと思うので、これが自分には向いているように思いました。
結構難しいですね。
>>274
> for(unsigned int i=0, len=v.size(); i<len; i++)
これは
for(int i=0, len=(int)v.size(); i<len; i++)
としても性能上そう変わらないですよね?
ループ変数はintであってほしいと思うので、これが自分には向いているように思いました。
289デフォルトの名無しさん
2020/02/06(木) 19:42:58.30ID:bk3hpXlE >>275に一票
290デフォルトの名無しさん
2020/02/06(木) 20:10:32.24ID:9e+8kNR/ キャスト一回って機械語4つくらいじゃあないの?
そこまでシビアってのは競技プログラミングか脳手術ロボットでも作ってんの?
そこまでシビアってのは競技プログラミングか脳手術ロボットでも作ってんの?
291デフォルトの名無しさん
2020/02/06(木) 20:24:03.42ID:/W9iMVJD 4個もいらん
292デフォルトの名無しさん
2020/02/06(木) 20:29:38.17ID:/W9iMVJD293デフォルトの名無しさん
2020/02/06(木) 20:40:31.72ID:3IyMYliq >>290
同じBIT数やBIT数が少なくなる場合の整数型から整数型へのcastは、マシン語では0命令(命令が出力されない)。
高級言語では違う型でもマシン語レベルでは変わらないため。
BIT数が多くなる場合には、x86の場合は、movzx や movsx が使われる。
同じBIT数やBIT数が少なくなる場合の整数型から整数型へのcastは、マシン語では0命令(命令が出力されない)。
高級言語では違う型でもマシン語レベルでは変わらないため。
BIT数が多くなる場合には、x86の場合は、movzx や movsx が使われる。
294デフォルトの名無しさん
2020/02/06(木) 20:41:12.62ID:3IyMYliq >>292
実際には、最適化が上手く行かないことも多いので差が出てくることは多い。
実際には、最適化が上手く行かないことも多いので差が出てくることは多い。
295デフォルトの名無しさん
2020/02/06(木) 20:42:39.58ID:3IyMYliq296デフォルトの名無しさん
2020/02/06(木) 20:49:08.28ID:VEO7DUBt 素直にrange-based-for
これが出てきたことの影響のでかさがわかってないやつ多すぎ
禿4にはfor_eachを使う前にもっと適した関数を探せとあるが
本当にそうか自分の頭で考えろ
これが出てきたことの影響のでかさがわかってないやつ多すぎ
禿4にはfor_eachを使う前にもっと適した関数を探せとあるが
本当にそうか自分の頭で考えろ
297デフォルトの名無しさん
2020/02/06(木) 20:56:38.87ID:/W9iMVJD コストを気にしてる人に対してトンチンカン
298デフォルトの名無しさん
2020/02/06(木) 21:03:18.93ID:/W9iMVJD 普通のコンパイラなら
コンパイル単位内の関数は一緒に最適化するので
.size() の中で値を返してるだけなら
ループの外に追い出してくれる
ターゲットがPCなら気にするな
それよりv[i]の方が重い
コンパイル単位内の関数は一緒に最適化するので
.size() の中で値を返してるだけなら
ループの外に追い出してくれる
ターゲットがPCなら気にするな
それよりv[i]の方が重い
299デフォルトの名無しさん
2020/02/06(木) 21:03:40.80ID:VEO7DUBt 何もわかってねえやつ
300デフォルトの名無しさん
2020/02/06(木) 21:17:40.42ID:X3a4Tx/S302デフォルトの名無しさん
2020/02/06(木) 22:16:59.41ID:cE8ku0Th templete<typename T>auto LEN(const T& v)->signed T{return (signed T)v;}
303デフォルトの名無しさん
2020/02/06(木) 22:22:15.30ID:j/UITOXa とりあえず大きい方に合わせとけば間違いないんだからsize_tでいいじゃん
そのvの要素が将来に渡って21億個を超えない保証がどこにある?
そのvの要素が将来に渡って21億個を超えない保証がどこにある?
304デフォルトの名無しさん
2020/02/06(木) 22:45:07.03ID:/W9iMVJD305デフォルトの名無しさん
2020/02/06(木) 22:53:37.31ID:sigCaOr9 x86なら32bit命令使った方がバイナリ小さい
306デフォルトの名無しさん
2020/02/06(木) 22:57:14.86ID:sigCaOr9307デフォルトの名無しさん
2020/02/06(木) 23:03:20.12ID:YUB/hFRs >>300
range-basedはiterator
c++のiteratorはindexが速くなる連続アドレスのコンテナならpointerと同じコンパイル結果になる
indexアクセスがpointerより遅くないなら、それはコンパイラの最適化のお陰
range-basedはiterator
c++のiteratorはindexが速くなる連続アドレスのコンテナならpointerと同じコンパイル結果になる
indexアクセスがpointerより遅くないなら、それはコンパイラの最適化のお陰
308デフォルトの名無しさん
2020/02/06(木) 23:13:46.15ID:/W9iMVJD >>306
生ポと変わらなきゃ良いんだけど
変わるんだよ
VisualStudioやチープなコンパイラだと
いずれにしろここから先は
具体的な環境とループ回数やループの中身全体で考えないと意味がない
なんせ1クロックレベルのことを気にしてるようなので
実はメモリアクセスが支配的で
他の最適化は全く意味がないとか
生ポと変わらなきゃ良いんだけど
変わるんだよ
VisualStudioやチープなコンパイラだと
いずれにしろここから先は
具体的な環境とループ回数やループの中身全体で考えないと意味がない
なんせ1クロックレベルのことを気にしてるようなので
実はメモリアクセスが支配的で
他の最適化は全く意味がないとか
309デフォルトの名無しさん
2020/02/06(木) 23:20:09.64ID:/W9iMVJD SIMD命令 / DSP命令 / スレッド分け / GPU
他のループと合わせる / ループを分ける
ループアンロール
依存性の削減 / 式変形
アルゴリズムの改善
キャッシュ化 / テーブル化
いろんな最適化がある
他のループと合わせる / ループを分ける
ループアンロール
依存性の削減 / 式変形
アルゴリズムの改善
キャッシュ化 / テーブル化
いろんな最適化がある
310デフォルトの名無しさん
2020/02/06(木) 23:45:25.65ID:f00f0WlE vectorの[]は定数時間
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 【テレビ】25年ぶり復活「炎のチャレンジャー」南原清隆&菊池風磨がMC 懐かし「電流イライラ棒」も [湛然★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- 中国「捜索レーダー起動は各国の通常の手法」 火器管制用か回答せず [蚤の市★]
- 【訃報】声優・西村知道さん死去 「SLAM DUNK」安西先生役 9月に体調不良のため一時休業 [少考さん★]
- 南海トラフ直しといた
- 女って金とイケメンしか見てないよな
- ぺこーら、地震で同僚が次々配信を止めるなか強行し続けるので悪目立ちするwww [268244553]
- 高市総理、睡眠時間30分😢
- フェリーの魅力を語ろう。
- 【速報】高市早苗、起床 [779938112]
