C++相談室 part148at TECH
C++相談室 part148 - 暇つぶし2ch1:デフォルトの名無しさん
20/01/31 20:54:06.26 Nt0XFA2s.net
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part147
スレリンク(tech板)
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
スレリンク(tech板)
■長いソースを貼るときはここへ。■
 URLリンク(codepad.org)
 URLリンク(ideone.com)
[C++ FAQ]
URLリンク(isocpp.org)
URLリンク(www.bohyoh.com) (日本語)

2:デフォルトの名無しさん
20/01/31 21:08:18.93 88e+X9K2.net
>>2
2get乙。

3:デフォルトの名無しさん
20/01/31 21:13:28.27 70BTs5bI.net
前スレの>1000は有能

4:デフォルトの名無しさん
20/01/31 21:28:55.62 88e+X9K2.net
>>1
1get乙。

5:デフォルトの名無しさん
20/01/31 21:32:42.96 aVH6lH01.net
gotoの話でもするか? それともマクロ? ハード絡みのところなんか俺的にはオモロイが

6:デフォルトの名無しさん
20/01/31 21:35:23.06 yrj+fbAX.net
前スレ999だけと循環してないよ
仮想アドレス使ったら必ずページフォルトするわけじゃない
MMUの仕組みわかってる?

7:デフォルトの名無しさん
20/01/31 21:47:35.65 aVH6lH01.net
こらこら、前スレ999は俺だぞ
なりすましす


8:んなカス



9:デフォルトの名無しさん
20/01/31 21:48:10.26 88e+X9K2.net
URLリンク(ja.cppreference.com)
これ使うとだいぶ早くなるらしいですよ。

10:デフォルトの名無しさん
20/01/31 21:48:37.69 88e+X9K2.net
じゃあ俺も前スレ999です。

11:デフォルトの名無しさん
20/01/31 21:59:36 yrj+fbAX.net
>>7
999へのレスって意味ね
文脈で理解してほしいところだが
で循環論法でないことわかった?

12:デフォルトの名無しさん
20/01/31 22:13:11.58 HzrC4w9c.net
環境を限定しないならこれ以上続けても無駄
全ての環境を知ってるヤツでない限り

13:デフォルトの名無しさん
20/01/31 22:16:13.72 88e+X9K2.net
すべての環境を知っている。

14:デフォルトの名無しさん
20/01/31 22:50:18.80 aVH6lH01.net
>>10
全然わかんねえ! 何言ってんの?

15:デフォルトの名無しさん
20/01/31 22:56:57.70 88e+X9K2.net
>>13
俺はわかった。

16:デフォルトの名無しさん
20/01/31 22:58:17.72 yrj+fbAX.net
>>13
どこが循環してるか言ってみなよ

17:蟻人間 ◆T6xkBnTXz7B0
20/01/31 23:38:50 r/XM8LG1.net
struct AutoDeleteFile {
const WCHAR *m_file;
AutoDeleteFile(const WCHAR *file) : m_file(file) { }
~AutoDeleteFile()
{ DeleteFileW(m_file); }
};

18:デフォルトの名無しさん
20/01/31 23:42:29.75 wt6xD5wE.net
それではおじいちゃんのaddress談義
続きをどうぞ

19:デフォルトの名無しさん
20/01/31 23:56:13.21 v4E0eL1J.net
ともかく最初に思ってることがあって
要は荒らしてやろうと
今回は結構うまくいった方かな
この前は
「std::deque には begin() end() clear() があるのに
 std::queue と std::stack にそれらが無いのは何故?
 有ったほうが便利なのでは?」
って質問で大分いい感じにスレを流した
そら、有ったほうが便利に違いないし、無いことに合理的な理由など無いわけだから荒れる
そういう、荒れそうなネタ考えるのに毎回結構頭使う
ただ、ちょっと前の goto のやつ、あれはダメ
初心者がワーワー騒いでるだけで、ほとんどのベテラン連中は静観してたと思う
俺の狙いはそれじゃない
あと、妹大好きです

20:デフォルトの名無しさん
20/01/31 23:56:45.81 v4E0eL1J.net
まぁ、もうすぐID変わるからね

21:デフォルトの名無しさん
20/02/01 00:02:42.91 9soosqUN.net
ネタばらし興醒めだな
C++erそうゆうとこだぞ

22:デフォルトの名無しさん
20/02/01 00:03:19.42 K9hiSYW1.net
なんだと!

23:蟻人間
20/02/01 00:05:22.38 l1s2tvQy.net
何か難しそうなC++コード、ここに貼ってくれよ。

24:デフォルトの名無しさん
20/02/01 00:37:10.49 pUJoLXPw.net
はいはい狙った通りになった宣言ねw

25:デフォルトの名無しさん
20/02/01 00:41:09.21 P+PaZ5tD.net
全然荒れずにコテンパンにのされてたじゃん

26:デフォルトの名無しさん
20/02/01 00:44:51.53 K9hiSYW1.net
でも、もともと主張がおかしかったから、釣りだったのはホントじゃないの。

27:デフォルトの名無しさん
20/02/01 00:49:11.46 pUJoLXPw.net
釣りっていうかただの構ってちゃんな。何か深い考えがあるというわけでもないし。

28:デフォルトの名無しさん
20/02/01 00:49:56.15 K9hiSYW1.net
釣りじゃなかったら相当痛い人だし。
釣りならちょっと痛い人で済むよ。

29:デフォルトの名無しさん
20/02/01 00:52:13.74 K9hiSYW1.net
ところで僕は自分の職業の板ってまったく見ないんだけど。
ここは職業プログラマが多いの?

30:デフォルトの名無しさん
20/02/01 00:53:02.37 K9hiSYW1.net
なんで見ないかというと得るものが全くないから。

31:デフォルトの名無しさん
20/02/01 01:09:30 50MDw/OE.net
goto ふとん;

32:デフォルトの名無しさん
20/02/01 02:05:11.46 efnE+DyP.net
わしも見ない
あそこは仕事のグチを書きこむとこやん
こっちは言語仕様のグチを書きこむとこや

33:デフォルトの名無しさん
20/02/01 02:37:59.97 tav2AwxI.net
break break;
bresk break break;
break continue;
こんな書き方ができたら嬉しい?

34:デフォルトの名無しさん
20/02/01 09:17:35.95 9lmFlpKY.net
export importよりひどいw

35:デフォルトの名無しさん
20/02/01 10:06:12.21 +WgC03YT.net
途中friskみたいのも混じってるしな

36:
20/02/01 10:09:42.57 fiLTG5Nb.net
break 3;

37:デフォルトの名無しさん
20/02/01 10:19:22.01 Bc9LjLbW.net
ネアンデルタール人はホモサピエンスの基底クラスであったか。
ネアンデルタール人のDNA、アフリカの現生人類からも検出 新研究
URLリンク(www.cnn.co.jp)
2020.01.31 Fri posted at 13:15 JST

38:デフォルトの名無しさん
20/02/01 11:58:10 YFAnTUnh.net
多重ループを抜ける方法

ループに名前は名前を考えるのがイヤ
break [数字] は数えるのがイヤ
関数を分けてreturn はもっとイヤ
変数を使ってbreakで抜けるのは論外
でもgotoはなんとなくイヤ

全ての要望に答えたのが >>32

39:デフォルトの名無しさん
20/02/01 12:17:12 pUJoLXPw.net
バカの要望を聞いてさらにロクでもない方向に行ってしまうっていう
わかりやすい例を提供してくれてありがとう。

40:デフォルトの名無しさん
20/02/01 12:30:47.94 +WgC03YT.net
多重ループにする設計が悪い

41:デフォルトの名無しさん
20/02/01 12:31:58.09 YFAnTUnh.net
ん?
皮肉のつもりで書いたんだけど
真面目な書き込みととらえられるとは思わなかった

42:デフォルトの名無しさん
20/02/01 12:34:39.38 YFAnTUnh.net
主に>>39みたいなアホに対する皮肉

43:デフォルトの名無しさん
20/02/01 12:40:18.47 +WgC03YT.net
は?オメェだろアホ

44:デフォルトの名無しさん
20/02/01 12:41:53.34 pUJoLXPw.net
あえて説明してるところで恥ずかしいことになってる奴w

45:デフォルトの名無しさん
20/02/01 13:00:03 TULylXcw.net
>>37
おれはおもしろいアイデアと思う
他に考えるとしたら
やはり名前があった方が変更に強いと思うのでその線でいくと
大抵ループにはイテレータやカウンタが紐づいてるから
それを使って
for (auto& x : なんとか) {
 for (auto& y : なんとか) {
  .break x;
 }
}
とかどうだろ?
for以外で使えないしforでも宣言空だとだめだけど
頻繁に使うわけじゃないだろうから妥協できるかなと

46:デフォルトの名無しさん
20/02/01 13:02:13 YFAnTUnh.net
BASIC

47:デフォルトの名無しさん
20/02/01 13:03:32 +WgC03YT.net
なにそのセンスの欠片もない気持ち悪いコード

48:デフォルトの名無しさん
20/02/01 13:19:23.65 fiLTG5Nb.net
while(){} や do{}while(); で使えないので却下

49:デフォルトの名無しさん
20/02/01 15:04:44.31 7G0Z2VlM.net
for(int x = 0; i < ... )
{
 int y = 0;
LOOP:
 a[x][y]...
 ++y;
 if(...){ break; /*多重ループ脱出*/ }
 goto LOOP;
}

50:デフォルトの名無しさん
20/02/01 16:42:25 hd+by06W.net
>>37
何個の break を書くのか、と break の後に書く数字は? で
結局のところ同じように数えなきゃならないでしょ。

51:デフォルトの名無しさん
20/02/01 17:21:08.52 9BMLg08w.net
>>32はcontinue


52:を混ぜられるのが面白いけど、やるならこうだな。 break n; continue n;



53:デフォルトの名無しさん
20/02/01 17:34:30.73 pUJoLXPw.net
こういうしょーもないシンタックスの話って馬鹿でもしやすいのが盛り上がる理由なんだろうな。

54:デフォルトの名無しさん
20/02/01 17:48:52.85 YFAnTUnh.net
特定の言語のスレ
シンタックスを語らずに何を語る?

55:デフォルトの名無しさん
20/02/01 17:51:10.61 YFAnTUnh.net
>>50
じゃあそれで

56:デフォルトの名無しさん
20/02/01 17:55:08.95 YFAnTUnh.net
break 9;
を数えたく無いとか言ってたヤツがいたけど
そういう時は素直にgotoを使えば良い

57:デフォルトの名無しさん
20/02/01 17:55:47.26 rsRLlL5x.net
てか継続が欲しい

58:はちみつ餃子
20/02/01 18:08:11.40 6nnXKMBq.net
>>55
C++ ではオブジェクトの寿命の管理と辻褄を合わせなきゃならないんだから full continuation は無理だぞ。

59:デフォルトの名無しさん
20/02/01 18:09:32.76 YFAnTUnh.net
継続とは?

60:デフォルトの名無しさん
20/02/01 18:12:05.70 YFAnTUnh.net
setjmp のことか

61:デフォルトの名無しさん
20/02/01 18:12:34.25 Bc9LjLbW.net
ループに名前を付け、その名前で離脱や継続を行う。
ループA {

62:デフォルトの名無しさん
20/02/01 18:16:20.88 Bc9LjLbW.net
途中で送信してしまった。面倒だから書き直さないが、
breakやcontinueはキーワードが紛らわしいのでPerlのlastとnextを拝借する。
last ループA; とか next ループA; みたいな感じ。

63:デフォルトの名無しさん
20/02/01 18:16:45.14 YFAnTUnh.net
わざわざ名前を付けるならgotoで良いんでは?

64:デフォルトの名無しさん
20/02/01 18:18:49.32 vKrtBnhX.net
gcc5ぐらいから一気にgcc10にしたらエラー表示とかデフォルトの警告とか色々変わっててわろた

65:デフォルトの名無しさん
20/02/01 18:19:46.95 Bc9LjLbW.net
>>61
まあね。だけどgotoはフリーダムすぎて良くないでしょ。

66:デフォルトの名無しさん
20/02/01 18:34:11.57 YFAnTUnh.net
いや全然そう思わない
gotoで何か不都合がある?

67:デフォルトの名無しさん
20/02/01 18:52:41.69 pUJoLXPw.net
>>52
コンパイラ毎の最適化における癖とか、例外の実装についての差異なんかも語ってもいいんだぞ。

68:はちみつ餃子
20/02/01 18:56:33.52 6nnXKMBq.net
>>63
goto は自由すぎるけども、ループを何段階も一気に抜けたいとかいう状況がすでにだいぶん自由だと思うぞ。
そういう状況が生まれたらもう駄目なんだよ。
ごちゃごちゃとした使い分けを考えるよりおとなしく goto した方が「そこが悪い」ってのが目立って良い。

69:デフォルトの名無しさん
20/02/01 19:01:47.00 YFAnTUnh.net
一番使いたいのは2段break
行列や画像など2次元構造では当たり前のように2重ループになる
2重ループを抜けたい状況は設計が悪い
と思う感覚が全く理解できない

70:デフォルトの名無しさん
20/02/01 19:01:49.68 TULylXcw.net
構造化を壊さないことを保証した仕組みで脱出したいってことでしょ

71:デフォルトの名無しさん
20/02/01 19:04:12.92 YFAnTUnh.net
2次元構造の2個のループを抜ける為に
非常に関連のある2個のループを別関数に分ける
この方が設計が悪い
というのがおれの感覚

72:デフォルトの名無しさん
20/02/01 19:07:14.52 JWECbGc7.net
>>67
gotoは悪、多重ループは悪、みたいなどこかで聞いたルールを杓子定規に常に遵守すべき絶対ルールのように考える人が少なからずいるんだろうね。声が大きいだけかもしれないけど。

73:デフォルトの名無しさん
20/02/01 19:09:12.42 PjJtYhAX.net
gotoの利用にコンパイラの補佐があればよかったのに

74:デフォルトの名無しさん
20/02/01 19:10:50.63 PjJtYhAX.net
中カッコ、変数の有効範囲含め
スコープ内に飛び込むジャンプを一切禁止、前方のみと決めれば
なかなか直観的でわかりやすいキーワード
だとおもうのに

75:デフォルトの名無しさん
20/02/01 19:19:24.65 YFAnTUnh.net
一切禁止とか言うから
それが絶対だと初心者が思って思考停止する
この典型がgoto
使った方が良い時は使う
再帰も生ポもグローバル変数も多重継承も多重ループも

76:はちみつ餃子
20/02/01 19:25:00.72 6nnXKMBq.net
>>67
ここでワイが「悪い」って言ってるのは使うなとか別の方法がとれるとかいうほどの強い意味じゃなくてさ、
気を付けなきゃならないポイントとして目立ってもらわなきゃ困るって程度の意味。
だけど、日常的にそこら中でそういうポイントがあるのならやっぱり悪いとは思うけど……。

77:デフォルトの名無しさん
20/02/01 19:26:16.45 j/qpVk5O.net
二重ループの脱出は
[&]{
for(){
 for(){
  return;
 }
}}();
で結論出たはずだが

78:デフォルトの名無しさん
20/02/01 19:29:49 YFAnTUnh.net
これはひどい

79:デフォルトの名無しさん
20/02/01 19:44:49 PjJtYhAX.net
それオーバーヘッドかからんの?

80:デフォルトの名無しさん
20/02/01 19:47:58 j/qpVk5O.net
関数オブジェクトはまともなコンパイラならインライン展開される

81:デフォルトの名無しさん
20/02/01 19:48:45 7G0Z2VlM.net
贅沢言いすぎだね
素のPascalなんてreturnすら無いからね
もはやどうやってプログラムを書いたらいいか分からないレベル

82:デフォルトの名無しさん
20/02/01 19:53:54 7G0Z2VlM.net
Pascalは完璧な構造化言語を目指したから
入口と出口を常に一つずつにするというポリシーがあって
それゆえreturnが無いんだよね
returnがあると出口があちこちに散らばるので
構造化じゃない、汚い、という考え

なお、breakは有るもよう

83:デフォルトの名無しさん
20/02/01 19:58:58 +WgC03YT.net
[&]{
try{
for(){
 for(){
  throw 0;
 }
}catch(...){}
}}();

84:はちみつ餃子 ◆8X2XSCHEME
20/02/01 20:02:08 6nnXKMBq.net
抽象的なレベルで考えたら break は
「残りの文が if 式で囲まれていると見なして暗黙のフラグを設定する (そのフラグは暗黙にループの終了条件でもある)」
とも考えられるから、構文糖だといえば構造化は壊れていない。

だけどなぁ、プログラムは人が書くものだし、人にとってどう見えるかも大事なんだよな。
そこらへんは見方によってどうとでも理屈を付けられてしまう。

85:デフォルトの名無しさん
20/02/01 20:04:46 +WgC03YT.net
[&]{
try{
for(){
 for(){
  throw 2;
 }
}
}catch(int d)
{printf("%d段階ジャンプしたお¥n",d);}
}();

86:デフォルトの名無しさん
20/02/01 20:10:07 tav2AwxI.net
>>82
break 2 も gotoでループを抜けるのも同じ

87:デフォルトの名無しさん
20/02/01 20:24:42 iBA7Xa3w.net
>>83
それは最悪
throw 3; って書いてもチェックされないし

88:デフォルトの名無しさん
20/02/01 20:47:35 BhmlSyWc.net
>>67
3重ループは? 4重ループは? なんで2だけなの?

89:デフォルトの名無しさん
20/02/01 20:52:34 TULylXcw.net
たまに国語力が心配になるやつがいるよな

90:デフォルトの名無しさん
20/02/01 20:53:59 +WgC03YT.net
[&]{
try{
for(){
 for(){
  throw "リレミト";
 }
}
}catch(const char*s)
{printf("%sの呪文を唱えた¥n",s);}
}();

91:デフォルトの名無しさん
20/02/01 20:56:56 BhmlSyWc.net
>>87
答えられないならレスしないで下さい
ウザいだけです

92:デフォルトの名無しさん
20/02/01 21:07:19.54 vKrtBnhX.net
for () {
for () {
goto done;
}
}
done:
どう考えてもこちらのほうが綺麗

93:デフォルトの名無しさん
20/02/01 21:09:23.19 BhmlSyWc.net
>>90
だな
必要になったことを変に偽装する悪癖を治すべき病人多すぎ

94:はちみつ餃子
20/02/01 21:14:53.51 6nnXKMBq.net
ほんまになぁ。
そんな簡単なことをラベル付き break だのなんだのって面倒なだけとしか思えぬ。
もう構造化は破綻してるんだからおとなしく goto しとけよな!

95:デフォルトの名無しさん
20/02/01 21:19:44 dP/tym/A.net
>>89
日本語が不得意みたいなので英語で説明しますね
Double loop frequently appears to treat a two dimension structure such as matrix or image data,
so "break from double loop"is used by programmers related mathematical or visual product.
>>67 states that is good reason and s not always bad design.

96:デフォルトの名無しさん
20/02/01 21:22:30 BhmlSyWc.net
>>93
意味わかんね
なんでそんなことするの?
アホだから? それともバカだから?

97:デフォルトの名無しさん
20/02/01 21:25:42.92 dP/tym/A.net
>>94
It's purely kindness for non-Japanese speaker. Did you not like it?

98:デフォルトの名無しさん
20/02/01 21:26:06.76 tav2AwxI.net
>>92
構造化的には
breakも途中でreturnもgotoでループを抜けるのも同じだよ

99:デフォルトの名無しさん
20/02/01 21:26:27.45 BhmlSyWc.net
Пожалуйста, говорите по-японски.

100:デフォルトの名無しさん
20/02/01 21:29:34.25 dP/tym/A.net
なんだロシア人か
Я не понимаю >>67, потому что я не понимаю японский?

101:デフォルトの名無しさん
20/02/01 21:32:56.91 tav2AwxI.net


102:はちみつ餃子
20/02/01 21:34:56.10 6nnXKMBq.net
>>96
同じだからそれ以上に新しい文法を持ち込んでもそれほど綺麗にならんって! ということを言いたい。

103:デフォルトの名無しさん
20/02/01 21:36:54 BhmlSyWc.net
>>98
Mimi ni Kijapani.

104:デフォルトの名無しさん
20/02/01 21:38:38 TULylXcw.net
>>96
gotoは正しく使えばという但し書きがつくでしょ
そこをなんとかしたいという話だと思ってる
それが論点だとするとgoto使えというのは解にならない

105:デフォルトの名無しさん
20/02/01 21:40:19 BhmlSyWc.net
>>96
ほんこれ

106:デフォルトの名無しさん
20/02/01 21:42:54 tav2AwxI.net
>>102
正しく使う前提なのは当たり前
なんでgotoだと正しく使わない前提になるのか不思議

107:デフォルトの名無しさん
20/02/01 21:43:54 BhmlSyWc.net
>>104
ほんこれ

108:デフォルトの名無しさん
20/02/01 21:48:36 7G0Z2VlM.net
危ない操作はできないようにしようってのが言語の進化だからな
それ無視して、安全に使うのが前提とか、正しく使うのが前提とか、それ言っちゃね
なんかおかしな方向へ行くよね

109:デフォルトの名無しさん
20/02/01 21:48:59 TULylXcw.net
>>104
構造化プログラミングの概念は知ってるんだよね?

110:デフォルトの名無しさん
20/02/01 21:50:07 7G0Z2VlM.net
gotoを正しくしか使えないように改良したのがreturn、break、continue
ってことも忘れずに

111:デフォルトの名無しさん
20/02/01 21:54:44 BhmlSyWc.net
>>104
構造化プログラミングでは使わない制御構造を
使うべきでない理由が構造化プログラミングって論法に
抜け出せない枠があるとは思わないの?

>>108
continueだけ、それで正解なんだが
他はみんな間違ってるよ

112:デフォルトの名無しさん
20/02/01 21:57:47 7G0Z2VlM.net
見てください皆さん、ID:BhmlSyWc ← ひどいですよ
まず何言ってるか分からない
このレベルはきついな

113:デフォルトの名無しさん
20/02/01 22:02:32 tav2AwxI.net
>>106
どの辺からgotoが危ない操作だと思うの?

114:デフォルトの名無しさん
20/02/01 22:06:43 vKrtBnhX.net
まあ1万行ある関数の中で、5千行目ぐらいにgotoがあって、ラベルが関数の先頭付近にあるとか、それに近いのは見たことあるが、あれはどう考えてもgotoの悪い例だからな
包丁で味噌汁食ってるようなもん

115:デフォルトの名無しさん
20/02/01 22:06:57 BhmlSyWc.net
>>110
きつくて気の毒だな
不勉強なやつは自業自得なので同情はしない

116:デフォルトの名無しさん
20/02/01 22:08:59 BhmlSyWc.net
>>112
1万行か・・・これ↓より重症だなw
URLリンク(www.pro.or.jp)

117:デフォルトの名無しさん
20/02/01 22:11:31 tav2AwxI.net
不定値や無限ループの危険はgotoに限ったことじゃないし
ループを抜けるgotoには関係ない話

goto特有の危険な場面
何を心配してるんだろう
酸っぱいブドウ?

118:デフォルトの名無しさん
20/02/01 22:16:09.36 TULylXcw.net
だめだこりゃ

119:デフォルトの名無しさん
20/02/01 22:19:01.58 7G0Z2VlM.net
gotoはどこへ飛ぶか分からないから読みにくいんだよ
前に飛ぶのか、後ろに飛ぶのか、それすら分からない
飛び先を分かりやすく改良したのがreturn、break、continue
それぞれ飛び先が決まっているから追うのが楽
その英知が分からんっていうならreturn、break、continueを使わずに
全部gotoでやれば?って話

120:デフォルトの名無しさん
20/02/01 22:22:45.11 tav2AwxI.net
関数なんてもっとどこに飛ぶかわからんぞ

121:デフォルトの名無しさん
20/02/01 22:25:22 tav2AwxI.net
どこに飛ぶかわかる名前にするってのが普通の発想
意味でも構造でも文章でも好きな名前を付けられる

関数も変数も名前空間も全てそう

122:デフォルトの名無しさん
20/02/01 22:25:32 TULylXcw.net
gotoは中にも飛べるの知らないんじゃないこの人

123:デフォルトの名無しさん
20/02/01 22:25:55 BhmlSyWc.net
>>117
飛び先じゃなく飛ぶこと自体の問題なんだがw

124:デフォルトの名無しさん
20/02/01 22:26:20 7G0Z2VlM.net
つまりはそういう話で、追いやすいように飛び先を制限したいよねーってのが根底に有って
(当然そういうのが念頭にあってreturn,break,continueは生まれたわけで、前例に倣いたい所)
それでブロックに名前を付けるだのbreak 2だのって書き込んでいる人がいるわけで
gotoでいいんじゃね?っていうなら、return,break,continueもgotoでいいんじゃね?
むしろforやwhileもgotoでいいんじゃね?gotoを正しく使えばいいんだろ?ってなる

125:デフォルトの名無しさん
20/02/01 22:26:36 TULylXcw.net
構造化プログラミング知らずにgotoいきって使うのはさすがにやばい

126:デフォルトの名無しさん
20/02/01 22:28:23 BhmlSyWc.net
>>122
どうなっていれば「追いやすい」のかを
まず明らかにしようぜ

俺ルールでもいいし
広く認知されているルールでもいいし

127:デフォルトの名無しさん
20/02/01 22:31:09 7G0Z2VlM.net
巻数はどこに飛ぶか分からないが、必ず元に戻ってくる(のが基本)
行きっぱなしというか、ただのジャンプのgotoやらbreakやらとは違うのだよ
関数のコールは入口と出口が一つになってて非常に構造化されてる好例
こういうところ分からないってのはセンスないよ

128:デフォルトの名無しさん
20/02/01 22:32:56 7G0Z2VlM.net
巻数→関数

129:デフォルトの名無しさん
20/02/01 22:35:10.84 tav2AwxI.net
使い所でgotoが使えないのはセンス無い
使い所でgptoを使わないのはコードが見にくい
使い所でgotoを使わないのは危険なコード
goto否定派にレベルを合わせた主張をするとこんな感じ

130:デフォルトの名無しさん
20/02/01 22:42:27.15 TULylXcw.net
やっぱりこいつダメだな
知性がない

131:デフォルトの名無しさん
20/02/01 22:44:49.19 tav2AwxI.net
使い所でgotoを使わないのは知性が無い

132:デフォルトの名無しさん
20/02/01 22:45:34.37 7G0Z2VlM.net
本心では誰もgotoは否定していないんじゃないかな
今は多段breakの機能が無いんだからgotoを使えばいいだろう
しかし、もしgotoを使わないで済む多段breakの新機能があったのなら
それを使ったほうがいいだろうし
じゃーその新機能はどんなものが考えられるか?って遊びだろ?
ブロックに名前付けるだとかbreak nだとかは

133:デフォルトの名無しさん
20/02/01 22:50:41.91 wBNP08tW.net
多段breakは考えた奴は脳味噌が糞すぐる…
ループの深さを変えたとたんにバグるじゃん?
ループの深さは金輪際変えないとか
ループの深さを変えるとき必ずループ全体を机上確認するとかだったら
gotoでも逝けるじゃん??

134:デフォルトの名無しさん
20/02/01 22:53:08.37 vKrtBnhX.net
ああ、そうだな
break 2だとfor文が3重になったときにバグるな
個人的には面白いと思ったが

135:デフォルトの名無しさん
20/02/01 22:53:40.31 tav2AwxI.net
使い所は2次元構造の2重ループとかだよ

136:デフォルトの名無しさん
20/02/01 22:55:40.65 rsRLlL5x.net
画像処理とかで2重ループ良く書くけど、最近2段階breakしたくなった記憶がないな
実は要らないんじゃね

137:デフォルトの名無しさん
20/02/01 22:56:47 tav2AwxI.net
じゃあbreakもいらないんじゃない?

138:デフォルトの名無しさん
20/02/01 22:59:11 7G0Z2VlM.net
まーC++がプリプロセッサを殺すために進化しているのと同様
Cはgotoを殺すために進化したともいえるわけで
たとえば、関数、for、return、などなど、制御構造にかかわるほとんどの物が
gotoを殺すために有るといってもよい
だから、もっとgotoを殺すにはどうすればよいか、考えるのは自然な発想かと

C++でもテンプレートなどで出来ないことはプリプロセッサでしなければならないし
ただ、同じことがテンプレートとかで出来るならそのほうが良いだろうし
もっとプリプロセッサを殺すためにはどういう機能を追加すればよいか考えるのは自然な事だろう

同じ同じ

139:◆QZaw55cn4c
20/02/01 23:01:32 EspH/Y2K.net
goto とか break とか continue とか、他の言語(javaとか)でもいろいろ小手先的に弄られているけれども、それに何の意味があるのかいつも不思議におもいますね
C/C++ の goto とかはどう頑張っても関数の中でだけしか跳べないのだから、BASIC の GOTO ほどにはスパゲッティ状態を招けないのではと考えます
無論、その関数が異様にデカければ別ですが、そんなデカい関数を書くほうが問題であって goto が問題なのではないかと

140:デフォルトの名無しさん
20/02/01 23:11:38.33 tav2AwxI.net
ループを抜ける為にだけ使われる変数を使ったループ抜け
世の中にはたくさんこういうコードがある
たくさんのコードを見る機会がある人なら
たくさん見たことがあるはず
gotoネガティブキャンペーンのせいだよ

141:デフォルトの名無しさん
20/02/01 23:11:46.92 JWECbGc7.net
>>136
gotoが使わないで済むように進化してくのは期待している。
ただ現状として、多重ループを抜ける場合みたいにgotoを使うのがシンプルで分かりやすいならば、毛嫌いしたり盲目的に原則振りかざすよりgoto使えばいいだけのことだと思うよ。

142:デフォルトの名無しさん
20/02/01 23:32:29 TULylXcw.net
>>138
お前ほんとに病気だな
多重ループ脱出でgotoが簡潔なのはみなわかってる
でもgotoは自由度が高すぎて構造を壊す可能性があるわけ
だから改善するとしたら何があるかという話をしてるだけであって
別にgoto禁止とかの話はしてない
好きなだけ使ってろよ
あと構造化プログラミングぐらい知っとけ

143:デフォルトの名無しさん
20/02/01 23:45:45.20 tav2AwxI.net
>>140
色々と違う

144:デフォルトの名無しさん
20/02/01 23:46:54.20 vKrtBnhX.net
for () {
break label;
} label;
for () {
for () {
break label1
} label2;
} label1;
こういう風にfor文のお尻にラベルを付けられるようにすれば局所化したgoto風のbreakが使えるのでは

145:デフォルトの名無しさん
20/02/01 23:48:30.11 tav2AwxI.net
for () {
goto label;
} label:;
for () {
for () {
goto label1;
} label2:;
} label1:;

146:デフォルトの名無しさん
20/02/01 23:49:00.26 tav2AwxI.net
今でも出来る

147:デフォルトの名無しさん
20/02/01 23:49:30.89 wBNP08tW.net
Pythonはループにラベルをつける手が使えた
と思った(幻覚でなければ

148:デフォルトの名無しさん
20/02/01 23:52:18.24 pUJoLXPw.net
またgotoの話になってんのかよ。。
だからいっそ禁止にと思ったが、それよりもさらにクソな構文の提案が出てたり。。
想定を超えた馬鹿どもばっかりじゃねーか。

149:デフォルトの名無しさん
20/02/01 23:54:48.66 tav2AwxI.net
無理に会話に入って来なくて良いよ

150:デフォルトの名無しさん
20/02/01 23:59:22.03 7G0Z2VlM.net
ただ、凝りに凝った複雑怪奇なテンプレートより
シンプルに作ったマクロの方が読みやすいって事例も当然あるだろうよ
てか、わりと、最近、残念ながらその傾向が・・・で、C++が嫌われる理由にも・・・
だからgotoを殺すのも上手くやらないとむしろ酷くなる
そこが腕の振るいどころで面白い部分でもあるし、言語作ってる連中もそんなことで頭いっぱい
変なゲーム性が有って、逆にそれがまたダメな部分でもあって
あと、妹大好き

151:デフォルトの名無しさん
20/02/02 00:17:33.29 rWwvB4I9.net
多段breakの使用頻度がそれほど多くないことを加味すれば
break n;方式が妥当だろうね
これだと2重ループを3重ループに書き換えたときにバグる、とか
意味不明なことを言ってる奴もいるが
それは1重ループをbreakで抜けてたのを2重ループに書き換えたらバグった
と言ってるのと同じであって、当たり前の話だし、今でも同じことだ
break n;が一番シンプルで妥当だと思うね

152:デフォルトの名無しさん
20/02/02 00:32:21 7b/FZYuN.net
breakの後にマジックナンバーを書くのが気に入らない
定数には意味のわかる名前を付けたい

153:デフォルトの名無しさん
20/02/02 00:33:00 rWwvB4I9.net
ただし、break n;のnの部分が変数でもOKとかなってたらかなりウザいが
そこはnは定数と定めたいね、でもC++の場合は定数と言っても・・・
複雑にしようと思えばいくらでも複雑にできるわなー
普通に使う分には問題ないかと
明日からbreak n;が入っても、たぶん誰も困らないし、混乱も起きないだろう
割のいい賭けだし、俺はアリだと思うね

154:デフォルトの名無しさん
20/02/02 00:33:32 7b/FZYuN.net
breakとbreak nが同じとか意味不明な主張をなさる御仁がいらっしゃるが
じゃあcontinueがcontinue nになったらどんな地獄が発生するか
考えてみたら良い

155:デフォルトの名無しさん
20/02/02 00:48:04.23 rWwvB4I9.net
別にcontinue n;
全然ありでしょ
これと同等の事を、何か別の方法でやるよりスマート
for(;;){
 bool do_continue = false;
 for(;;){
  if(...){ do_continue = true; break;}
 }
 if( do_continue ){ continue; }
}

for(;;){
 for(;;){
  if(...){ continue 2; }
 }
}

156:デフォルトの名無しさん
20/02/02 01:00:22.64 7b/FZYuN.net
do {
 do {
  ...
  if (cond) {
   continue 2;
  }
 } while (副作用の有る式1);
} while (副作用の有る式2);
とから?

157:デフォルトの名無しさん
20/02/02 01:03:23.27 0Gqmr542.net
break nなんてやるくらいならbreak label で抜けるループを明示的に指定したいな

ループにラベルをつけるとして、先頭では見づらくて邪魔だな

ループの末尾にラベルを付ければ見やすいけど、それだとlabelついたループを抜けると言うよりlabelの指す位置へのジャンプだな

なんだgotoでいいじゃん
個人的には breakto label という記法でループ出口に書いたラベルに飛べるとするのが分かりやすいと思うけど、こんなことに新しい予約語を導入するくらいならgotoで十分だと思う。

158:デフォルトの名無しさん
20/02/02 01:06:28.34 7b/FZYuN.net
break nが良いとか言ってる椰子は
ついでに行番号も復活してほしいと思っているに違いナス

159:デフォルトの名無しさん
20/02/02 01:15:40.31 rWwvB4I9.net
do{
 do{
  if(...) goto NEXT;
 }while(...);
NEXT;
}while(...);
と等価だろう
要はこういうgotoを置き換えるために作られたのが
continueなのだから、そのルールに従うのが普通だろうね
もしくはgoto使わずにフラグでやっても、どのみち内側のループの条件式は実行されないわけで
do{
 bool do_continue = false;
 do{
  if(...){ do_continue = true; break; }
 }while(...);
 if(do_continue) continue;
}while(...);
これ以外の解釈ってのは難しい

160:デフォルトの名無しさん
20/02/02 02:23:51 93obPCeA.net
gotoの話題って今でもこんなに盛り上がるのか

161:デフォルトの名無しさん
20/02/02 02:49:52.74 LC7cWz9a.net
老害が多いから

162:デフォルトの名無しさん
20/02/02 03:26:54 EDNK6zQt.net
そういう機能要望みたいなのここでやる意味ある?
C++Slackでやった方がよくない?

163:デフォルトの名無しさん
20/02/02 03:45:22 mzCY/+E0.net
英語は敷居が高いよ。

164:デフォルトの名無しさん
20/02/02 05:06:46.10 DTIMfhpJ.net
         ,,-―--、
        |:::::::::::::;;;ノ 
        |::::::::::( 」 <もう構造化は破綻してるんだからおとなしく goto しとけよな!
        ノノノ ヽ_l  
       ,,-┴―┴- 、    ∩_
     /,|┌-[]─┐| \  (  ノ
      / ヽ| |  バ  | '、/\ / /
     / `./| |  カ  |  |\   /
     \ ヽ| lゝ    |  |  \__/
     \ |  ̄ ̄ ̄   |
      ⊂|______|
       |l_l i l_l |
       |   ┬    |

165:デフォルトの名無しさん
20/02/02 06:40:45 mzCY/+E0.net
じゃあswitchも要らないって事じゃないか。

166:◆QZaw55cn4c
20/02/02 06:51:18 9jRHEnns.net
>>149
break n なんて間抜けの極みだと思いますね
java にはラベル付き break が存在して、ほとんど goto です URLリンク(www.sejuku.net)

167:デフォルトの名無しさん
20/02/02 07:37:33 SWo7Ruqh


168:.net



169:デフォルトの名無しさん
20/02/02 07:44:05 pBPOCWQ5.net
結論が先にあって理由が後付けだから支離滅裂、一貫性の欠片もない事を書く
もはや宗教

170:デフォルトの名無しさん
20/02/02 07:46:45 SWo7Ruqh.net
ほんと、宗教だね
洗脳されてるやつは強固に思考停止していて
何を言おうが馬の耳に念仏だ

171:デフォルトの名無しさん
20/02/02 08:06:14 SWo7Ruqh.net
>>159
根底がわかってねえやつが多いからだよ
古典的な基本がわかってねえやつは若造と爺のどっちに多いだろうね
頓珍漢なことを書いて袋叩きにされたからって逆恨みする精神性なやつはどっちに多いだろうね

172:デフォルトの名無しさん
20/02/02 08:18:25 9aZda2U6.net
break labelでいいんじゃね
gotoと同じだが、labelがbreak的な位置にない場合コンパイルエラーになれば良い

173:デフォルトの名無しさん
20/02/02 08:27:24 DTIMfhpJ.net
label貼るくらいならgoto使う

174:デフォルトの名無しさん
20/02/02 09:22:07 mzCY/+E0.net
gotoは便利なswitchだからね。
便利すぎるわこれ。
これからも積極的に使っていこうと思います。

175:デフォルトの名無しさん
20/02/02 09:40:59.69 7b/FZYuN.net
さすがにgotoでジャンプテーブル化の最適化までやる処理系は
まれだと思う

176:デフォルトの名無しさん
20/02/02 09:43:27.45 mzCY/+E0.net
アドレス直接指定なのに、テーブル必要ないんじゃないの。
テーブル必要ない分、switchより有利なんじゃないかと思いました。

177:デフォルトの名無しさん
20/02/02 09:51:12.60 7b/FZYuN.net
(条件分岐無しの素のgotoだけでどうやってswitchの便利な代替品にするつもりなのやら…

178:デフォルトの名無しさん
20/02/02 09:53:50.90 mzCY/+E0.net
頑張ってひねり出した!!
けどウンコにしか見えない。
納得できるものを頼む。

179:デフォルトの名無しさん
20/02/02 09:55:31.36 0Gqmr542.net
>>175
お前が何をいってるのか、何を考えてるのか理解できないのに、お前を納得させられる奴なんていないぞw

180:デフォルトの名無しさん
20/02/02 10:10:20.38 o79zkFFu.net
お尻にラベルつけて break ラベル; がいいとか言ってる奴は構造化の意味がわかってなさ過ぎ
ラベルは飛び先じゃなくてループに付けて break ラベル; でそのループから抜けるんだよ
なので break ラベル が使える言語はたいていループの頭にラベルをつけるようになってる
あと break レベル数 とか言ってる老害は早く滅びろ

181:デフォルトの名無しさん
20/02/02 10:28:45.43 DTIMfhpJ.net
名前使うならこんな感じか
void main(){
auto scope1 {
for(;;){
 for(){
  break scope1;
 }
}
}

182:デフォルトの名無しさん
20/02/02 10:29:18.43 mzCY/+E0.net
>>176
俺自身何を言っているのかよくわからないのだが。

183:デフォルトの名無しさん
20/02/02 10:31:44.19 DTIMfhpJ.net
もしくは、forの直後
void main(){
for(;;)scope1{
 for(;;){
  break scope1;
 }
}
}

184:デフォルトの名無しさん
20/02/02 10:58:10 MNdu0823.net
void main()の時点で読む気失せた

185:デフォルトの名無しさん
20/02/02 11:16:46.30 DTIMfhpJ.net
んだこんにゃろ

186:デフォルトの名無しさん
20/02/02 11:22:39.21 D8WvcGqJ.net
ループの先頭にラベルを書くくらいなら
gotoの方が分かりやすい

187:デフォルトの名無しさん
20/02/02 11:25:45 mzCY/+E0.net
あの、スレとは全然関係ないんだけど。
Boostでデバッグとリリース判別するマクロってありますか?
イテレータを1億回ほど回すのでデバッグだけテストを迂回したいんですが。

188:デフォルトの名無しさん
20/02/02 11:30:31.96 9aZda2U6.net
なぜboost?

189:デフォルトの名無しさん
20/02/02 11:34:47.86 mzCY/+E0.net
NDEBUGを知らなかったからです。
おまえらおせーよ。

190:デフォルトの名無しさん
20/02/02 11:39:04.55 SWo7Ruqh.net
NDEBUGってISO/IEC9899やん
おまえさんがboostっていうから
レスポンス鈍かったんだよ

191:デフォルトの名無しさん
20/02/02 11:48:10 mzCY/+E0.net
だよね。
そうだと思いました。

192:デフォルトの名無しさん
20/02/02 11:49:31 mzCY/+E0.net
今度からはよく考えて質問しようと思います。

193:デフォルトの名無しさん
20/02/02 14:38:02 rWwvB4I9.net
今の一重ループを抜けるときの普通のbreakにはラベルを付けないのに
多重ループを抜けるためのbreakにはラベルが無いと読みにくくなるっていう
発想というか対称性というか整合性というか必然性が全く見えないんだが
今ラベル無しの一重breakで誰も発狂することもなく普通に使えているのに
多重breakになった瞬間にラベルが無きゃダメってなるのはなんか弱い
同じことを二回書いたけども
ラベル無しでも別に普通に読めるでしょ、今まで読めてるんだから
大体ラベル付けるんならgotoと手間自体は変わりないしな

194:デフォルトの名無しさん
20/02/02 14:40:18 mzCY/+E0.net
今多発今多動ラ大
読み解けなかった。

195:デフォルトの名無しさん
20/02/02 14:41:51 gkoi3ncl.net
>>190
同意

196:デフォルトの名無しさん
20/02/02 14:43:14 mzCY/+E0.net
え、わかるんだ。
すげー。

197:デフォルトの名無しさん
20/02/02 14:47:27 gXxB23XL.net
下方向にだけ飛べるgoto相当機能があればgotoは要らなくなるんじゃない?

198:デフォルトの名無しさん
20/02/02 14:53:57 7b/FZYuN.net
>>190は、Cにgoto <label>とbreakがあるのになぜCはbreak nを設けるところまで踏み込まなかったのか、とか
break <n>で即値<n>に行き当たったコード閲覧者が行き先を知るために何をせねばならないかとか、
考えた方が良いので
は…

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

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

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

202:デフォルトの名無しさん
20/02/02 15:01:24.88 rWwvB4I9.net
大体だよ、多重ループはbreakで抜けれないので、仕方なくgoto使うときの
そのgotoを使う都合で必要になった、そのラベルをだよ
じゃーブロックにラベルをつけましょう、ってなんでそーなんだよ
元々のbreakにはラベルなんかねーのに
breakにラベルが無くて混乱したやつ居るか?
ご飯が無いからパンを食べてた状況なのに
すり替わってパンありきになって、パンが無きゃ話にならないとか言い出す始末
別にパン(ラベル)なんかなくても、ご飯があるならご飯食べろよ
ラヘルラベルって、そのラベルがどこ由来か考えてみろよ、gotoだろ?
もう一度言うが、もともとのbreakにはラベルなんかないし、それでみんな普通に過ごせてるし、混乱も起きてない
ただ、gotoで抜けるためには文法上/機能上ラベルが必要だったねってだけで、そこに着目しても仕方がない
本質的には無くても別に困らない

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

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

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

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

207:
20/02/02 15:14:36.78 Rn0kkYyt.net
>>199
私と認識が似ていますね
>>137
>goto とか break とか continue とか、他の言語(javaとか)でもいろいろ小手先的に弄られているけれども、それに何の意味があるのかいつも不思議におもいますね



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



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

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

211:デフォルトの名無しさん
20/02/02 15:24:46.36 jpTipLln.net
>>201
現実ありえないのは重々承知したうえで書くけど
100重ループを脱出するとき数を数えたくないだろうなって思うじゃん
ほかにも3重ループとかで2ndと3rdのループから共通の脱出先ラベルにもできるわけじゃん
文法を拡張する前提ならそこまで想定すべきだと思うね
粗野な即値の数字じゃなくて意味ごとに名前をつけられるようにしてきたのが
プログラミング言語の進化の歴史なのでおれは自然だと思うよ
というかそういう観点からラベル付きbreakというのは他の言語にはあるわけで
で今話してるのはもっと書きやすく読みやすくできないかというトピックでしょ
break Nは使えるだろうけど洗練されてない感じ

212:デフォルトの名無しさん
20/02/02 15:27:11.67 gkoi3ncl.net
break [n] はラベル名を考えなくて良い利点がある
使えるなら使いたい
ラベル名を考える必要があるならgotoで良い
ループの先頭で名前を付けるのはgotoより見づらいから使わない

213:デフォルトの名無しさん
20/02/02 16:01:27 o79zkFFu.net
break n とか言ってる奴は何故か>>150をスルーしてて笑うわ

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

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

216:デフォルトの名無しさん
20/02/02 16:35:55 SWo7Ruqh.net
break 5; //C
GOTO 5 : REM BASIC

217:デフォルトの名無しさん
20/02/02 16:37:04 gkoi3ncl.net
マジックナンバーがイヤなら
break break;

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

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

220:デフォルトの名無しさん
20/02/02 17:03:09 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:デフォルトの名無しさん
20/02/02 17:05:11 +9zyTEwm.net
>>216
>>75

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

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

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

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

226:デフォルトの名無しさん
20/02/02 18:00:14 mzCY/+E0.net
やってみます。
アリガト。

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

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

229:デフォルトの名無しさん
20/02/02 18:24:38 jpTipLln.net
>>220
(void)func();

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

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

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

233:◆QZaw55cn4c
20/02/02 18:31:42 Rn0kkYyt.net
>>226
>昔のBASICは、行番号を勝手に
auto 文だったかな…

234:デフォルトの名無しさん
20/02/02 19:36:27.12 7b/FZYuN.net
VB6には行番号は無かった

235:デフォルトの名無しさん
20/02/02 20:26:55 GV9CDSqK.net
みんなってc++で何を作ってるの?
ゲーム?

236:デフォルトの名無しさん
20/02/02 21:07:54.17 YP+sfqkD.net
何も作ってないやつがほとんどだろ

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

238:デフォルトの名無しさん
20/02/02 21:21:43.96 DTIMfhpJ.net
テキストエディター
3Dモデラー
メーラー

239:デフォルトの名無しさん
20/02/02 21:25:09.08 vTjBAXNr.net
競技プログラミング

240:デフォルトの名無しさん
20/02/02 21:39:16 GV9CDSqK.net
アプリ開発にも使われるのかー
あざした

241:デフォルトの名無しさん
20/02/02 22:06:04 mzCY/+E0.net
いまダブルアレイやってる。

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

243:デフォルトの名無しさん
20/02/02 22:10:09 mzCY/+E0.net
検索はstd::setの10倍くらい早いな。

244:デフォルトの名無しさん
20/02/02 22:15:25 0Gqmr542.net
>>239
相談ができたらまた来い

245:デフォルトの名無しさん
20/02/02 22:54:22 mzCY/+E0.net
>>240
よろしくお願いします。

246:◆QZaw55cn4c
20/02/02 23:01:19 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 レファレンスのどこを見て洞察するべきなのでしょうか?

実際のお題は相変わらずエラトステネスのふるいです URLリンク(ideone.com)

247:
20/02/02 23:18:14.73 Rn0kkYyt.net
>>231,233
私は今のところエラトステネスの篩にご執心、という体たらくです…

248:デフォルトの名無しさん
20/02/03 00:01:01 8riGTZSm.net
エラトステネスのふるいで
なんでファイルのリードが必要?

249:◆QZaw55cn4c
20/02/03 00:22:49 X2PbBOAI.net
>>244
結構昔から
URLリンク(www.asahi-net.or.jp)
にとても興味を持っていたのです、二つの隣り合った素数の差を「素数のギャップ」と呼ぶことにしたとき、

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

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

250:デフォルトの名無しさん
20/02/03 00:38:27 e9E2NTEb.net
その問題だけなら
2次キャッシュに収まるくらいに分けてふるえば速い
間隔も大して大きくならないので
ヒストグラムはオンメモリで済む

スレッドも簡単に分割出来るので
論理コア数と同じだけスレッドを作って回す

251:◆QZaw55cn4c
20/02/03 00:44:34 X2PbBOAI.net
>>246
コメントありがとうございます

>間隔も大して大きくならないのでヒストグラムはオンメモリで済む
確かに 10^10 まででも最大 354 というのには驚きました、案外密に分布しているんですね

>2次キャッシュに収まるくらいに分けてふるえば速い
constexpr unsigned int windowSize_Default = 30 * 5000000; はでかすぎ、ですか

いただいたアイディアは、どれも私には難易度が高いのですが、ぼちぼち書いていきます…

252:デフォルトの名無しさん
20/02/03 00:44:55 e9E2NTEb.net
AVXレジスタを使って小さな素数の倍数を消して
ビット命令で大きな素数の倍数を消す
大きな素数の倍数は210ずつ処理する

昔素数の数を数えるプログラムを書いたことがあって
記憶に残ってる範囲ではこんな感じ

253:デフォルトの名無しさん
20/02/03 00:55:53 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
20/02/03 00:55:55 X2PbBOAI.net
>>248
コメントありがとうございます!

>大きな素数の倍数は210ずつ処理する
私は、2*3*5 = 30 でわりと満足していましたが、2*3*5*7=210 まで拡張されたのですか!?うーむ…

255:◆QZaw55cn4c
20/02/03 00:57:46 X2PbBOAI.net
>>249
mon に入って、プログラムタイトルのコメントの行番号を手打ちで全部 0 にする、とか…
どうでもいい話でごめんなさい…

256:デフォルトの名無しさん
20/02/03 01:52:57 YoBHNt10.net
素数は、6n ± 1 か。
6n + 1, 6n + 5 だけ

6n + 3 は、3の倍数だから、素数じゃない

257:252
20/02/03 01:58:12 YoBHNt10.net
A = 6n + 1, B = 6n + 5 とすると、

AA の並びなら、差は6
AB なら、4

BA なら、2
BB なら、6

A,B になる確率がランダムとすると、6 になる確率が2倍!

258:はちみつ餃子 ◆8X2XSCHEME
20/02/03 11:14:43 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:デフォルトの名無しさん
20/02/03 12:59:28 jOrmfTQL.net
>>250
ビット命令が48個続くだけ
それほど大変じゃない

今だともっと


260:良い命令があるかも



261:◆QZaw55cn4c
20/02/03 20:59:04 X2PbBOAI.net
>>254
コメントありがとうございます。いまいちよくわかっていない iostream. の全体像を掴めるよう、いただいたヒントも頼りに潜ってみます

>FILE の fseek のラッピングとして実装することを想定したんじゃないかなぁ。

fseek() が 64bit オフセットならいいのですが
あるいは win32api::SetEndOfFile() のような、オフセットを指定して trunc する方法があればいいのですが
>>242 のバイナリファイルは単に uint64_t な素数を突っ込んでいるものですが、ある日末尾が中途半端にちょん切れてしまったのです…

262:デフォルトの名無しさん
20/02/03 21:17:59 Exvuz9nd.net
>>256
それファイルに書く必要ある?
仮想メモリ頼りにメモリでやれば?

263:はちみつ餃子 ◆8X2XSCHEME
20/02/03 21:26:54 HBzF0G80.net
>>256
巨大なファイルにちょくちょくシークしながらアクセスするなら
メモリマップトファイルを使った方が楽やで。

264:はちみつ餃子
20/02/03 22:20:22.51 HBzF0G80.net
>>256
ググってみたら iostream まわりの継承関係を表した図がすぐ見つかったわ。
URLリンク(www.ntu.edu.sg)
だけど継承関係の他にストリームがバッファとロケールを所有しているという関係もあるのが分かり難いかも。
cpprefjp の rdbuf の項目を見たらストリームのバッファを入れ替える例が載ってる。
URLリンク(cpprefjp.github.io)
本当に「入出力」を司っているのはバッファであって、
ストリームはそれに書式化の機能をかぶせている感じ。

265:◆QZaw55cn4c
20/02/05 22:01:06 uTOW/8lH.net
>>257
それはダメでした。win7, 16GB、素数の大きさが10^11 程度でスラッシングが発生して win7 では使い物になりません
GIMPS cli のように、普段は意識することなく3年くらいかけて計算するようにしたいです

>>258
着々と容量が増加するファイルに対して mmap は使えるのですか?win32api::CreateFileMapping では mmap を確立した後にファイルサイズを増やしてはいけない制限がありました

266:デフォルトの名無しさん
20/02/05 22:31:00 zWcxLf4u.net
最初から最大ファイルサイズにしとくとか

267:はちみつ餃子 ◆8X2XSCHEME
20/02/05 22:32:01 85RuEno5.net
>>260
そんな制限があるんか。

連続した巨大なメモリを予約しておいて、
適当な大きさに区切ってファイルにマッピングすればええで。
ファイルを複数に分けることになるけど、
見かけ上は巨大なメモリとして扱えるし、
容量が増加する都度に新しいファイルを作って割り当てればええ。

というやり方を思いついたので具体的に出来るんかいなと思って調べてみたら
MapViewOfFileEx の最後の要素でアドレスを指定する機能がある。
VirtualAlloc で予約した範囲は MapViewOfFileEx で使えないので、
どうやって空いているメモリ空間を探せばええんやろと思ったら
VirtualAlloc で予約した直後に VirtualFree をつこうたらええんやて。
URLリンク(stackoverflow.com)
なんという泥臭い方法や……。

てなわけで、若干の面倒くさい手順が要るけどそれっぽいことは出来る。
この手順をいい感じに抽象化するクラスを作ったら色々と使えそうやな。
期待してるで!

268:デフォルトの名無しさん
20/02/05 22:35:23 bIRSo9XQ.net
普通にAPIで巨大ファイル作れてるけど
CreateFile / WriteFile

269:はちみつ餃子 ◆8X2XSCHEME
20/02/05 22:50:53 85RuEno5.net
最初からどでかいファイルを作る余裕があるならその方が簡単で


270:はあるわな。 どんくらいデカいのがいるんや? せいぜい数十ギガとかそんなもんやろ? ケチらんと行くっちゅうのもアリや。



271:デフォルトの名無しさん
20/02/05 23:33:50.77 bIRSo9XQ.net
CreateFile
WriteFile
ReadFile
SetFilePointerEx
SetEndOfFile

272:デフォルトの名無しさん
20/02/06 13:03:55.59 sNihMBVC.net
こんな感じ?
.... 0101 0000 0100 0101 0001 0100 0101 0110

273:デフォルトの名無しさん
20/02/06 16:50:43 zCd4f5nI.net
STLコンテナ (仮にvとする) のサイズの分だけfor文を回したいってときに
for(int i=0; i<v.size(); i++)
と書くことが多いんだが、v.size()はintじゃないので警告が出る。

警告を一つ残らず潰したいタチだから毎回こういうのはintにキャストしてるんだが、キャストのコストってどんなもんなんだろ。
「大したことないからOK」って立場と「そもそもv.size()が毎回呼ばれてる時点でナンセンスだから改善すべき」って立場と「その警告は無視しなさい」って立場などがあると思うが、皆はどうしてる?
逆順にしたいことなどがよくあるので、範囲for文を使えってのは今回はナシで。

特定の環境、コードでのテストはできるが、一般論として、あるいは皆さんのスタンスとしてはどうですか。

274:デフォルトの名無しさん
20/02/06 17:11:56 v+RXRHu+.net
コンパイルの警告のためだけだから
実行時コストは0じゃね

275:デフォルトの名無しさん
20/02/06 17:13:00 v+RXRHu+.net
手でタイプするコストうんぬん言うなら
マクロで #define LEN(s) ((int)s.size())

276:はちみつ餃子 ◆8X2XSCHEME
20/02/06 17:18:31 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:デフォルトの名無しさん
20/02/06 17:24:46 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:デフォルトの名無しさん
20/02/06 17:39:05 /W9iMVJD.net
>>267
コスト(性能)最優先か
見やすさ最優先か
タイプ数最優先か
次第

キャストのコストって言うけど
intとv.size()のサイズが違えば
どのみち型変換する

コンテナ使うような場所でこんな微妙なコストを気にしてもしょうがないし
>>270は面倒

(業務外だと)私は警告放置が多い
警告を消したい場合はsize_tにするか
コンパイラの設定を変えるか

業務で集団でのコーディングの場合は
他の部分を見て空気を読む

279:デフォルトの名無しさん
20/02/06 17:43:47 /W9iMVJD.net
>>269は色々な理由で無い

280:デフォルトの名無しさん
20/02/06 17:44:41 v+RXRHu+.net
for(unsigned int i=0, len=v.size(); i<len; i++)
これもよく見るか

281:デフォルトの名無しさん
20/02/06 17:46:58 5ihPHl5F.net
auto i=0uにしてるな

282:デフォルトの名無しさん
20/02/06 17:48:08 VEO7DUBt.net
>>269
template <typename T> inline auto len(T s) { return s.size(); }

283:デフォルトの名無しさん
20/02/06 17:48:51 VEO7DUBt.net
あ、右辺値参照わすれたw わりーわりー

284:デフォルトの名無しさん
20/02/06 17:49:18 /W9iMVJD.net
警告を消す為だけなら設定を変えるのが良い

285:デフォルトの名無しさん
20/02/06 17:50:35 /W9iMVJD.net
>>276



286:何の解決にもなってない



287:はちみつ餃子 ◆8X2XSCHEME
20/02/06 17:54:27 jSrTrJa0.net
>>279
良くはないがマクロよりはマシ

288:デフォルトの名無しさん
20/02/06 18:09:13 3IyMYliq.net
>>274
その形が一番、速度的には良い。
forの第二式は毎回評価されるが、v.size()の部分をコンパイラが自動的に最適化するのは非常に難しい場合があるから。

289:デフォルトの名無しさん
20/02/06 18:11:29 3IyMYliq.net
v.size()の値が、ループ内で変化しない「ループ定数」であると判断するのは
コンパイラにとってはものすごく難しい場合がある。
ループ定数であると判断された場合にのみ、>>274のような最適化が行われる可能性が出てくるが、判定できなければループするたびに毎回評価されてしまうのでループの実行速度が遅くなってしまう。

290:デフォルトの名無しさん
20/02/06 18:30:55 F7wYIGq0.net
マクロってそんなに危険なんですか。

291:デフォルトの名無しさん
20/02/06 18:33:27 3IyMYliq.net
>>283
本人だけが開発していて、記憶力が優れていて絶対に使い方を間違いなければ特に問題ないと思うが、使い方を間違うと危険なことがある。
エラーも出ずに変な動作をしてしまうことがある。
でもそれさえ気を付けていれば特に問題ないとも言える。

292:デフォルトの名無しさん
20/02/06 18:37:31 3IyMYliq.net
>>269
マクロで書く場合、
#define LEN(_s_) ((int)((_s_).size()))
と書いたほうが良い。
特に、s や _s_ を()で囲むのは必須。
sを_s_と書くのは、ミスタイプがあった場合の備え。
例えば、マクロの仮引数にsと書いているのに、マクロの定義部分をtと
書き間違えていて、かつ、マクロを使う場所に t という変数がたまたま使われて
いたとすれば、エラーにならないのに間違った動作をしてしまう。
_s_と書いていれば、_s_という変数は絶対に使われないのでこの心配がない。
そのため、マクロの引数は伝統的に、_s_などのように書くことが推奨されている。

293:デフォルトの名無しさん
20/02/06 18:50:57 v+RXRHu+.net
バッドノウハウ紹介乙

>>285
>>276

294:デフォルトの名無しさん
20/02/06 19:30:05 /W9iMVJD.net
>>280
適してるかどうかはともかく
>>269は解決にはなってる
>>276は解決になってない

295:デフォルトの名無しさん
20/02/06 19:38:40 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:デフォルトの名無しさん
20/02/06 19:42:58 bk3hpXlE.net
>>275に一票

297:デフォルトの名無しさん
20/02/06 20:10:32 9e+8kNR/.net
キャスト一回って機械語4つくらいじゃあないの?
そこまでシビアってのは競技プログラミングか脳手術ロボットでも作ってんの?

298:デフォルトの名無しさん
20/02/06 20:24:03 /W9iMVJD.net
4個もいらん

299:デフォルトの名無しさん
20/02/06 20:29:38 /W9iMVJD.net
糞コンパイラまで考えてパフォーマンスを考えると>>288だけど
そもそもコンテナ経由でアクセスする時点でそんな事は誤差

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

300:デフォルトの名無しさん
20/02/06 20:40:31 3IyMYliq.net
>>290
同じBIT数やBIT数が少なくなる場合の整数型から整数型へのcastは、マシン語では0命令(命令が出力されない)。
高級言語では違う型でもマシン語レベルでは変わらないため。
BIT数が多くなる場合には、x86の場合は、movzx や movsx が使われる。

301:デフォルトの名無しさん
20/02/06 20:41:12 3IyMYliq.net
>>292
実際には、最適化が上手く行かないことも多いので差が出てくることは多い。

302:デフォルトの名無しさん
20/02/06 20:42:39 3IyMYliq.net
>>293
つまり、符号無しや符号付の区別はマシン語ではないので C/C++言語で
castしても高級言語レベルでの意味が変わるだけでマシン語レベルでは
何の命令も増えることはない。

303:デフォルトの名無しさん
20/02/06 20:49:08.28 VEO7DUBt.net
素直にrange-based-for
これが出てきたことの影響のでかさがわかってないやつ多すぎ
禿4にはfor_eachを使う前にもっと適した関数を探せとあるが
本当にそうか自分の頭で考えろ

304:デフォルトの名無しさん
20/02/06 20:56:38 /W9iMVJD.net
コストを気にしてる人に対してトンチンカン

305:デフォルトの名無しさん
20/02/06 21:03:18 /W9iMVJD.net
普通のコンパイラなら
コンパイル単位内の関数は一緒に最適化するので
.size() の中で値を返してるだけなら
ループの外に追い出してくれる
ターゲットがPCなら気にするな

それよりv[i]の方が重い

306:デフォルトの名無しさん
20/02/06 21:03:40 VEO7DUBt.net
何もわかってねえやつ

307:デフォルトの名無しさん
20/02/06 21:17:40 X3a4Tx/S.net
未だindexループよりrange-basedのほうが早い処理系がない件

>>298
v[i]が重いってどんなstlコンテナだよ

308:◆QZaw55cn4c
20/02/06 22:12:04 6P0xXhLK.net
>>267
>警告を一つ残らず潰したいタチだから
ここまでは同感です

>毎回こういうのはintにキャストしてるんだが、
私なら int i を unsigned int i にしますが

309:デフォルトの名無しさん
20/02/06 22:16:59 cE8ku0Th.net
templete<typename T>auto LEN(const T& v)->signed T{return (signed T)v;}

310:デフォルトの名無しさん
20/02/06 22:22:15 j/UITOXa.net
とりあえず大きい方に合わせとけば間違いないんだからsize_tでいいじゃん
そのvの要素が将来に渡って21億個を超えない保証がどこにある?

311:デフォルトの名無しさん
20/02/06 22:45:07.03 /W9iMVJD.net
>>300
整数のキャストに比べればはるかに重い
そのレベルを気にするなら生ポ

312:デフォルトの名無しさん
20/02/06 22:53:37 sigCaOr9.net
x86なら32bit命令使った方がバイナリ小さい

313:デフォルトの名無しさん
20/02/06 22:57:14 sigCaOr9.net
>>304
vectorだと生ポと変わらんでしょ
もちろん最適化前提で

314:デフォルトの名無しさん
20/02/06 23:03:20 YUB/hFRs.net
>>300
range-basedはiterator
c++のiteratorはindexが速くなる連続アドレスのコンテナならpointerと同じコンパイル結果になる

indexアクセスがpointerより遅くないなら、それはコンパイラの最適化のお陰

315:デフォルトの名無しさん
20/02/06 23:13:46 /W9iMVJD.net
>>306
生ポと変わらなきゃ良いんだけど
変わるんだよ
VisualStudioやチープなコンパイラだと

いずれにしろここから先は
具体的な環境とループ回数やループの中身全体で考えないと意味がない
なんせ1クロックレベルのことを気にしてるようなので

実はメモリアクセスが支配的で
他の最適化は全く意味がないとか

316:デフォルトの名無しさん
20/02/06 23:20:09.64 /W9iMVJD.net
SIMD命令 / DSP命令 / スレッド分け / GPU
他のループと合わせる / ループを分ける
ループアンロール
依存性の削減 / 式変形
アルゴリズムの改善
キャッシュ化 / テーブル化
いろんな最適化がある

317:デフォルトの名無しさん
20/02/06 23:45:25.65 f00f0WlE.net
vectorの[]は定数時間

318:はちみつ餃子 ◆8X2XSCHEME
20/02/07 01:10:19 BIRgOLIs.net
ところで元々の質問の >>267 は整数の型が合わないのどのくらい気にする?
っていうのを「一般論として」聞いてるので、これに対しての選択肢を派閥系統樹形式にしてみた

├→ きちんと合わせる派
│  ├→ その環境で合ってれば良いよ派 (移植性は気にしない派)
│  ├→ コンパイラの警告は潰す派
│  │  ├→ 理解しなくてもキャストで合わせるので十分派
│  │  └→ 警告される箇所は仕様の詳細を調べる派
│  └→ size_t とか size_type とか使え派 (言語仕様原理主義派)
├→ 問題がなければ気にしない派
│  ├→ 問題に気づかない派 (鈍感派)
│  ├→ 実行コストに敏感派
│  │  ├→ 最適化はあてにする派 (モダン開発環境派)
│  │  └→ 最適化はあてになんないよ派
│  │     ├→ 低レイヤ派
│  │     ├→ 老害派
│  │     ├→ 諦め派
│  │     └→ ベータ開発環境追いかけ派
│  └→ 状況と程度による派 (柔軟派)
└→ えっ、それって駄目だったん? 派
    ├→ 初心者派
    └→ 無知派

319:デフォルトの名無しさん
20/02/07 02:51:26 dGY


320:48don.net



321:デフォルトの名無しさん
20/02/07 03:23:36 yxrGSGnH.net
じゃあ俺、えっ、それって駄目だったん? 派でお願いします。

322:デフォルトの名無しさん
20/02/07 03:50:27 yxrGSGnH.net
テストの品質がすべてを決めるような気がしてきた。

323:デフォルトの名無しさん
20/02/07 03:57:04 plErZoHk.net
>>311
わし、こうみえて「警告される箇所は仕様の詳細を調べる派」や
その上で、問題なければ「状況と程度による派 (柔軟派)」に再度ブランチする派

324:デフォルトの名無しさん
20/02/07 04:00:36 yxrGSGnH.net
Boostは警告を無視する派、GoogleはMicrosoftの問題なので修正する予定はない派。
ってことは、警告だしっぱなしで構わないって事では?

325:デフォルトの名無しさん
20/02/07 04:01:58 yxrGSGnH.net
目grepが難しいので、警告は消すしかないんだけど。

326:デフォルトの名無しさん
20/02/07 04:04:17.66 yxrGSGnH.net
変数の大きさが変わると同じ値のビット表現が変わるのはしんどいので、符号が一番右端にあったほうが良かったんじゃないの。
右端ならビット表現が変わらない。

327:デフォルトの名無しさん
20/02/07 05:13:16 zrCiCWWN.net
型違い面倒だからautoにしても警告出るから何でやおもたらi=0でintだったでござる派

328:デフォルトの名無しさん
20/02/07 06:00:43 yxrGSGnH.net
HTMLにしろコンパイラにしろ、Microsoft案のほうが合理的と思うけどな。
規格は政治だよね。

329:デフォルトの名無しさん
20/02/07 06:42:07 52vnIbYM.net
>>302
signed Tはできねえぞ
std::make_signed_t<T>にしないと

330:デフォルトの名無しさん
20/02/07 06:57:58 52vnIbYM.net
> コンパイラの警告は潰す派

キャストつーか、#pragmaを使ったりもするね
もち、規格票で自分が悪いのかコンパイラのお節介かはっきりさせてからだけど

331:デフォルトの名無しさん
20/02/07 07:21:23 9DO99WJ1.net
基本的にはsize_tとかsize_typeとか使え派
面倒でもちゃんとやった方が後のテストや検証は楽なんだよ
まあ無理だったり異様に面倒だったりする場合も現実的にはあるからそこは仕方ないけど

332:デフォルトの名無しさん
20/02/07 07:52:22 +bDqT2Wz.net
i は int にしたいって言ってるんだから

ここの型をsize()に合わせたら
キャストが他に移るだけ

333:デフォルトの名無しさん
20/02/07 08:31:14.28 z6HtA7Ca.net
>>288
いえいえ

334:デフォルトの名無しさん
20/02/07 10:49:20 /rNOv2pQ.net
>>298
vがグローバルなオブジェクトである場合や、ヒープから確保されたオブジェクトの参照型である場合、コンパイラには v.size() がループ定数であるかどうかを判定するのは難しいことが多い。
このスレでもグローバルに確保された構造体型のメンバを参照する場合、最適化され無い事が指摘されていたが、それと同じことが原因。
C/C++ではポインタや参照があるのでグローバル変数やグローバルなオブジェクトのメンバ変数が変化しないことをコンパイラが見極めるのが難しい。

335:デフォルトの名無しさん
20/02/07 10:52:27 VWyX2qgb.net
for(auto i=v.size()+1; 0<len; --i)

for(auto i : my_range(v.size())

336:デフォルトの名無しさん
20/02/07 11:01:57 52vnIbYM.net
reverse_iterator first(v.end()), last(v.begin());
for_each(first, last, [](auto& x) { cout << x; });

337:デフォルトの名無しさん
20/02/07 11:41:09.54 jtk/IwGo.net
64bit/32bitまたぎできるソース汎用性を考えれば、負の数が必要ないなら size_tを使うのが最善でしょ。

338:デフォルトの名無しさん
20/02/07 12:00:59.89 VWyX2qgb.net
size_tはunsignedなのがうざい
c言語初心者が決めただろこれ

339:デフォルトの名無しさん
20/02/07 12:07:12.14 VWyX2qgb.net
あ、上にかいたやつ+1は間違いや

340:デフォルトの名無しさん
20/02/07 12:12:42.12 52vnIbYM.net
ポインタ


341:+ size_t == ポインタ ポインタ - ポインタ == ptrdiff_t おかしいね



342:デフォルトの名無しさん
20/02/07 12:33:14.78 8FC0VQS8.net
>>326
仮に毎回アクセスしたとしてもv[i]の方が重い
毎回アドレスを計算して毎回メモリアクセスするわけで

343:デフォルトの名無しさん
20/02/07 12:48:40.15 Nrn3Ov0h.net
indexにintはlp64環境だと怖すぎる

344:デフォルトの名無しさん
20/02/07 12:51:13 cytAyAiU.net
そんなバカでかいインデックス作る方が怖い

345:デフォルトの名無しさん
20/02/07 13:01:32 jtk/IwGo.net
ファイルポインタは4GB越えが当たり前だし。

346:デフォルトの名無しさん
20/02/07 13:18:28 8FC0VQS8.net
ばかでかいループをたくさん作るなら
性能を心配した方が良い

中身にもよるが、ほぼメモリアクセス時間になりかねない
帯域の無駄遣い
ループをまとめるとか細切れにするとか
キャッシュを有効に使う処理にしないと

キャストのコストとか完全に誤差

347:デフォルトの名無しさん
20/02/07 13:30:18 QoBXk/kf.net
メモリポインタも4GB超えは当たり前だしな

348:デフォルトの名無しさん
20/02/07 13:33:10 52vnIbYM.net
8086時代の苦しみを知っている人なら
リニアでないポインタやインデックスが
どんなにウザいものかよく知っている

64bit空間なら64bitを使っとけって悪いこと言わないから

349:デフォルトの名無しさん
20/02/07 13:45:59 8FC0VQS8.net
ループの中身も知らないで良く言うね
int変換必須なら問題点の場所を移動させただけ

350:デフォルトの名無しさん
20/02/07 13:58:09.08 jtk/IwGo.net
今日日4GB越えとかWindowsNT4.0サービスパックですか、と。

351:デフォルトの名無しさん
20/02/07 14:12:43.62 PWhN+bN7.net
納品したときに
コンパイルで警告出るんですが消してって言われて
それ無視して良い警告ですよって言っても
理解してもらえなかった派

352:デフォルトの名無しさん
20/02/07 14:19:34.17 PWhN+bN7.net
あと警告が出ないからと言って
正しく動くと保証されている訳でもなんでもないのに

353:デフォルトの名無しさん
20/02/07 14:32:07.46 VWyX2qgb.net
>>342
それはお前が悪い
そんなんで納品するな

354:デフォルトの名無しさん
20/02/07 14:34:22.92 jtk/IwGo.net
客先と同じビルド環境で警告対応しないのは落ち度だね。次の仕事なくなるでしょ。

355:デフォルトの名無しさん
20/02/07 14:40:57.67 /rNOv2pQ.net
>>333
BYTE v[数値];
のような生配列の場合、ループの中のv[i]は、最適化が効いてものすごく効率の良いコードになることが多い。
この場合、vがグローバルに確保されたオブジェクトや参照型であったとしても最適化には余り悪影響はない。
vがstd::vector 型の場合で、かつ、vがグローバル・オブジェクトや、参照型の場合は、コンパイラはv[i]を上手く最適化できないかもしれない。

356:デフォルトの名無しさん
20/02/07 14:42:08.26 /rNOv2pQ.net
>>346
すまん。
後半部分は勘違いかもしれない。

357:デフォルトの名無しさん
20/02/07 14:47:50.81 5UxOF8qK.net
>>346
VCはvectorでも生ポインタに近い最適化はしてくれてるみたいだぞ

358:デフォルトの名無しさん
20/02/07 15:03:24 jtk/IwGo.net
客や同僚から使えないプログラマ認定されていることに気づけず独りよがりな考えに凝り固まる人いるよね・・・
かわいそうではあるけど、かかわりたくないタイプの人。

359:はちみつ餃子 ◆8X2XSCHEME
20/02/07 15:15:12 BIRgOLIs.net
標準ライブラリのコンテナのイテレータを sizeof で見ればわかるが、ほとんどの場合で void* と同じ大きさ。
要するにポインタ一個分の情報しかないし、実際ポインタが入ってるし、ポインタの操作になってる。
しいて言えば操作がメンバ関数経由になる分のコストはあるといえばあるけど、
それくらいのインライン展開はするのが普通でしょ。
vector の場合だと領域が連続する保証があるのでインライン展開だけでイテレータはポインタと同じになる。

VC のコンテナだとデバッグモードではイテレータが少し大きい (のと範囲チェックとかする) ってなことらしいんだが、
処理系をインストールしてないから試してない。

360:デフォルトの名無しさん
20/02/07 15:20:21 E/TdO4KU.net
>>349



361:まえがきちんとした仕様を提案できないで投げっぱにしてるからそんなことになってんじゃないの?



362:デフォルトの名無しさん
20/02/07 17:16:18 52vnIbYM.net
>>340
64bit空間で64bit以外のインデックスを使うべきループの中身とやらを書かないあんたが悪い
書けないんじゃないのか?

363:デフォルトの名無しさん
20/02/07 17:31:01 Nrn3Ov0h.net
intだとたったの2G要素でオーバーフローして無限ループになるのが怖い

364:デフォルトの名無しさん
20/02/07 17:31:33 yxrGSGnH.net
イテレータよりポインタのほうが速いよ。
ホントだよ。
いまベンチとってるから。
偶然だけど。

365:デフォルトの名無しさん
20/02/07 17:34:39.39 jtk/IwGo.net
>>351
「無視して良い警告」とか勝手に判断する困ったPGにきちんと仕様を提案しても無駄でしょ。解雇するわ。

366:デフォルトの名無しさん
20/02/07 17:37:50.00 PWhN+bN7.net
unsigned だと
for(unsigned i = s.size(); --i >= 0; ){...}
みたいなので警告出るんだっけ

367:デフォルトの名無しさん
20/02/07 17:41:09.31 Nrn3Ov0h.net
警告で指摘された問題点に対処もせずに、キャストやらで無理やり消す位なら、出たまま放置の方が100倍マシ

368:デフォルトの名無しさん
20/02/07 17:43:22.94 yxrGSGnH.net
ヒープ作るとき、マイナスの値は空きノードのリンクリストに使ったりするので、その手の比較は多発する。

369:はちみつ餃子
20/02/07 17:43:55.24 BIRgOLIs.net
うーん、近頃はちょっとした作法レベルのところまで警告として口出しすることがあるからなぁ。
完全に規格に沿って書いてるわ! ってときにはイラッとすることもある。
個別に警告オプションを設定するのも面倒くせぇし、直してしまう方が手っ取り早かったりもするんだけど、
何がなんでも警告をゼロにしろって言われたら警告レベルを低くする対処をしちゃうかも。

370:デフォルトの名無しさん
20/02/07 17:52:14.97 VWyX2qgb.net
仕事ではやってんなら手を抜くなぼけ
pragmaとかでなんとでもなるだろ

371:デフォルトの名無しさん
20/02/07 17:55:05.15 yxrGSGnH.net
タモリさんは遊びで手を抜くなって言ってた。

372:デフォルトの名無しさん
20/02/07 17:57:41.44 jtk/IwGo.net
従来cppcheckなどの静的解析ツールが出していた警告をコンパイラも出すようになってくれたのは良い動き。
親切なコンパイラに感謝して警告箇所の修正をやればいい。
修正に工数がかかることが懸念されるなら、依頼主にその旨を伝えればいい。

373:デフォルトの名無しさん
20/02/07 18:05:13.97 kNxPhPNR.net
>>360
すごい偉そうにしてるけど大丈夫?>>327
;0<len; って···

374:デフォルトの名無しさん
20/02/07 18:14:59.44 CaNLgYal.net
雑魚ほどイキがるのはプログラマも同じ

375:デフォルトの名無しさん
20/02/07 18:23:59.39 yxrGSGnH.net
カバレッジ測定のツールって安いの無いのかな。

376:はちみつ餃子
20/02/07 18:36:35.61 BIRgOLIs.net
>>360
俺はプログラミングについては趣味者だから実務のことは知らんのだわ。
すまんな。
しかしな、必要以上の品質にするくらいなら手抜きで安くしろって言う客の方が多いと思うぞ。
必要より下になったらあかんのでそこを制御していい感じの
手抜き具合にするのが難しいわけだが、そこを上手くやるのが
手抜きしないことよりもプロに必要な資質じゃね?
手抜きしないよりも適切に手を抜く、どうやって手抜きするか知っていることが大事だ。
仕事は経済的に割に合う形でしか継続できないんだからさ。
そりゃあいつも十全な仕事が出来る時間的・経済的余裕があるならうれしいが、
現実はそうではないだろ。

377:デフォルトの名無しさん
20/02/07 18:40:56.99 jtk/IwGo.net
>>366
何言ってんだ?
手抜きしたいからこそ、コンパイラの警告に素直に従うんだぞ。

378:はちみつ餃子
20/02/07 18:45:33.43 BIRgOLIs.net
>>367
それもそうだな。

379:デフォルトの名無しさん
20/02/07 18:51:12.38 ZYtSuiu/.net
DirectX関連使ってるとenumよりenum classを優先しますという警告出るんだけど、ライブラリ変えるわけにもいかなく、どう対応するのが正解なんだろ?

380:デフォルトの名無しさん
20/02/07 18:58:20.00 HVBpNa40.net
そもそも警告って規格で定められている訳でもなく、コンパイラが独自の基準で勝手に出してくる物だからね
mutableは悪だってconst付いてない変数全てに警告出すコンパイラとか出てきたらどうするんだろう

381:デフォルトの名無しさん
20/02/07 19:03:54.90 jtk/IwGo.net
>>370
議論のための議論とか、言いがかりのような仮定の話に、いちいち付き合わないことが重要。

382:デフォルトの名無しさん
20/02/07 19:04:25.00 /AlUflk/.net
>>365
とりあえずgprofでいいんじゃね?

383:デフォルトの名無しさん
20/02/07 19:08:56.34 yxrGSGnH.net
>>372
見てみます。

384:はちみつ餃子
20/02/07 19:25:21.94 BIRgOLIs.net
>>371
変な作法が追加されることなんて良くあるんだぞ。
今じゃ gcc や clang で -Wall オプションを付けたら
a || b && c
みたいな式にすら警告が出る。
優先順位を間違えやすいとこだから括弧で明示した方が良いんだと!
演算子の優先順位くらい把握しとるわ!
こんなの警告されるようになると想像したことあったか?
他の演算子でも同様の警告を出すようになることくらいはあるかもしれんぞ?
確かに >>370 は極端な例ではあるが、ようわからんところでしょうもない警告が出るようになる
かもしれんという懸念は無い話ではないぞ。

385:デフォルトの名無しさん
20/02/07 19:30:53.52 9DO99WJ1.net
いやそれはカッコ付けろよ

386:デフォルトの名無しさん
20/02/07 19:33:08.02 jtk/IwGo.net
>>374
趣味でしかやってない人の意見なんて無視しろ、というが私の回答です。

387:デフォルトの名無しさん
20/02/07 19:39:25.14 1PiYJQ+8.net
>>374
それは括弧つけろよ

388:はちみつ餃子
20/02/07 19:46:55.57 BIRgOLIs.net
>>375-377
そっかー (´・ω・`)

389:デフォルトの名無しさん
20/02/07 19:55:08.75 yxrGSGnH.net
はちみつ先生は何を作ってるんですか?

390:はちみつ餃子
20/02/07 20:28:02.80 BIRgOLIs.net
>>379
ゲームのチートツールとか。
汎用的な便利なツールは色々とあるけど、個別のソフトをいじるには行き届かないこともあるので。
念のため言っとくけど買い切りの RPG かフリーゲームだけ。 ネットゲームはやってないよ。
ちなみにそのツールは公開してない。
その他に作った有用そうなものは公開してるんで、身バレするから言えない。

391:デフォルトの名無しさん
20/02/07 20:52:16.35 yxrGSGnH.net
>>380
そうなんですか。
ずいぶん詳しいのに仕事じゃないというから不思議に思ってました。

392:デフォルトの名無しさん
20/02/07 20:56:00.11 jtk/IwGo.net
つまり、はちみつ某は、なんの思い入れもない他人のソースを読まされる身になった経験が少ないわけか。

393:デフォルトの名無しさん
20/02/07 21:02:52.46 yxrGSGnH.net
アルゴリズム考えるときは、図を必ず書くと思うんだけど、皆さんは何を使ってますか?
いまは紙と鉛筆使ってるんだけど、探すの大変だから、ソフトに変えたい。

394:はちみつ餃子
20/02/07 21:05:36.03 BIRgOLIs.net
>>382
せやな。
そんなわけで、他人のバイナリを見る機会はあるけどソースはそれほどでもって感じかも。
結果的に読まなきゃならないことはあるけど、所詮は趣味だから嫌になったらいつでも止められるし、急がなくてもいいし。
プレッシャーに晒されながらクソみたいなソースを読むってことはない。

395:デフォルトの名無しさん
20/02/07 21:05:49.82 E/TdO4KU.net
たまに書く方がいい
字を忘れる

396:デフォルトの名無しさん
20/02/07 21:09:26 y0pPi+zA.net
C++なんざ仕事で嫌々書かされるだけの言語だと思ったけど
趣味で使っちゃう子もおるんやな

397:はちみつ餃子 ◆8X2XSCHEME
20/02/07 21:12:24 BIRgOLIs.net
>>383
曖昧なところから思考を整理するなら紙と鉛筆でいいと思うけど、
それなりに書式の整ったようにするなら PlantUML とか。
GUI で自由にってことなら Dyna


398:mic Draw くらいが手頃かもしれない。



399:デフォルトの名無しさん
20/02/07 21:15:03 jtk/IwGo.net
完全な趣味目的でC++を触る変態はそうそういないと思う。

400:デフォルトの名無しさん
20/02/07 21:16:30 52vnIbYM.net
>>386
禿1読んで信者になった変態もおるんやで

401:はちみつ餃子 ◆8X2XSCHEME
20/02/07 21:16:36 BIRgOLIs.net
>>386
ゲームのチートとかするために
既存のプロセスに割り込んだりする処理を書こうと思うと C か C++ くらいしかまともな選択肢なくね?
C で足りるなら C で済ませることもあるけど、もうちょっと高級なことがしたくなったら C++
ってのは妥当な選択肢というか、唯一解でしょ。

まあ近頃は Rust にも興味があるけど……。

402:デフォルトの名無しさん
20/02/07 21:37:46 yxrGSGnH.net
>>387
見てみます。

403:デフォルトの名無しさん
20/02/07 22:05:07.56 8FC0VQS8.net
>>375
>>377
男ならカッコつけろ

404:デフォルトの名無しさん
20/02/07 22:14:56.42 8FC0VQS8.net
カッコつけろって人
付ける付けないの基準はコンパイラの警告?
完全に優先順位を覚えてる人から見ると
カッコが多いと見にくいんだよ
a == 0 || b != 0
a * b + 1
*a[i]
*a++
こんなのにカッコつけてたら
えっ?何か意味があるの?って考えてしまう

405:デフォルトの名無しさん
20/02/07 22:26:24.78 52vnIbYM.net
> えっ?何か意味があるの?
いや、「あーまた面倒くさいやつ来やがった」だよ

406:デフォルトの名無しさん
20/02/07 22:52:28.44 GxNDg+Fe.net
実務経験1年で月収80万稼げるエンジニアになった理由
URLリンク(www.youtube.com)
意識が低いエンジニアこそフリーランスになれ
URLリンク(www.youtube.com)
フリーランスエンジニアの週3労働ってどんな感じ?
URLリンク(www.youtube.com)
ぼくがスキルのない社畜ならこうやって脱する
URLリンク(www.youtube.com)
初めて人を雇ったらもう二度とサラリーマンをやりたくないと思った話
URLリンク(www.youtube.com)
プログラミングは文系でも余裕で出来ます!理由を現役プログラマーが解説
URLリンク(www.youtube.com)
貧乏人こそ社会不適合者
URLリンク(www.youtube.com)
元ド貧乏が教える】貧乏を抜け出すための2つの考え方
URLリンク(www.youtube.com)
より良いオファー貰ってるのに転職しないとか何考えてるの?
URLリンク(www.youtube.com)


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch