[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 08/08 21:46 / Filesize : 235 KB / Number-of Response : 1032
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part148



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/ (日本語)

199 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 14:55:47 ID:0Gqmr542.net]
>>190
break nを勧めている人?
対象が1段なのと複数段とでは大きなギャップがあるでしょ。単純に対称性があると言えるものではないと思う。
ラベルつけるならgotoと手間が変わらないというのは同意。ただ、重要なのは手間が減ることではなく、複数段のループの外に出ることが明示されることだから、gotoと意味が混同されず同じ程度の手間でできる記法があるならそれは嬉しい。

200 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 14:56:57 ID:EDNK6zQt.net]
現実のC++について話せ
ここで新機能の導入について議論しても無駄だ
フォーラムでやれ

201 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 14:57:45 ID:gkoi3ncl.net]
手間が減ることは重要だよ
ラベル名を考える手間をかけて良いならgotoで良い

202 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 15:01:24.88 ID:rWwvB4I9.net]
大体だよ、多重ループはbreakで抜けれないので、仕方なくgoto使うときの
そのgotoを使う都合で必要になった、そのラベルをだよ
じゃーブロックにラベルをつけましょう、ってなんでそーなんだよ
元々のbreakにはラベルなんかねーのに
breakにラベルが無くて混乱したやつ居るか?

ご飯が無いからパンを食べてた状況なのに
すり替わってパンありきになって、パンが無きゃ話にならないとか言い出す始末
別にパン(ラベル)なんかなくても、ご飯があるならご飯食べろよ

ラヘルラベルって、そのラベルがどこ由来か考えてみろよ、gotoだろ?
もう一度言うが、もともとのbreakにはラベルなんかないし、それでみんな普通に過ごせてるし、混乱も起きてない
ただ、gotoで抜けるためには文法上/機能上ラベルが必要だったねってだけで、そこに着目しても仕方がない
本質的には無くても別に困らない

203 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 15:05:16.61 ID:jVWLSRwc.net]
ソースコードチェック目的でプログラム読むとき、gotoが出てきたら
そのgotoの使用方法が問題ないものなのか、いちいちチェックしないといけない。
breakならループ抜けるという意図が明白なので、チェックしなくてよい。

204 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 15:11:47.92 ID:rWwvB4I9.net]
そんなに名前が無いと発狂するんならもうgoto使えば?って思うし
なんなら関数化して正式に名前付ければって思うし
そこまでしたくないってときにbreak nが便利なわけだ
やりたいことは「多重ループから抜けたい」であって
「名前を付けたい」ではない!!

205 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 15:11:53.90 ID:gkoi3ncl.net]
関数コールも問題のないコールかどうかチェックしないといけないから
使わない方が良い

206 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 15:14:22.99 ID:EDNK6zQt.net]
それならもうポインタもグローバル変数もマルチスレッドも大量のチェックが必要だから使ってはいけないってことで

207 名前: mailto:sage [2020/02/02(日) 15:14:36.78 ID:Rn0kkYyt.net]
>>199
私と認識が似ていますね

>>137
>goto とか break とか continue とか、他の言語(javaとか)でもいろいろ小手先的に弄られているけれども、それに何の意味があるのかいつも不思議におもいますね




208 名前:
>>164
java にはラベル付き break が存在して、ほとんど goto です https://www.sejuku.net/blog/20100
[]
[ここ壊れてます]

209 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 15:15:16.61 ID:7b/FZYuN.net]
現行のC/C++にはgoto <label>がある一方、break <n>は無い
もしbreak <n>の追加がgoto <label>の実装より難しかったからやらなかったのだとしたら、
break <n>の飛び先がgoto <label>の飛び先より簡単にワカルから優れているという主張は根拠を失う

break <n>はわかりにくいか、さもなくばgoto <label>と同等なんである

210 名前:デフォルトの名無しさん [2020/02/02(日) 15:16:38.00 ID:mzCY/+E0.net]
constがスレッドセーフなのも困った。

211 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 15:24:46.36 ID:jpTipLln.net]
>>201
現実ありえないのは重々承知したうえで書くけど
100重ループを脱出するとき数を数えたくないだろうなって思うじゃん
ほかにも3重ループとかで2ndと3rdのループから共通の脱出先ラベルにもできるわけじゃん
文法を拡張する前提ならそこまで想定すべきだと思うね

粗野な即値の数字じゃなくて意味ごとに名前をつけられるようにしてきたのが
プログラミング言語の進化の歴史なのでおれは自然だと思うよ

というかそういう観点からラベル付きbreakというのは他の言語にはあるわけで
で今話してるのはもっと書きやすく読みやすくできないかというトピックでしょ
break Nは使えるだろうけど洗練されてない感じ

212 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 15:27:11.67 ID:gkoi3ncl.net]
break [n] はラベル名を考えなくて良い利点がある
使えるなら使いたい

ラベル名を考える必要があるならgotoで良い

ループの先頭で名前を付けるのはgotoより見づらいから使わない

213 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 16:01:27 ID:o79zkFFu.net]
break n とか言ってる奴は何故か>>150をスルーしてて笑うわ

214 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 16:07:52 ID:nz0OxFB3.net]
他の人は「マジックナンバー」だと思わなかったからでは。

215 名前:デフォルトの名無しさん [2020/02/02(日) 16:20:03 ID:gXxB23XL.net]
foobarやhogeを超える人気なダミー文字列を考えたほうがよほど建設的だぞ、君たち。

216 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 16:35:55 ID:SWo7Ruqh.net]
break 5; //C
GOTO 5 : REM BASIC

217 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 16:37:04 ID:gkoi3ncl.net]
マジックナンバーがイヤなら
break break;



218 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 16:50:03 ID:DTIMfhpJ.net]
関数で置き換える
引数がめんどうならラムダで置き換える
returnが多重breakの代わりになる

219 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 16:58:55 ID:SWo7Ruqh.net]
>>214
多重ループを単一関数に書くって前提だね

220 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 17:03:09 ID:7b/FZYuN.net]
>引数がめんどうならラムダで置き換える ←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()は引数がぞろぞろ並ばねばならない

221 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 17:05:11 ID:+9zyTEwm.net]
>>216
>>75

222 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 17:06:58 ID:7b/FZYuN.net]
>>217
左様
それがラムダ式を適用して解決づべき適切な場合である(キリ

223 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 17:15:36 ID:SWo7Ruqh.net]
ジーオーティーオーというスペルでなければ
制御構造はそのままでいいと言うクソ論法

224 名前:デフォルトの名無しさん [2020/02/02(日) 17:52:12 ID:mzCY/+E0.net]
スレとはあまり関係ないんだけど、nodiscard属性を無視するにはどうしたらいいですか?

225 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 17:59:47 ID:MNdu0823.net]
変数で受けといてその変数をガン無視すればいいんじゃないの
未使用変数の警告出るだろうけど

226 名前:デフォルトの名無しさん [2020/02/02(日) 18:00:14 ID:mzCY/+E0.net]
やってみます。
アリガト。

227 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 18:11:02 ID:o79zkFFu.net]
>>210
お前の言う「他の人」はマジックナンバーの意味わかってないってことか?
このスレ見てたらありえなくもないかと思えてきたわw



228 名前:デフォルトの名無しさん [2020/02/02(日) 18:13:54 ID:mzCY/+E0.net]
あと三日くらいしたらお前より出来るようになってるから。

229 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 18:24:38 ID:jpTipLln.net]
>>220
(void)func();

230 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 18:28:22 ID:x1m+isRG.net]
>>208
昔のBASICは、行番号を勝手に付けてくれていたのでgotoでもラベル名を考えなくて済んだのでとても便利だった。

231 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 18:30:04 ID:x1m+isRG.net]
>>226
なお、アセンブラでは行番号がなかったのでラベル名を考える必要があったが、
意味のあるラベル名を考え出すのは大変だったので、分かり易い場所以外は、
多くの人が、lab1: lab2: lab3: のような連番を使う傾向があった。

232 名前:デフォルトの名無しさん [2020/02/02(日) 18:30:14 ID:mzCY/+E0.net]
>>225
メモっときます。
ありがと。

233 名前:◆QZaw55cn4c mailto:sage [2020/02/02(日) 18:31:42 ID:Rn0kkYyt.net]
>>226
>昔のBASICは、行番号を勝手に
auto 文だったかな…

234 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 19:36:27.12 ID:7b/FZYuN.net]
VB6には行番号は無かった

235 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 20:26:55 ID:GV9CDSqK.net]
みんなってc++で何を作ってるの?
ゲーム?

236 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 21:07:54.17 ID:YP+sfqkD.net]
何も作ってないやつがほとんどだろ

237 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 21:15:29.52 ID:GV9CDSqK.net]
すまん俺の聞き方が悪かったのかもしれん
最近プログラミングの勉強始めて、各言語の用途とか調べたんだけど、ここでも一応聞いてみたかったの
何を作ってるって言うより、どんな開発に携わってるかっていうのを聞きたかった



238 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 21:21:43.96 ID:DTIMfhpJ.net]
テキストエディター
3Dモデラー
メーラー

239 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 21:25:09.08 ID:vTjBAXNr.net]
競技プログラミング

240 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 21:39:16 ID:GV9CDSqK.net]
アプリ開発にも使われるのかー
あざした

241 名前:デフォルトの名無しさん [2020/02/02(日) 22:06:04 ID:mzCY/+E0.net]
いまダブルアレイやってる。

242 名前:デフォルトの名無しさん [2020/02/02(日) 22:08:30 ID:mzCY/+E0.net]
検索はstd::setやstd::unorderd_setより速いけど、挿入が一桁遅い。
静的構築が速いというので、それもやってみたけど、2/3くらいにしかならなかった。

243 名前:デフォルトの名無しさん [2020/02/02(日) 22:10:09 ID:mzCY/+E0.net]
検索はstd::setの10倍くらい早いな。

244 名前:デフォルトの名無しさん mailto:sage [2020/02/02(日) 22:15:25 ID:0Gqmr542.net]
>>239
相談ができたらまた来い

245 名前:デフォルトの名無しさん [2020/02/02(日) 22:54:22 ID:mzCY/+E0.net]
>>240
よろしくお願いします。

246 名前:◆QZaw55cn4c mailto:sage [2020/02/02(日) 23:01:19 ID:Rn0kkYyt.net]
初学者的な質問です、よろしくお願いいたします。
バイナリーファイルを
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() とは独立でない、と推測しています

?この解釈で正しいですか?
?こういうのは、C++ iostream レファレンスのどこを見て洞察するべきなのでしょうか?

実際のお題は相変わらずエラトステネスのふるいです https://ideone.com/6Ww9nq

247 名前: mailto:sage [2020/02/02(日) 23:18:14.73 ID:Rn0kkYyt.net]
>>231,233
私は今のところエラトステネスの篩にご執心、という体たらくです…



248 名前:デフォルトの名無しさん mailto:sage [2020/02/03(月) 00:01:01 ID:8riGTZSm.net]
エラトステネスのふるいで
なんでファイルのリードが必要?

249 名前:◆QZaw55cn4c mailto:sage [2020/02/03(月) 00:22:49 ID:X2PbBOAI.net]
>>244
結構昔から
www.asahi-net.or.jp/~KC2H-MSM/pbsb/pbsbm006.htm
にとても興味を持っていたのです、二つの隣り合った素数の差を「素数のギャップ」と呼ぶことにしたとき、

『素数のギャップが取りうる値の頻度。はじめは2、4が多いが、そのうち、6の方が多くなる。』
『6がチャンピオンの座を降りるのはいつか。』
『少なくとも 10^14 以下では6がトップであり、それ以降、いつ、6以外の数がトップになるかは、知られていない。』

10^14 までの数であっても全部、篩としてメモリに載せられないので、さてどうしたものかと思案中です、最終的には年スパンでずっと計算させ続けるのに耐えられるようにしたい、と

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だけど
そもそもコンテナ経由でアクセスする時点でそんな事は誤差

そのループに非常に時間がかかるなら
ループ全体で最適化しないと






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<235KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef