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


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

C++相談室 part121



1 名前:デフォルトの名無しさん mailto:sage [2015/12/04(金) 23:54:41.33 ID:rlbDZGLz.net]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part120
peace.2ch.net/test/read.cgi/tech/1445516998/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.97【環境依存OK】
peace.2ch.net/test/read.cgi/tech/1439849418/

次期規格C++1zはこちら
C++14/C++1z 20
peace.2ch.net/test/read.cgi/tech/1410382924/

■長いソースを貼るときはここへ。■
 codepad.org/
 ideone.com/

2 名前:デフォルトの名無しさん mailto:sage [2015/12/04(金) 23:57:15.45 ID:rlbDZGLz.net]
[C++ FAQ]
https://isocpp.org/wiki/faq/
www.bohyoh.com/CandCPP/FAQ/ (日本語)

3 名前:デフォルトの名無しさん mailto:sage [2015/12/04(金) 23:58:20.59 ID:rlbDZGLz.net]
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

4 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 00:00:25.92 ID:TKq/RElB.net]
---- テンプレ ここまで ----

5 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 10:08:08.42 ID:0KIgPYZB.net]
boostjp始まったよ

6 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 10:29:20.18 ID:48FeOGNK.net]
>>前スレ997
繰り返しメモリから読んで欲しくないなら int b = a でいいんじゃないかな。
そういう話じゃないんだろうけど。

実際のところ思ってるより問題になるケースは少ないと思うよ。
https://goo.gl/cyhgw8
たとえばこんなコードならポインタ操作があっても一回しか読まれないわけで。
型ベースの aliasing rule もあるし。

7 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 11:13:41.33 ID:NRX1k+Is.net]
>>6
レスdクス、
まあint b = aと同じことなんですが、既存コードの高速化のため、
関数先頭に片っ端からconst int m_x = g_foo.m_x;(Fooのメンバ関数ならconst int m_x = Foo::m_x;)を挿入する「だけ」のソースコード変更で実験中なう

>ポインタ操作があっても一回しか読まれないわけで。
グローバル変数g_xと、別のグローバル変数のメンバg_foo.m_xが同一実体のaliasでありえないことはコンパイラにもひと目でワカルんでしょうけども、
問題はg_xのアドレスが関数引数で渡され、その関数内でg_foo.m_xを直接読むケースが悩ましい…
該当するケースについて、渡されてくるポインタを__restrictにすれば解決なんですが、これは怖くて機械的にはやれない
および参照で渡されたとき、参照の___restrictは比較的新しいコンパイラでないと対応していない…

>型ベースの aliasing rule もあるし。
言わんとすることは多分わかるんですが、
そこまで逝くともはやどこまでコンパイラの気持ちになれば良いのかわからん…

8 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 11:39:52.49 ID:48FeOGNK.net]
>>7
そんな小手先の速度差がほんとうに問題になることは少ないし、
ほんとうにそこが問題ならローカル変数に引き上げればいいってのがわかってるわけで、
何が問題だと思ってるのかわからん。

9 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 11:44:20.03 ID:NRX1k+Is.net]
>>8
ものすごい深さの多重ループと本質的に同じやつ(ソースコードは既存)の高速化を今せねばならないのデス、

10 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 14:27:40.42 ID:3X0n/q/1.net]
>>9
constとかregisterとか付けたら速度変わる?



11 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 14:32:46.12 ID:SYFBCoeI.net]
>>10
お前は20世紀空タイムスリップしてきたのか?

12 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 15:01:18.43 ID:NRX1k+Is.net]
>>10
C++のconstは1 bitの書き換えも許さないという意味では無いので
const付きオブジェクトであってもコンパイラはalias経由で書き換えられる可能性を想定せざるを得ず、最適化結果は変わらないはず
VC++2010で実験する限り実際変わらないようである

それよかローカル変数化で10倍早くなった;

13 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 15:04:51.31 ID:9PUwCRa0.net]
えっ?constは1bitの書き換えも許さないという意味だと思うけど。。。
alias経由で書き換えられる可能性って例えばどういう場合だよ?

14 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 15:13:01.83 ID:eGerJrSR.net]
constなんかキャストで簡単にはずせるし

15 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 15:17:58.50 ID:9PUwCRa0.net]
>>14
そりゃそうだ
だけど基本そんなことしちゃダメ
constをちゃんと使ってない既存のボロコードを使う場合とかにしょうがなくキャストするくらい

16 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 15:27:17.32 ID:NRX1k+Is.net]
>>13
あー>>12でconstつきオブジェクトと言ったのは適切ではなくて、constつきポインタで指し示されたオブジェクト、と訂正します、

で、毎度おなじみn3337.pdf(タダのやつ)から
>7.1.6.1 The cv-qualifiers
>...
>A pointer or reference to a cv-qualified type need not actually point or refer to a cv-qualified object, but it
>is treated as if it does; a const-qualified access path cannot be used to modify an object even if the object
>referenced is a non-const object and can be modified through some other access path. [ Note: Cv-qualifiers
>are supported by the type system so that they cannot be subverted without casting (5.2.11)
下から2行目の
>can be modified through some other access path.
に注目

const_cast<T*>でconst外しを行った結果に書くことは未定義動作、という規定があり、
それと混同している人が多そうな気がするが、それとは別のwrite access方法であることに注意

17 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 15:34:44.74 ID:NRX1k+Is.net]
例としては単純にこれ。
int g_a = 10;
void foo() {
 const int* p = &g_a;
 printf("[1] *p=%d\n", *p); // (1)
 g_a += 11;
 printf("[2] *p=%d\n", *p); // (2)
}
コンパイラは外部シンボルの呼び出しやアクセスで*pがもろともに書き換えられる可能性がある想定で最適化せねばならないから、
(1)と(2)のそれぞれで*pをメモリからロードする。

18 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 15:58:59.61 ID:eGerJrSR.net]
当たり前なんだよな
const int *p の const は、どこまで行っても、あくまで変数pを修飾しているだけに過ぎなくて
pの指しているものを本当の意味でconstにしているわけではなく
単に変数pを使っては書き換えないと宣言しているだけだからな
しかもキャストすると簡単にconstはいつでもどこでも外せるから
あらゆる可能性を考えなければならないコンパイラからしたら
最適化のヒントにならないんだよ

19 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 16:00:04.98 ID:eGerJrSR.net]
あーもちろん const int value = 1 みたいな完全な定数は別な
これは最適化される

20 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 16:06:05.41 ID:9PUwCRa0.net]
const int *pを引数にとる関数があったとして、別スレッドで*pが書き換わる可能性を
コンパイラは考慮しなくてはいけないってルールってあるんだっけ?



21 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 16:15:00.14 ID:9PUwCRa0.net]
そうだとしたらconst*なのにvolatile扱いしなくちゃいけないってことだよね
ほんまかいな?規格に書かれてるならその箇所を教えて欲しい

22 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 16:17:49.62 ID:NRX1k+Is.net]
>>20
無い
最適化は別スレッドからの干渉を仮定しない
volatileで最適化を抑止することならできる

>>17でコンパイラが気にしているのは、同一スレッドコンテキスト内で起きる副作用

23 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 17:13:38.32 ID:9PUwCRa0.net]
まああれか、const T* pについては別コンテキストからの書き換えに関してはconstの有無によらず同じことだから
関数の引数については呼び出される側においてはconstは最適化に寄与しないということには同意するわ
ただし呼び出し側は関数から戻ってきた時に*pが変化していないことを仮定できるので最適化に寄与する

24 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 17:25:14.88 ID:NRX1k+Is.net]
>>23
>ただし呼び出し側は関数から戻ってきた時に*pが変化していないことを仮定できるので最適化に寄与する
そんな仮定は成立しない
証拠はこれ。
a.cpp
--------
int g_a = 10;
extern void bar();
void foo() {
 const int* p = &g_a;
 printf("[1] *p=%d\n", *p);
bar();
 printf("[2] *p=%d\n", *p);
}
--------

b.cpp
--------
extern int g_a;
void bar() { ++g_a; }
--------

25 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 20:18:06.93 ID:eGerJrSR.net]
そういうこと
いくらconst修飾だろうがシングルスレッドだろうが
ひとたび関数を呼び出したら、その先で何が行なわれているかは、呼び出し元からはわからない
もちろんインライン展開すれば別だが、その場合もconstを頼りに最適化をしているわけではなく
コードを静的に解析した結果に基づいて、変更の有る無しを判断している
そもそもconstはキャストで外せるので、コンパイラはconstをあてにしていない
constはプログラマのミスを発見するためのものでしかない
ただし、定数宣言のconstは最適化に使われるが

26 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 20:22:05.81 ID:22zPQN1u.net]
横レスだけど
>>24
>>23 が言いたいのは
> 関数の引数については
のところじゃね?
「関数の引数については〜」が次の行にも係ってる

27 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 20:34:13.03 ID:22zPQN1u.net]
……っていうのはローカル変数に限られるな
const がどうこうでなく、callee のコードがコンパイラに見えてるか、
ってのが重要か

28 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 20:42:57.85 ID:9PUwCRa0.net]
>>24
まーた変な例を持ちだすね
その場合ならg_aはグローバルだから確かにそうなるけど
ていうかそんなグローバル使うような糞コード書いて最適化効かねーとか言われてもw

29 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 21:50:32.30 ID:NRX1k+Is.net]
やっぱ最適化の話題はカオスになる運命なんじゃのう…

>>28
これでどうよ?
ttp://ideone.com/fSabJr

30 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 21:59:10.17 ID:wharPYQR.net]
>>28
> ていうかそんなグローバル使うような糞コード書いて最適化効かねーとか言われてもw

コンパイラは、そんな糞コードでも規格に沿ってりゃ対応しないといけないって話だろ
バカすぎ



31 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 22:06:34.83 ID:22zPQN1u.net]
実験してみた。面倒なのでコードは載せない
コンパイラは gcc5.1.0
・結果
1) const の有無で生成コードは変わらない
  callee がコンパイラから見えていると、インライン化によって
  const な関数(宣言に関係なく実質的に)を呼び出すコードは高速になる(当たり前だな……)
  逆にコンパイラから callee が見えないと const 修飾の有無は *関係ない*
2) -fno-inline をつけると生成コードはほぼ同じになる
  コンパイラは callee のレジスタの使い方を知っているはずなので、インライン化されなくても
  caller のレジスタの使い方が変わるかと思っていた。この結果は意外だった
3) ただし -fno-inline をつけていても callee が static な関数だとレジスタの使い方が変わる
  これは予想通り
・結論
a) const は自分(プログラマ)のためのものであってコンパイラのためのものではない
b) コンパイラは(少なくとも俺の環境では)static でない関数呼び出しの ABI はちゃんと守る
  たとえ関数が自分から見えていても ABI で揮発性と決まっているレジスタは揮発性として扱う

まあでも俺はコンパイラじゃないし、できる限り const つけるけどね……
あとここまで書いておいてなんだけど実験コード載せないと意味ないな
まあ気になる人は自分で実験してくれ

32 名前: ◆tAo.kQ2STk mailto:sage [2015/12/05(土) 22:12:26.73 ID:3X0n/q/1.net]
うーん・・・
汗を見ながら最適化が掛かるか否かを見てたんだけど
void foo() {
// ← ここに挿入する
printf("%d\n", *p);
printf("%d\n", *p);
return;
}
を基本にして
int* p = static_cast<int*>(malloc(sizeof(int)));
これはmallocの呼び出しからして消えた(つまりメモリリークするようにしか見えないのにメモリリークしないコードが生成された)
int* p = bar(); // 適当な関数
これは最適化が掛からなかった(つまり2回メモリから読み込んだ)

この違いは何だろう。
コンパイラはclang 3.7.0(370/final)

33 名前: ◆tAo.kQ2STk mailto:sage [2015/12/05(土) 22:25:14.99 ID:3X0n/q/1.net]
あ!
__attribute__((malloc))をbarに付けたらメモリから読む回数が減った!

34 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 22:45:21.68 ID:NRX1k+Is.net]
変な例に反応する>>28に朗報
__restrictの効果が目に見えてワカル例(__restrictの有無で動作が変わる)を書いたわ;
ideone.com/iVcFhs

↑のコードの
//#define __restrict
というコメントアウトのままだと__restrictが効いて、s=55になる。(誤ったコードでありながら、1〜10の総和を正しく計算する。)
コメントアウトを外すと、__restrictが無効となり、s=110になる。(書いたとおりに間違う。)

案外難しかったわ;

35 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 23:04:12.27 ID:9PUwCRa0.net]
>>29
全然例になっていない やり直し
barの引数がconstじゃないんだからその動作は当たり前だろ

だいたい俺は動作が変わるかどうかじゃなくconstの有無で最適化が効くかどうかという話をしてるつもりなんだが
俺の主張はconstを正しく付けることで最適化が効く場合があるから可能な限りconstは付けるべきだと言ってるだけ
const付ければどんな場合でも最適化されるなどとバカなことは言ってない

36 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 23:13:10.74 ID:NRX1k+Is.net]
>>35
>だいたい俺は動作が変わるかどうかじゃなくconstの有無で最適化が効くかどうかという話をしてるつもりなんだが
それ系の話題はそっちで勝手に振って進めてホスイ☆

漏れは>>16に書かれているうちの
>can be modified through some other access path.
の実例(constつきポインタで指し示されたオブジェクトがalias経由で書き換えられる例)を述べたまでなわけだが…

37 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 23:28:51.67 ID:NRX1k+Is.net]
ただし、>>23の主張
>ただし呼び出し側は関数から戻ってきた時に*pが変化していないことを仮定できる(29)
に対しては、>>24および>>30にて、字面上pを含まないbar()の呼び出し前後で*pが指すオブジェクトが変更される例を挙げたから、
反例を示したことになる。(関数呼び出しの前後で*pが変化していないことは「無条件には」仮定できない)

>barの引数がconstじゃないんだからその動作は当たり前だろ(35)
は、当たり前だという結論が誤りであり、かつ主張(29)に対して後出しジャンケンである

やpっぱカオスやな…

38 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 23:37:04.63 ID:9PUwCRa0.net]
>>37
>>23の反例になんてなってない
話が噛み合ってないだけだよ

39 名前:デフォルトの名無しさん mailto:sage [2015/12/05(土) 23:45:07.55 ID:NRX1k+Is.net]
>>26
> >>23 が言いたいのは
> > 関数の引数については
> のところじゃね?
そうかもしれないが漏れは例示したコード>>17>>24>>29の中でpを関数の引数に使った事実は無いので知らん
>>28が別の話をはじめるのはいいが漏れに苦情を言われるのは困る

>>38
では1チャンやるから>>23で主張したかったことに適切な言葉を補い誤解の余地無く述べよ

40 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 00:43:00.97 ID:cIZcNmeU.net]
>>32
> mallocの呼び出しからして消えた
面白い。static な領域へのポインタを取得するだけになるのね
ちなみに gcc だと malloc は残ったままだった
代わりに 2 回目の printf が tail-call の最適化で jmp になってた

# clang -g -O3
push rsi
sub rsp,0x20
lea rsi,[rip+0x2a74] # 404030 <L.str>
mov rcx,rsi
call 402c78 <printf>
mov rcx,rsi
call 402c78 <printf>
nop
add rsp,0x20
pop rsi
ret
# gcc -g -O3
push rbx
sub rsp,0x20
mov ecx,0x4
call 402c58 <malloc>
mov ebx,DWORD PTR [rax]
lea rcx,[rip+0x2a68] # 404030 <.rdata>
mov edx,ebx
call 402c48 <printf>
lea rcx,[rip+0x2a5a] # 404030 <.rdata>
mov edx,ebx
add rsp,0x20
pop rbx
jmp 402c48 <printf>



41 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 02:18:24.92 ID:bOeDOEqd.net]
>>39
ひとつ教えてやろう
お前が相手をしているのはキチガイコテハンのQだ
しかも今日も何度かIDを変えている

42 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 02:34:42.11 ID:XiMnzaaH.net]
Qって何?

43 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 03:01:51.08 ID:5cQQ9Lrm.net]
>>41
なんでもQとやらに見えちゃうあんたは病気だよ

44 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 03:10:06.37 ID:5cQQ9Lrm.net]
なんか統失を激しく刺激するIDが出ちゃったみたいw

45 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 03:46:12.86 ID:5cQQ9Lrm.net]
>>39
1チャン与えてくれるとはありがたい(笑)
俺が言ってるのは単純なことで

extern void bar(const int*);
void foo(void)
{
int a=1;
printf("%d\n", a);
bar(&a);
printf("%d\n", a);
}

でbarから戻ってきた時にaが書き換わってない(1のまま)とコンパイラは仮定しても良いだろうということ。
仮定しちゃいかんのなら規格のどこに書いているのか教えて欲しい。
確かにbarでcost_castすれば書き換えられるが、そんなことまで考慮しなきゃいけない決まりなどあるのかということ。
特定のコンパイラの出力コードがどうとかじゃなく、規格上そういう決まりがあるなら俺は自分の誤りを認めるよ。

46 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 03:50:25.31 ID:5cQQ9Lrm.net]
それから

extern void bar(const int*);
void foo(void)
{
const int a=1;
printf("%d\n", a);
bar(&a);
printf("%d\n", a);
}

の場合はどうなのか?barがcost_castして書き換えてるならこの場合もaは書き換わる。

47 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 04:02:33.67 ID:cfOzLQZM.net]
そもそもconst castのポインタ使った場合は一部でmay produce undefinedつってるだけで
例外なくundefinedなんて書いてません

48 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 05:45:43.74 ID:5cQQ9Lrm.net]
>>47
「一部で」とか「例外なくじゃない」じゃ何の答えにもなっていないよ
undefined behaviorじゃないと規定されてるケースを挙げてくれないと

49 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 07:46:41.80 ID:cfOzLQZM.net]
>>48
const castしようが書き換え有効なポインタの操作で
未定義動作になるなんて規格にはありません
つーかそんな事書いてあったらconst_castなんてあるわけねーだろ

50 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 08:57:18.97 ID:cIZcNmeU.net]
>>47
C99 の規格書の Annex J.2 Undefined behavior に
> An attempt is made to modify an object defined with a const-qualified type through
> use of an lvalue with non-const-qualified type
ってあるから、const 外しによるアクセスは全部 undefined だと思ってた
コンパイラ側で定めてる例があるのかな



51 名前:50 mailto:sage [2015/12/06(日) 09:08:01.85 ID:cIZcNmeU.net]
あ、C++ の話か
>>50 は取り消します

52 名前:50 mailto:sage [2015/12/06(日) 09:21:58.64 ID:cIZcNmeU.net]
7.1.6.1 The cv-qualifiers に
> Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const
> object during its lifetime (3.8) results in undefined behavior.
ってあった。ってことは全部 undefined ?
でも 5.2.11 Const cast には >>47 の言う通り
> Depending on the type of the object, a write operation through the pointer, lvalue or pointer
> to data member resulting from a const_cast that casts away a const-qualifier may produce undefined
> behavior
ってある。"may produce undefined" って先に引用した方と食い違ってるような気がするんだけど
分からん。誰か教えてください

53 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 10:30:17.18 ID:7Za5T0R3.net]
>>45
bar が受け取った a を指すポインタを const_cast して中身を書き換えても
書き換えられる a は const object ではないので、 >>52 の挙げた 7.1.6.1 のルールには
違反しない。コンパイラはそういったコードによる書き換えも想定する必要がある。

>>46 の場合に同じことをすると、 a は const object なので、 7.1.6.1 のルールに違反し、
未定義動作になる。コンパイラはそういったコードを想定する必要は無い。
つまり bar(&a) 呼び出しの後も a が 1 であると仮定してよい。

54 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 10:42:22.88 ID:WLKzjp+o.net]
めずらしくQがマトモなことをいっているな

55 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 10:55:04.97 ID:cfOzLQZM.net]
>>50
defineの意味をよーく考えましょう

56 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 10:57:19.88 ID:qO5PB4gl.net]
締まっていこー

     彡⌒ミ
     ( ´c_,`)
    ⊂|、,  つ  きゅっ
     ((,  |
     | |  ノ
     (.(_)

57 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 10:58:55.04 ID:cfOzLQZM.net]
ってもう>>53が説明してたな
どうも

58 名前:50 mailto:sage [2015/12/06(日) 11:43:54.92 ID:cIZcNmeU.net]
あーなるほど
分かりやすい説明ありがとう

で、>>45-46 を gcc と clang でコンパイル (-g -c/ -g -O[1-3] -c) してみたら
gcc は全く同じコードを吐いた。-O2 にいたっては >>46>>45 への tail-call として扱われて、ジャンプ命令一つになってしまった
つまり gcc は const を信用していない。無視する。foo がポインタを書きかえたら printf は違う値を出力する
clang は >>53
> つまり bar(&a) 呼び出しの後も a が 1 であると仮定してよい
という仮定をちゃんとしてくれて、二回目の printf の第二引数が定数 1 になった
つまり foo がポインタを書きかえても printf は二回とも 1 を出力する

const も(コンパイラによっては)最適化に寄与するのかー

59 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 11:51:57.90 ID:7Za5T0R3.net]
>>58
gcc でも >>46 のコードなら2回目が定数 1 の出力になるよ。
https://goo.gl/yHHPLm

60 名前:50 mailto:sage [2015/12/06(日) 12:04:17.48 ID:cIZcNmeU.net]
>>59
バージョンの違いかなあ。俺は
$ gcc --version
gcc.exe (tdm64-1) 5.1.0
...
$ clang --version
clang version 3.7.0 (tags/RELEASE_370/final)
Target: x86_64-w64-windows-gnu
Thread model: posix
な感じ



61 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 12:41:15.42 ID:cfOzLQZM.net]
結局最適化で即値になる変数だけ最適化に寄与しないね
const*は呼び出し側だろうと関係ないな
アドレスとってるんだから当たり前か

62 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 12:42:25.95 ID:cfOzLQZM.net]
s@最適化に@しか@

63 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 13:17:05.19 ID:5cQQ9Lrm.net]
>>53
どうもありがとう。
7.1.6.1-4の例を見るとどうやらそれが正しいみたいですね。
g++ 4.8.4とVC++2015で試してみたけど(最大限の最適化でfooだけコンパイルしてアセンブリ出力を確認)
その通りの解釈でコード生成してる。

しっかし嫌な仕様だよなあ。
barが外部ライブラリとかでソースが分からない場合const修飾してるからって
ポイント先が書き換わらないと思っちゃいけないわけだ。コンパイラだけじゃなくて
呼び出す側を書くプログラマも。
const_castでconst外しした書き換えなんて規格的には全てundefinedにして
しょうがない場合だけuse at your own riskで使ってもいいよってすれば良かったのに。

64 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 13:30:35.31 ID:5cQQ9Lrm.net]
>>61
アドレスじゃなくて参照でも同じ
--- bar.h ---
void bar(const int& a);
--- foo.cpp ---
#include <bar.h>
void foo(void)
{
int a=1;
printf("%d\n", a);
bar(a);
printf("%d\n", a);
}
の場合、barの提供者が書き換えないと明示的にドキュメントしていない限り
fooを書く人はbarの呼び出しでaが書き換わらないと仮定しちゃいけない。
つくづく嫌な仕様だなあ。

65 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 13:39:53.67 ID:7Za5T0R3.net]
>>63-64
> barが外部ライブラリとかでソースが分からない場合const修飾してるからって
> ポイント先が書き換わらないと思っちゃいけないわけだ。コンパイラだけじゃなくて
>. 呼び出す側を書くプログラマも。

んなこたーない。

単に const int* を外部から受け取る関数では、それが実際に const object かどうか
判別する方法が無いんだから、結局のところ書き換えてはいけない。
const int* (および参照)を受け取っておいて書き換えるような関数にこそ明示的な
ドキュメントが要るし、ドキュメントがあったところでクソなインターフェースと言っていい。

何かしらの根拠によりポインタが指している先が const object ではないことがわかる、
あるいは知っている場合には const_cast を通しての書き換えも使える。
たとえば、昔ながらのコールバック関数に汎用引数 const void* を渡せる機構が付いてて、
特定コールバック内ではその汎用引数が非 const オブジェクトを指していると知っている場合、
とかね。

66 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 13:48:45.13 ID:5cQQ9Lrm.net]
>>65
>結局のところ書き換えてはいけない。
そうだったら良かったんだけど7.1.6.1によるとconst_castを通した非constオブジェクトの
書き換えは完全に合法だよね。少なくとも俺が試したコンパイラはそう解釈してる。
まあ規格がどうあれconst外しなんて極めて特別にしょうがない場合以外は決してやっちゃいけないと思うけど。

67 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 13:59:39.80 ID:wxELMJDc.net]
>>45
すでに>>17に書いてある(しかも1度ならず引用した
>can be modified through some other access path.
じゃあいけまへんの?この一文があるからコンパイラはconst付きポインタで指し示されたオブジェクトがalias経由で書き換えられる可能性を考えねばならない。
漏れの書いてることをよっぽど適当に読み流してるのか、あるいはこの手の規格書の読み方に慣れてないんか…

>>49
毎度おなじみn(ry
>>53は完全に正しい希ガス。および漏れもすでに同じことを>>16で書いたつもりだった…!

1. constつきオブジェクトとconstつきポインタで指し示されたオブジェクトの区別
>あー>>12でconstつきオブジェクトと言ったのは適切ではなくて、constつきポインタで指し示されたオブジェクト、と訂正します、

2. constつきポインタで指し示されたオブジェクトの書き換わりが合法であること(コンパイラは書き換わりを仮定せねばならないこと
> 下から2行目の
> >can be modified through some other access path.
> に注目

3. const_cast<T*>でconst外しされたオブジェクトへの書き込みが未定義動作であること
>const_cast<T*>でconst外しを行った結果に書くことは未定義動作という規定があり、
>それと混同している人が多そうな気がするが、

(訳注: 3.は具体的にはn3337.pdfのセクション5.2.11 Const castのパラグラフ7を指す。
> [ Note: Depending on the type of the object, a write operation through the pointer, lvalue or pointer
> to data member resulting from a const_cast that casts away a const-qualifier73 may produce undefined
> behavior (7.1.6.1). ?end note ]
この内容は本題でないつもりだったので、constつきオブジェクトとconstつきポインタで指し示されたオブジェクトの区別とか、
未定義動作になる「かもしれない」と未定義動作に「なる」の区別があいまいだったわ、

わかりんくくてすまんの…

68 名前:67 mailto:sage [2015/12/06(日) 14:01:41.66 ID:wxELMJDc.net]
訂正 >>67の上8行削除(汗

69 名前:67 mailto:sage [2015/12/06(日) 14:07:36.92 ID:wxELMJDc.net]
>>66
完全には合法ではない。
たとえば
const int a = 1;
は、aの領域がROMに割り当てられてそもそも書き換えられないケースとか、
許可されていない方法(例えばリードオンリーの位置へ書き込みをしようとする)
によるセグメンテーション違反でOSにプロセスごと終了させられるケースとか
いろいろ…

70 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 14:13:33.39 ID:7Za5T0R3.net]
>>66
伝わってないみたいだからもっかい言うね。

何の前提も無ければ const ポインタor参照の指す先を書き換えてはいけない。

const_cast を通した書き換えをコンパイラが考慮しないといけないのは、書き換えが
可能となるような「前提」があるのか無いのか、プログラマがその前提を利用しているかどうかを
判別できないから。

const ポインタor参照で引数を受け取る関数について、それらを通した書き込みを
使う側が想定しなければならない、などということはない。



71 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 14:17:42.59 ID:5cQQ9Lrm.net]
>>67
上8行削除了解。alias経由かどうかの問題じゃないからね。
>>45のコードの場合コンパイラもプログラマもalias経由のパスがないことは認識できる。
だけど、それにも関わらずbarがconst外しをやらかしていないと仮定することは出来ない。

72 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 14:35:11.29 ID:5cQQ9Lrm.net]
>>70
???
その「前提」に関する記述なんて規格にはないよね?
そんな「前提」なんて規格を外れたプログラマ間の信頼関係でしかなくて、
規格的には
・barではconstポインタの先/const参照先がconstオブジェクトかそうじゃいないかを
知ってるかどうかに関わらずconst外しをして書き換えるコードを書くことは完全に合法。
・fooがbarに非constオブジェクトへのポインタ/参照を渡したなら、barで書き換えられる
可能性があることを想定しなければならない。

と解釈するべきだとやはり思うけど?

73 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 14:40:54.26 ID:cfOzLQZM.net]
>>69
レス先をよく読もうな

74 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 14:52:20.91 ID:cfOzLQZM.net]
>>70
mutableがある時点でそれは通じないだろうし
さらにmutableを持たないクラス型で扱う前提でも通じないと思うよ
なぜなら渡した先が基本クラスでもダウンキャストして変更する可能性があるから
やはり即値でなくポインタの時点で駄目だね

75 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 14:53:08.74 ID:7Za5T0R3.net]
>>72
それがコンパイラの解釈の範囲。

でもプログラマは、たとえば bar() が foo() とは無関係の関数であり呼び出し元コードに
ついて何の想定も置けないことを知っていれば、 bar() 内で書き換えは行われないと想定できる。
さもないと、本当に const なオブジェクトを渡したときに未定義動作になるからね。

コンパイラは各関数を誰が書いてるか、どんな範囲で使えるものかなんて知らないなから、
そういった想定はできない。

76 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 14:56:53.23 ID:7Za5T0R3.net]
>>74
ごめん。「それは通じない」の「それ」が何を指しているのかわからない。
最後の「駄目」も何を指していってるのかわからない。

77 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 14:58:26.28 ID:cfOzLQZM.net]
>>76
コンパイラが変更しない前提で最適化ができない

78 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 15:05:40.01 ID:cfOzLQZM.net]
ああすまん、「使う側」をコンパイラ視点で読んでたので齟齬があった
言ってることはたぶん同じ

79 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 15:05:52.33 ID:7Za5T0R3.net]
>>77
コンパイラが >>45 のケースで2回目のメモリからのロードを最適化で消せないのはわかってる。

>70 はプログラマが同じように値の変更を想定すべきかどうかという話で、元は >>63
プログラマも同じ想定をするべきだ(想定しないでいいためにはドキュメントが要る)と言っていたところ、
それは現実とは違うというのを説明しているところ。

80 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 15:11:17.22 ID:wxELMJDc.net]
>>71
>(コンパイラは)それにも関わらずbarがconst外しをやらかしていないと仮定することは出来ない。
知らん。「barがconst外しをやらかしていないと仮定出来る」という結論が仕様書の記述から演繹できないから仮定しないだけでは…

ていうかDI:5cQQ9Lmの当初の主張は「constを利用した最適化の可能性がある」だったはずで、
むしろ「barがconst外しをやらかしていないと仮定出来る」例を示してホスイ☆
まあ>>45>>53のレスがついて決着したのか知らんが

>>73
非constオブジェクトの書き換えの話だったか
スマンorz



81 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 15:16:46.77 ID:5cQQ9Lrm.net]
>>80
当初の主張が誤りだったことは認める
今や「コンパイラもプログラマもbarがconst外しをしていないと仮定しちゃいけない」
という逆の立場になっちゃったということ(笑)

82 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 15:20:41.98 ID:wxELMJDc.net]
>>71
>alias経由かどうかの問題じゃないからね。
については当然で、>>45のコードはconst付きオブジェクトaの書き換わりの話である。
一方、漏れが「aliasガー」と言っている>>16の引用部分は
const付きポインタ(A pointer or reference to a cv-qualified type)で指し示されたオブジェクトの話で別の話。こっちはaliasで書き換えられる可能性がある

83 名前:デフォルトの名無しさん [2015/12/06(日) 17:28:22.80 ID:9WYMwqzW.net]
テンプレートクラスで型ごとにデフォルト引数の値を変える場合は
下記コードのように特殊化で対応するしかないですか?
codepad.org/xeLeQs5C

Lプレフィクスの差だけなので1つにまとめられたらすっきりするのですが
そんな方法はあるでしょうか?

84 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 17:53:40.27 ID:9WYMwqzW.net]
自己解決しました。
デフォルト引数をstatic関数で受け取ることで対応できました。

85 名前:デフォルトの名無しさん mailto:age [2015/12/06(日) 22:55:27.35 ID:EHj7xnMf.net]
enum に名前ってつけるべき?
つけるか省略するかどっちがデフォ?

86 名前:デフォルトの名無しさん mailto:sage [2015/12/06(日) 23:51:20.12 ID:NAZd77H+.net]
enum structを使うべきです、はい

87 名前:デフォルトの名無しさん mailto:sage [2015/12/07(月) 02:53:58.87 ID:sISKuid0.net]
いま自分がいじってるプログラムだと、
元のソースが微妙に古いせいか、namespaceで括ってるなあ。
治すのも面倒だし放置でいいか。

88 名前:デフォルトの名無しさん mailto:sage [2015/12/07(月) 11:04:26.12 ID:X3GD6DTG.net]
ひょっとして 列挙型って何それ美味しいの? って話じゃなかろか

89 名前:デフォルトの名無しさん mailto:sage [2015/12/07(月) 13:47:04.60 ID:xKQ551nc.net]
いやいや

真の漢なら #define を使え って話だろう

90 名前:デフォルトの名無しさん mailto:sage [2015/12/07(月) 22:11:19.85 ID:ftUTS3gX.net]
あるテンプレートがあって
そのテンプレートがコード中何で具体化されてるか
列挙させる方法ってなんかありますか?



91 名前:デフォルトの名無しさん mailto:sage [2015/12/07(月) 22:27:59.28 ID:ybmjRjHL.net]
デストラクタになんか書いたら?

92 名前:デフォルトの名無しさん mailto:sage [2015/12/07(月) 23:52:55.57 ID:d5Z60dVM.net]
それはリンカーしか知り得ない情報だから無理

93 名前:デフォルトの名無しさん mailto:sage [2015/12/07(月) 23:54:20.87 ID:snVCh2rq.net]
FARPROC pfn;
__declspec( naked ) void WINAPI func()
{
_asm{ jmp pfn }
}
と同じようなことをx64でやるにはどうしたらいいでしょうか?

94 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 02:41:35.05 ID:QEVUqltL.net]
マルチスレッドで排他制御してないとプログラム止まりますか?
例えば、同じデータに同時アクセスしたら内部でどんなことが起きるのですか?

95 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 03:00:47.56 ID:R0PV8G/t.net]
>>94
アクセスにも2種類あります。
言うまでもないですが、readとwriteです。
同時に同じ領域にreadアクセスしても何も起こりません。
write中にreadを行うと書き込み途中の意味のないデータが読み取れることがあります。
write中にwriteされると競合して意味のないデータになったものが書き込まれて残る事があります。

それらがポインタなどだった場合は不正なポインタになり簡単にアプリケーションはクラッシュします。配列の要素数だった場合はバッファーオーバーフローになります。
厳密には同じアドレスへアクセスしている必要はなく、関係するデータを読み書きしているとその関係性が崩れ不正な状態になる可能性があるので注意しましょう。

ちなみに規格上は未定義動作です。不正な動作となった後何が起こるか解らないためです。

96 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 08:41:48.16 ID:5WeN1P+Z.net]
>ちなみに規格上は未定義動作です。
mjd?!
そこだけ疑問があるので規格の該当箇所を教えてほしい
同一アドレスへの複数スレッドからのアクセスについては、規格で全く触れられていないだけでは?

コンパイラがコードを吐く際に、変数が他のスレッドから書き換えられる可能性など考慮しだしたら最適化が全く成立しないから、
同一アドレスへの複数スレッドのアクセスが未定義動作ということと、
コンパイラが妥当な最適化を行えているということは矛盾する

97 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 08:51:19.30 ID:5WeN1P+Z.net]
たとえば、
 int a = 10;
 ++a;
というコードが、aが他のスレッドから書き換えられる可能性があるからどんなコードが吐かれるかわからない、とか言われたら困るし有り得ない
ところが未定義動作というのはコンパイラが最強度maxで責任放棄するという意味なので、ガチで未定義動作ならそれが起こり得ることになってしまう。

98 名前:デフォルトの名無しさん [2015/12/08(火) 12:00:05.32 ID:YrvC8Vc0.net]
規格の該当箇所というか、atomicの概念そのものだろ
atomicでないオブジェクトへのアクセスは自己責任で排他制御が必要というだけ

99 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 12:03:39.88 ID:xTQHW/dy.net]
>>96-97
C++14 1.10 [intro.multithread] p23
> The execution of a program contains a data race if it contains ... .
> Any such data race results in undefined behavior.

データ競合がある場合の動作が未定義だからこそ、単一スレッド内では
他スレッドからのアクセスを無視した最適化ができるし、そうして最適化した
コードでも実際にデータ競合を起こすようなアクセスさえ無ければ何も壊れない。

100 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 15:16:21.20 ID:QEVUqltL.net]
>>95
詳しくわかりやすい説明、ありがとうございます。
おかげで無事プログラムが動きました。



101 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 15:22:24.80 ID:y1mdlUK+.net]
C++11 だと 1.10 Multi-threaded executions and data races [intro.multithread] (p. 11) かな?
>> 96
> コンパイラがコードを吐く際に、変数が他のスレッドから書き換えられる可能性など考慮しだしたら最適化が全く成立しない
これは正しい
> 同一アドレスへの複数スレッドのアクセスが未定義動作ということ
これも >>99 が示してくれたように正しい
> コンパイラが妥当な最適化を行えているということは矛盾する
これは正しくない
「同一アドレスへの複数スレッドのアクセスが未定義動作」だからこそ、
コンパイラはそれを無視して最適化してよいことになる
その結果として競合による未定義動作が起こり得るけど、それは仕様通りですよ、ということ
……という理解であってるよね?

102 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 15:56:10.25 ID:zjJIjn6V.net]
「同一アドレスへの複数スレッドのアクセスが未定義動作」
だからといって
コンパイラは無視して最適化したりしないけどね
むしろ別スレッドから値を変更される可能性を考えて
毎回メモリからレジスタにロードしなおすコードを吐くと思うがね

確実に自分のスレッドからしかアクセスしてない自動変数
つまり、自動変数のアドレスを逆参照して別の関数に渡していたりとかしていない
自動変数に関しては、変更がなければレジスタに置きっぱとかといった最適化がかかるが

オブジェクトのメンバとかグローバル変数とかはアクセスするたびに
毎回メモリからロードすると思うし
だからこそ int i = obj.member; とかやって一旦自動変数に入れることで
コンパイラの最適化を促すテクニックが広く知られているわけだが

103 名前:ネトuy ◆Qawu9.2l1E mailto:sage [2015/12/08(火) 16:09:43.28 ID:8RNVa/m0.net]
C++でマルチスレッドwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

104 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 16:38:20.29 ID:mthiYc/w.net]
>>102
>毎回メモリからレジスタにロードしなおすコードを吐くと思うがね
そんなことないその為にvolatileがある
グローバル変数のアクセスで間に関数呼び出し挟んだ場合は別だけどそれはスレッドを考慮してのことじゃない

105 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 16:54:20.27 ID:zjJIjn6V.net]
そう思うんなら試してみればよいだろう

いくら排他処理が完璧でも
前にレジスタにロードした古い値を使いまわして
新しい値が反映されなかったとしたらバグるだろう

ある値はたまたまレジスタに残ったままになっていたから古い値のまま、そのまま使って
別の値はたまたまレジスタに残っていなかったから新しい値をロードしなおして
ちぐはぐのままプログラムが走ったらクラッシュするだろ

だからクラスのメンバやグローバル変数はvolatileじゃなくても毎回ロードするのが普通

さもなくば、関数でローカルな変数以外の全ての変数をvolatileにしないとダメになるけど
そんなことしなくても大丈夫なようになっている

106 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 16:58:26.76 ID:zjJIjn6V.net]
第一、C++で高速化を狙うときに
メンバ変数を自動変数に代入して使うというのは有名なテクニック

107 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 17:11:13.68 ID:mthiYc/w.net]
>>105
いやなってないから
なってると思うんなら試してみればよいだろう
GCC(4.8.4 -O3)で
volatile int flag;
int main()
{
flag = 1;
while(flag) {}
}
でやると
movl $1, flag(%rip)
.L2:
jmp .L2
になるから
flagにvolatile付けると毎回メモリから読み込むようになる

108 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 17:20:23.95 ID:mthiYc/w.net]
あと、排他処理はmutex等を使うような場合は通常API呼び出しが入るから>>104
書いた「間に関数呼び出し挟んだ」状態になるんだよ
スピンロックを自前で実装するような場合は気をつけなければいけない

109 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 21:49:05.55 ID:uAong+Yo.net]
>>105
「お前がそう思うんならそうなんだろう、お前ん中ではな」
という言葉を贈ろう

110 名前:デフォルトの名無しさん mailto:sage [2015/12/08(火) 22:24:04.77 ID:RVFMry3L.net]
>>106の経験があって>>105の発言はありえないから
ネットで知識得ただけでプログラミングした気になってるという人だろうね



111 名前:96 mailto:sage [2015/12/09(水) 00:47:07.72 ID:fMIxS4Tn.net]
詳しいレスdクス寝ぼけて混乱したレス書いたわ;
未定義動作、と断言されてしまうとCPUアーキテクチャ上atomicなはずのアクセス(整数1語の読み書き)を用いた設計がNGになるのかと恐怖のあまり失禁したわ;
改めて「未定義動作」の語義をググッて知ったが、処理系の仕様で未定義動作でも、外部文書の仕様にしたがって動くとみなせる余地があるみたいね(ならば多分設計が成立する)

>>99
>Such data
は直前の
>at least one of which is not atomic,((2 actorsのうち、少なくとも片方が非atomic)
にかかってゐるからYAT安心

112 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 09:17:56.67 ID:tMTjYd9b.net]
まだ寝ぼけてね?

113 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 09:44:19.19 ID:T/q5j9E8.net]
今までのWindowsでdllをインポートする際、__declspec(dllimport) キーワードを省略していたんですが
これを付けたほうがより最適なコードになると聞きました。
具体的にどういう最適化がされるんでしょうか?
効果が薄いなら付けないままでいたいんですが

114 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 10:47:11.93 ID:+oP8EwDY.net]
>>113
間接ジャンプしなくなる程度じゃなかったかな

115 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 16:56:24.48 ID:T/q5j9E8.net]
>>114
なるほど
ありがとうございます

116 名前:デフォルトの名無しさん [2015/12/09(水) 18:34:03.46 ID:SsSL4Bxg.net]
2chって誰でも組めるプログラムしか組めないゴミ回答者が多いよな。
自己顕示欲を満たしたいだけだからその程度のいい加減な知識と経験でしか回答できない。
いい加減な知識しかないから、
医療や航空関係のシステムみたいにバグが致命的な惨事を発生させる仕事は受けられない。
その程度の知識しかないのに自己顕示欲を満たすために嬉々として回答するゴミクズ。
完全に正しい知識と十分な経験があるなら医療関係だろうが航空関係だろうが
仕事は受けられるはず。
それもできないのに回答者気取りで笑える。

117 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 18:52:26.18 ID:LDuXAdot.net]
自己紹介乙

118 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 19:32:38.42 ID:BsTHiUaA.net]
>>116 すごい自己顕示欲ですね

119 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 20:50:32.22 ID:VQsJCUvO.net]
>>116はコピペだろ
まぁ、日本のプログラマは技術者でなくゴミ扱いのドカタで
低脳、変人、基地外でも普通につける職業だからな
そんな奴らが集う板は当然ゴミ回答者が多いだろ

120 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 21:18:54.38 ID:ulePTNdz.net]
優秀な連中も多かっただろうが、そもそも雇う側(元請や顧客)が優秀かどうか判断出来ないから
その結果、不景気になった瞬間とりあえず片っ端から切り捨てていくから無能も優秀も纏めて消えていく
元請の連中は基本下流工程なんてやらないし



121 名前:デフォルトの名無しさん [2015/12/09(水) 22:46:00.66 ID:46Zoq0Ze.net]
上流か下流かを、高貴か下賤かに、錯覚する完全バカが多すぎるってことだよ
プログラムでも「スーパーバイザ」や「カーネル」は現業だろ
プログラマのくせにそこがわからないスーパーバカヤロウが何でこんなに多いんだ

122 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 22:53:57.25 ID:pqe3smnr.net]
たいへんもうしわけございません

123 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 22:58:54.99 ID:2j8cA7Bm.net]
下賤だから下流 し か できないのにそれに気付かない低能は
プログラマーになるしかないのです

124 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 23:09:38.42 ID:pqe3smnr.net]
>>123
下賤だから下流 しかできないけどにそれに気付いてしまった低能は?

125 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 23:15:43.36 ID:sKCiRVbx.net]
いいかげんにしろよ
マ板に行ってやれよ低能以下のゴミクズども

126 名前:デフォルトの名無しさん mailto:sage [2015/12/09(水) 23:42:23.84 ID:pqe3smnr.net]
>>125
もう少し気の利いたこと言えや

127 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 01:15:46.31 ID:Qmth+aWu.net]
ゴミ回答者いっぱいだな

128 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 01:48:45.47 ID:fBG2kDjg.net]
>>116
この単なる言いがかりはまさに自己愛憤怒だな
哀れ

129 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 12:44:12.91 ID:UzLxbQWy.net]
クラス内のstd::arrayメンバに初期化リストを使おうと
array<int,3> hoge{1,2,3};
とするとコンパイルエラーになり、
array<int,3> hoge{{1,2,3}};
とする必要がありました。
一方、関数内では前者でOKでした。
このへんはどういう理屈なんでしょうか?

130 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 15:05:54.32 ID:KM/AJKaa.net]
>>129
stackoverflow.com/questions/8192185/using-stdarray-with-initialization-lists

gccのバグっぽい
ちなみにgcc5.2.0では

#include <array>
#include <iostream>

int main()
{
std::array<int, 3> hoge{1,2,3};
for (auto& i : hoge)
std::cout << i << ' ';
std::cout << std::endl;
}

1 2 3

問題なし



131 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 15:11:57.57 ID:nOtJtIl6.net]
出ました!autoくん!

132 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 15:17:51.03 ID:pF3lLbMS.net]
gcc5.2でもだめだよ
#include <array>

class C {
//std::array<int, 3> a {{1, 2, 3}};
std::array<int, 3> a {1, 2, 3};
};

windows系のコンパイラでもこうなるらしい

133 名前:デフォルトの名無しさん [2015/12/10(木) 15:19:51.67 ID:6pjkL8uN.net]
下流のゴミってまさに>>129みたいな奴
hogeを使ってる書籍やサイトまともなもの何て1つもないが、
それに気付かず、hogeを使っても違和感を感じないほどそういうゴミサイトで学習もどきを続けた結果、
>>129みたいなヴァカでも分かる質問をする羽目になる

>>129みたいなヴァカ未満は単純な肉体労働以外をすると迷惑にしかならない

134 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 15:49:27.62 ID:3X9TgW+S.net]
よっぽどコンプレックスなんだろうなw

135 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 15:55:05.98 ID:m24vGLCh.net]
違和感を覚えるなぁ

136 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 16:12:46.86 ID:nOtJtIl6.net]
ほげほげぇ〜

137 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 16:16:58.27 ID:Euz5RcGj.net]
インターネットのプログラミング関係の話題はほとんどが
意味が通じなくて間違っているのしかない
馬鹿な奴ほど情報を発進したがるからこうなるんだろうな
教えることが下手な奴は奴は頭が馬鹿な証拠だからな

138 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 16:48:22.09 ID:d/tjCHBQ.net]
>>130,132
ありがとうございます。なんとバグでしたか。
melpon.org/wandbox/
で試したところ、gcc 6から直ってました。
WindowsではVisualStudio 2013 CTPで試したところ駄目でした。

139 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 17:05:44.05 ID:a/h4lSZi.net]
Visual C++を使っています。

>HEAP CORRUPTION DETECTED: after Normal block () at .
>CRT detected that the application wrote to memory after end of heap buffer.
といったエラーを
catchする場合には、何で受ければよいでしょう?
(...)以外で。

140 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 17:22:32.33 ID:EQVJS9H4.net]
VS2015 Update1 では問題ないな

#include <iostream>
#include <array>

class C {
std::array<int, 3> a {{1, 2, 3}};
std::array<int, 3> b { 4, 5, 6 };
public:
void print() const {
for (auto& i : a)
std::cout << i << ' ';
std::cout << std::endl;
for (auto& i : b)
std::cout << i << ' ';
std::cout << std::endl;
}
};

int main()
{
C c;
c.print();
}

1 2 3
4 5 6



141 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 17:46:35.22 ID:4Fg8f9T5.net]
>>139
Debug リリースかな? メッセージをよく読もう
catch しちゃ(できちゃ)だめだよ

142 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 22:22:03.18 ID:OHAY+OM1.net]
>>139
せっかくバッファオーバーランを教えてくれてるのだから

143 名前:デフォルトの名無しさん mailto:sage [2015/12/10(木) 23:57:14.33 ID:nOtJtIl6.net]
>>139
おまえがヒープぶっこわしているプログラムの修正が先だ!

144 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 00:02:17.38 ID:AA1k5ebD.net]
いるんだよなーどう考えても直さなきゃいけないバグなのに
握りつぶそうとする奴

145 名前:デフォルトの名無しさん [2015/12/11(金) 01:43:35.08 ID:pvLLFs2T.net]
c++のプログラマになりたい、と思ているJava屋です。JavaのPG単価が安くなり儲かりません。
やはり専門性の高いC++を選んでおけばよかったと悔やんでいるアホボケです。
STL以外は、市販の参考書でマスタしました。しかし、C++の現場は未体験です。
希望を与えて頂けるようなアドバイスお願いします。年齢30歳、男です。
よろしくお願いいたします。

146 名前:デフォルトの名無しさん [2015/12/11(金) 01:55:35.33 ID:L6hqxofP.net]
Javaのほうが仕事があって単価もいいのが通常。
C++はピンきりだろうが仕事自体が比較すれば少ない。

147 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 02:00:37.45 ID:U8sC3+JU.net]
ここで聞くなよ

148 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 02:02:43.02 ID:8lMxgOYY.net]
>>138
gccもう6が出てんのか・・・
バージョニング方法も変わったんだっけか

149 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 02:10:15.76 ID:AA1k5ebD.net]
>>146
仕事が多いというのはその通りだろうが単価はどうかな
Java屋なんて掃いて捨てるくらいいるんだし

150 名前:デフォルトの名無しさん [2015/12/11(金) 02:19:14.55 ID:L6hqxofP.net]
第10位 C++
求人年俸額平均:356万6,330円
掲載件数:1,552件

第8位 Java
求人年俸額平均:364万3,998円
掲載件数:3,623件

第1位 Scala
求人年俸額平均:401万5,909円
掲載件数:110件




プログラミング言語別給与ランキング【2015年版】?1位はScalaの401万5,909円?
hrog.net/wp-content/uploads/2015/10/20151026_matome12.png
hrog.net/2015102624991.html



151 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 02:20:45.27 ID:AA1k5ebD.net]
>>150
それじゃ「単価」は分からないから

152 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 02:26:32.41 ID:AA1k5ebD.net]
補足すると、デスマーチの連続で年俸が高くてもねって話

153 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 03:15:05.57 ID:m2z0YWef.net]
時給5千円 × 180時間 = 1人月90万円
システムと言えば、Javaだろう

C++の仕事は、ゲーム・カーナビぐらいしか思いつかない。
ゲーム会社のサラリーマンなら、年収400万円以下からスタート

154 名前:デフォルトの名無しさん [2015/12/11(金) 03:53:15.62 ID:JJUpFoTK.net]
ゲーム作りたくてプログラマになる奴を見ると、ゲーム開発よりプログラミングがやりたいのかと思ってしまう。
好きなゲーム作ったりゲームで儲けたりしたいんだったら、プログラマではなくプロデューサーや企画を目指すのが妥当。

極端な話、プログラマーとして入社したら、バイオハザードみたいなゲームを作りたくてもアイドルマスターみたいなゲームを作らされるかもしれないんだぜw

155 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 04:11:51.64 ID:8lMxgOYY.net]
ゲームエンジンとか作ってるとこならまだいいんだろうけどな

156 名前:デフォルトの名無しさん [2015/12/11(金) 05:03:23.12 ID:m81hILnz.net]
>>154
本当に本気の野郎はアイマスでFPS作ろうとするだろうよ
ゲームなんて見栄張るために作るわけじゃなし
そんな程度でやる気なくなる奴は企画だろうと何だろうと大したゲーム作れないだろ

157 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 09:12:12.85 ID:qHZwrA+M.net]
ゲーム作りたくて始めたらプログラムのほうが楽しくなった派の僕

158 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 09:42:37.74 ID:TzzA7+6M.net]
>>153
金融業界はC++が多い

159 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 10:35:37.43 ID:MQP/fuYv.net]
>>145
うちの会社に来るかね。
組み込みから通信、データ解析、画像処理から数値演算までc++を使い倒せるぞ。

160 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 10:39:58.53 ID:5V6d7Gh5.net]
>>145
C++の現場に入ったことないから知らないけど、STLは使えませんなんて言ったらえっ?ってなると思うよ
その現場でSTLを使うかどうかは別として、STLはC++の基礎の次段階みたいなものだから

Javaで言うならjava.util配下のクラスを使えませんってレベルに近い



161 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 12:14:14.29 ID:xR91L80y.net]
組み込みだとSTLも駄目なんだっけ?
てかCしか駄目か

162 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 12:50:19.54 ID:AA1k5ebD.net]
いや組込みで普通にC++使ってるけど
いまどきC++使えないボロ環境なんて投げ捨てろ

163 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 20:11:44.39 ID:IHx8frNM.net]
C++はx86やARM-Aといった富豪プロセッサではなく内蔵Flash ROM・内蔵RAMで動作する
組み込み系マイコンで一番使われているらしからな
x86やARM-AのPC系しかやれないって奴は趣味プのC++erぐらいだろ

164 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 20:20:03.83 ID:cNzjvsZV.net]
一方、俺は一昨日くらいにアセンブラ案件を目撃した。目撃しただけ。

165 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 20:52:57.54 ID:csVVyN8S.net]
オレサマの得意分野ダナ

166 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 22:10:14.31 ID:MeHC1kIB.net]
STLなんて20年前ならいざ知らず
今使ってる奴は相当痛い

167 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 22:19:22.90 ID:oVKJU75A.net]
お!?なんか凄い痛い発言しているような気がするんだが気のせい??

168 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 22:20:40.65 ID:0YKyOHUo.net]
などと言いながら STL にある関数をしこしこ再実装する >>166
…という図が見えた

169 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 22:21:37.91 ID:oVKJU75A.net]
STLが何のことかわかってねー希ガスw

170 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 22:25:22.40 ID:TzzA7+6M.net]
stlなしってvectorもalgorithmも何もかも使えないということ?



171 名前:デフォルトの名無しさん [2015/12/11(金) 22:30:39.09 ID:RiRLaM12.net]
struct hoge
{
 void hage( int val ){ printf( "%d\n", val ); }
 void hige(){ printf( "hige\n" ); }
};
hoge h;
const std::array< int, 3 > a = { 0, 1, 2 };
std::for_each( a.begin(), a.end(), std::bind1st( std::mem_fun( &hoge::hage ), &h ) );
std::for_each( a.begin(), a.end(), std::bind( std::mem_fun( &hoge::hige ), &h ) );

higeをfor_eachから
std::bindを使わず、新しいクラスや関数も作らずに呼び出す方法教えて下さい

172 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 22:50:20.83 ID:f+RTKPNq.net]
オレモオレモ

173 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 22:59:02.09 ID:MQP/fuYv.net]
結局のところ、リングバッファだなんだってのを一から実装する時代じゃないよね。

174 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 23:06:29.52 ID:EyOXjWDr.net]
boost.exceptionは継承なしでもつかえますか?

175 名前:デフォルトの名無しさん mailto:sage [2015/12/11(金) 23:32:50.26 ID:Y4hLkiiG.net]
>>171
static関数にするとか?

176 名前:デフォルトの名無しさん mailto:sage [2015/12/12(土) 00:21:32.57 ID:1fjgFEyg.net]
>>171
std::for_each(a.begin(), a.end(), [&](auto){h.hige();});

177 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/12/12(土) 00:31:22.39 ID:+qUXbAH4.net]
Boost.Circular Buffer

178 名前:デフォルトの名無しさん mailto:sage [2015/12/12(土) 11:11:36.89 ID:pLAOCluV.net]
>>171
もうお前は来るな
死ね

179 名前:デフォルトの名無しさん mailto:sage [2015/12/13(日) 00:49:44.71 ID:EpxG0SJy.net]
hoge 嫌いの人、復活したの?ひさしぶりだな。

180 名前:デフォルトの名無しさん mailto:sage [2015/12/13(日) 07:44:54.87 ID:qVjiFOWY.net]
まともな神経してたらhogeは受け付けないよ。
>>171みたいなクズがプログラミングをするのは勝手だが、
社会と接点を持とうとするなって話。
>>171みたいな奴は生きてるだけで普通に迷惑だし。



181 名前:デフォルトの名無しさん mailto:sage [2015/12/13(日) 09:31:41.61 ID:sUZJtfXg.net]
こいつがスレに住み着いたのいつから?

182 名前:デフォルトの名無しさん [2015/12/13(日) 12:51:45.64 ID:LQ/bBTKC.net]
こいつもしかしてhageなん?

183 名前:デフォルトの名無しさん mailto:sage [2015/12/13(日) 13:05:35.48 ID:kyMbAjxG.net]
ナウでヤングな玄人スーパーハカーはbar vazだよな!

184 名前:デフォルトの名無しさん mailto:sage [2015/12/13(日) 15:36:52.76 ID:oa4m3JE8.net]
いや、ホウケイなんやろ

185 名前:デフォルトの名無しさん mailto:sage [2015/12/13(日) 16:32:19.91 ID:J2FjjwDn.net]
リアルでも、C++使いの間では何気に認知されてるんだよなこの人

186 名前:デフォルトの名無しさん mailto:sage [2015/12/13(日) 22:15:59.69 ID:Ajlnr8Ac.net]
>>180
>>171みたいなことを必死に悩むってのがC++使いだからな

187 名前:デフォルトの名無しさん mailto:sage [2015/12/13(日) 22:17:41.13 ID:3ApC0baZ.net]
んなこたーない
勝手にレッテル貼りすんなボケ

188 名前:デフォルトの名無しさん mailto:sage [2015/12/13(日) 22:39:22.10 ID:kyMbAjxG.net]
>>185
えー、じゃあ本人にhageなのか聞いてきてよ

189 名前:デフォルトの名無しさん [2015/12/14(月) 00:59:53.36 ID:hJrc+Vr1.net]
C#の方から来たんですが、C#とC++11の違いをまとめた表ってありませんか?

190 名前:名無しさん@そうだ選挙に行こう mailto:sage [2015/12/14(月) 09:40:35.94 ID:ysJkAuL/.net]
違いが大きすぎてまとめられそうにない気がするんだけど
何に使うんだろう



191 名前:名無しさん@そうだ選挙に行こう mailto:sage [2015/12/14(月) 09:49:21.71 ID:2+GDL4RD.net]
>>189
まずアロケーションとポインタの関係を学習してから出直して来なさい

192 名前:デフォルトの名無しさん mailto:sage [2015/12/14(月) 20:58:31.62 ID:lP34oC27.net]
>>189
違いすぎてまとめても意味がないって感じになる
絶対に知っていないといけない違いは
C++11の方がC#よりはるかに優れていて、C++11からすればC#はゴミである
と言う事

193 名前:デフォルトの名無しさん mailto:sage [2015/12/14(月) 21:15:08.76 ID:agmKIOc6.net]
>>192
よくわかりました。ありがとうございました。

194 名前:デフォルトの名無しさん mailto:sage [2015/12/14(月) 22:11:02.80 ID:VJuIJuYL.net]
むしろ言語仕様でC++がC#より勝っているところを見つける方が難しい

195 名前:デフォルトの名無しさん mailto:sage [2015/12/14(月) 23:29:58.39 ID:A7WhCv85.net]
変態的なところはc++が完全に上

196 名前:デフォルトの名無しさん mailto:sage [2015/12/14(月) 23:51:08.63 ID:1ewiA+as.net]
標準ライブラリ使うのにメタプログラミングとかいう黒魔術をある程度知らないとだめとか開発ツールとして終わってるよね

197 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 00:32:57.87 ID:mMnPxVzA.net]
以前はC++/CLIが変態的と言われていたが、C++11/14でそれを超えた感があるな。

198 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 00:55:06.49 ID:fkyvVvJ7.net]
C++/CLIって書籍が少ないよな

199 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 05:35:36.95 ID:Y1MKLxaw.net]
>>197
超えてるか…? C++/CLI、凄まじく変態だぞ

200 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 07:12:31.41 ID:UMwjRqtT.net]
そりゃ書き方が下手なだけだろ



201 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 07:25:26.27 ID:mMnPxVzA.net]
>>199
そうか?.NETのために構文が拡張されただけで、わかってしまえばさほど変態的とも思わんがなぁ。
しいて挙げればデストラクタとファイナライザの両方あることくらい?

202 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 07:59:50.09 ID:yYTlvJtS.net]
いくらC++14が変態でもCLIの足下にも及ばない

203 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 08:36:50.22 ID:mMnPxVzA.net]
そう言っている奴が具体的にどこがどう変態的なのか書いているのを見たことない。
単に見慣れない構文に拒否反応示してるだけなんじゃないかなぁとも思う。

204 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 10:08:08.02 ID:9AhINhvX.net]
>>203
マネージドとアンマネージド記述が普通に混在してて
テンプレート据え置きとか変態もいいとこだろ
Perlかよ

205 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 10:24:44.73 ID:/AIAHmRl.net]
>>196
さすがにそれは違うだろ。
テンプレートを使ったメタプログラミングはとても素直なものだ。

206 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 11:53:26.32 ID:Z+PgRVVd.net]
俺もそう思う
テンプレートがあるからキャスト無しでコンテナが使えるから
初心者に優しいと思う

C++11で変態度が増したというけど
真の変態は誰がなんと言おうとBoostだったわけで
それが正式な構文となって整理されてマージされたから良かったのでは

古いC++でBoost使ってラムダ書いたりするよりは
C++11でラムダを書くほうが変態度は下がっているだろう

207 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 12:31:30.84 ID:/AIAHmRl.net]
言語が備えていない機能を無理やりライブラリで実現して有用と分かったらコア言語に組み込む。
この流れでまあまあ上手くいっているんだから変態どころか健全。

208 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 18:51:07.23 ID:pHTm9DD3.net]
void func(int a, int% b, [Runtime::InteropServices::Out] int% c)

誰がどう見ても変態です。

209 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 19:16:12.88 ID:Y0e3COsy.net]
ガベージコレクション言語が裏でやってること(メモリの固定)をプログラマーが明示的に書かないといけないのは間違いなくへんたい

210 名前:デフォルトの名無しさん [2015/12/15(火) 20:41:11.24 ID:HmW4QUJ7.net]
ぶーすとのラムダを好き好んで使ってたアホはいないだろ



211 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 21:15:48.26 ID:TS4gXElv.net]
ですよねー汗

212 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 21:23:46.61 ID:mMnPxVzA.net]
>>204
もともとそれが目的の言語だし、構文的にも明確に区別されているから見馴れりゃ気にならんがなぁ。

213 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 21:50:21.71 ID:9AhINhvX.net]
>>212
そら慣れりゃマシン語だろうと読めるようになるわ

使用者が自分から変態にしてるだけならともかく
C#とC++の使い分けのが利点が大きいのに
標準で変態構文な時点で純然たる変態言語だよ

214 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 21:51:56.16 ID:9AhINhvX.net]
利点が大きいのに の後に あえてそうせず が抜けた

215 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 22:23:22.06 ID:46Jh9WrX.net]
ブーストを真の変態と言うなら
Lokiはオナニーマスターだったな

216 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 22:35:57.17 ID:rigwBpve.net]
Lokiといえばタプルを15個までマクロで展開していたっけ

217 名前:デフォルトの名無しさん mailto:sage [2015/12/15(火) 23:54:02.66 ID:tA3N3CYu.net]
昔のプログラマはメモリ管理どころかCPUのキャッシュまで考慮したスゲープログラムを組んでやりたいと言っていたものだが…
今の若いのには技術者の意地や誇りは無いのか

218 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 00:11:14.79 ID:Caemc4xo.net]
機種依存はしたくないでしょ

219 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 00:15:59.64 ID:8y0O97u3.net]
昔は今ほど納期に厳しくなかったからな

220 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 00:24:32.57 ID:+q6Iq1Y4.net]
このご時世プログラミングに限らず、どの技術も誇りとやらを感じづらくなってるな
まぁ適当にやればいい



221 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 00:56:48.42 ID:BYsNFA/1.net]
ハイパフォーマンス系ではキャッシュを意識することは昔よりずっと重要になってるよ

222 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 01:27:12.21 ID:JW5d9jFI.net]
スパコン系は未だにfortranが使われているからな。
しかもそっち系人たちはここのような黒魔術に興味がないというか、わからないから未だにcを使っている。

223 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 02:56:46.03 ID:dUx1TxyF.net]
計算物理学系の研究室にいるんだが、ほとんどの人がCを使っていて、C++を使える人はちょっとしかいないな
スパコンとかで簡単に並列計算できるC++用のライブラリも最近できたのに

224 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 03:04:07.94 ID:ZdV6GcgI.net]
FortranやCしか知りませんって人がスパコンでしこしこ前時代的なコーディングしてるわけだからな
国益レベルで損してるとは思う
理系は初学年あたりでC++メタプログラミングを必修にしときゃいいんだよ

225 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 07:02:45.95 ID:17fDmmVI.net]
メタプログラミングがバラ色に見えた時代が私にもありました

226 名前:デフォルトの名無しさん [2015/12/16(水) 08:31:33.16 ID:7uqbUkJH.net]
実装する理論の勉強が忙しすぎてC++勉強してる時間がないんだよな
C++を一学期でマスター出来る授業があったら受けたいもんだ

227 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 14:05:15.35 ID:+q6Iq1Y4.net]
日本は教育界がC++全滅状態だからなぁ

228 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 18:26:31.22 ID:tLeJyzve.net]
C++みたいなクソ言語は特定用途のみでの使用に限定しないと。
全員C++とかそれこそ国益を損なうレベル。

229 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 19:49:22.68 ID:C0jgAL5S.net]
>>228
それはわりと本当にそうだな

230 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 20:05:14.98 ID:++aKhWi5.net]
引数による関数のオーバーロードと unique_ptr がある C が欲しい
あと多値を返せるようにしてくれたら文句はない
テンプレートも充実した標準ライブラリもいらない
クラスも継承も必要ない
そういうのが必要なときはそもそも他の言語を使うから

他に選択肢がないからしょうがなく C++ を使ってる



231 名前:デフォルトの名無しさん mailto:sage [2015/12/16(水) 20:07:06.80 ID:WoVXrJy8.net]
バカじゃ使いこなせないからな
バカでも習得できる言語じゃないと普及せん罠

232 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 09:49:20.48 ID:Gw5Yeqz+.net]
代案がないんじゃちょっと...

233 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 13:11:45.92 ID:vL92c8xT.net]
みんな概して消極的な理由でC++使ってるんかね

234 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 13:50:12.02 ID:NVRUH+ix.net]
numeric_limits::epsilonが存在する型は計算機イプシロン、
そうでない型は==による比較を実施するテンプレート関数を作りたい。
ただしdoubleと、floatを個別にspecializeはしたくない。

どうやったらよろしいんでっしやろ。

235 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 14:12:31.69 ID:znU3Wxr/.net]
無理
絶対特殊化は必要

236 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 14:22:40.66 ID:NVRUH+ix.net]
>>235
やっぱな。
テンプレート展開時に関数定義の存在の有無で条件コンパイルするような
マクロ擬きがあればいいのに。
現状だとメタプログラミングの価値が若干下がる。

237 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 15:00:42.47 ID:jqLfagmI.net]
このExampleの拡張で出来ないか?
en.cppreference.com/w/cpp/types/numeric_limits/epsilon

238 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 15:04:00.38 ID:Gw5Yeqz+.net]
出来ないんだろうか・・・?

239 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 16:26:40.62 ID:vZf67IZk.net]
>>235
いっぺんに特殊化すればいいだろ低能

240 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 19:40:40.81 ID:NNr9kjiP.net]
doubleとfloatだけならトレイツとかでディスパッチするようなことではダメなんだろうか?



241 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 21:06:23.95 ID:Gw5Yeqz+.net]
忘年会で確認てきないが普通にSFINEAできるのでは??

242 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 21:10:35.06 ID:deRekt1t.net]
>>221
必要に迫られて使っているんじゃないんだよ。自分の手で最高の物を作りたいと彼らは言ってたんだ。

243 名前:デフォルトの名無しさん [2015/12/17(木) 22:23:41.61 ID:RC4cKcKz.net]
>>231
その昔、バカでも習得できる言語が一時期流行ったかに見えて
そのあと超すげえコケかたしたよな
ほれ、FORTRANがプログラムを数式のように記述するのに対抗して
プログラムを英文のように記述するんだって頑張ったやつ

244 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 23:10:15.70 ID:O/TlL5Ei.net]
HyperTalkのことか。
言語としては面白かったが、確かにもう見ないな。

245 名前:デフォルトの名無しさん mailto:sage [2015/12/17(木) 23:13:09.94 ID:T7FXs248.net]
自然言語がプログラムを記述するのに適していないのだから流行るわけがない

246 名前:デフォルトの名無しさん [2015/12/17(木) 23:14:40.76 ID:Gizf3wfM.net]
これだろ?





PL/T ‐ 通信用語の基礎知識

1965(昭和40)年にIBMが発表した汎用プログラミング言語。
ALGOLを基礎とし、科学技術計算用FORTRANと事務処理用COBOLを1つにまとめ、オペレーティングシステム(OS)からコンパイラー、
果ては並列処理まで全てのプログラムを書けることを目的とした汎用の言語。

システムプログラムを記述できるようビット操作や割り込み機能を持ち、
必要事項を全て書かなくてもコンパイラーがある程度の内容を補う省略時解釈機能を持っているのが特徴。

しかし機能の多さから言語仕様が膨大で、しかも省略時解釈もあるためにコンパイル時間がFORTRANやCOBOLと比べて極端に遅く、
また生成されるオブジェクトの効率も悪いことが多い。

IBMではメインフレーム用の標準的言語として採用し、大手ユーザーに利用されていたが、FORTRANやCOBOLの機能拡張やCなどの新しいシステム記述言語の普及などにより、
PL/Tの利用ユーザーは現在では非常に減っている。

www.wdic.org/w/TECH/PL/%E2%85%A0

247 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 00:09:15.60 ID:VC/CNq1s.net]
バカはプログラミングしちゃ駄目だと思うんだ
悪貨は良貨を駆逐するってやつだ

248 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 00:16:43.00 ID:LnB+58/e.net]
>>70
うん、かなり数少ないので気は楽だ。主観的なものだが。

249 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 02:15:38.71 ID:skb65+d3.net]
質問です。
今ではほぼ覚えてませんが、昔Cをやったことがあります。
スクリプトではPerlとRubyが今でも使えますが、ネイティブでよく普及していてなんでも幅広く便利そうなC++を使いたいです。

そこでマイクロソフトのVC++だかなんだかをインストールしましたが、
いきなり巨大なソフトが立ち上がって使いかたも分からんし、意味の分からんVC++専門用語(?)を当たり前のように連発してきて吐きそうです。
最初にいきなり意味の分からない設定みたいのを求められるし、どこになんの記述を書けばいいのかも分からないし、コンパイルの仕方も分かりません。
出てきた画面もいちいちごつくて、項目やタブやメニューや設定がたくさんあって叩き壊したくなります。

こんな私に、使いやすいフリーなお勧めのC++コンパイラを紹介してください。
環境はwindows7がメインです。

250 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 02:25:01.55 ID:hJtnXN6r.net]
>>249
windows なら素直に MinGW
コンパイラはインストール時に入る g++ でもいいし
TDM-gcc/g++ を入れてもいいし clang を入れてもいい
IDE/エディタはご自由に



251 名前:デフォルトの名無しさん [2015/12/18(金) 02:32:24.17 ID:mW73V6Fc.net]
これはコンパイラの相談ではなくIDEのことだろ?
コンパイラ単体でみれば、どれもコンパイルする手間に大差なし。対応してる規格には差はあるけど。
VC++だとcl.exe ○○とかいうコマンドのはず。

252 名前:デフォルトの名無しさん [2015/12/18(金) 02:40:15.43 ID:mW73V6Fc.net]
手軽なのは、VC++を残して利用して、テキストエディタからVC++でコンパイルさせるといい。





[サクラエディタ]マクロを利用したC言語のコンパイル

わんちゅうさんの、わんちゅう日記とEmEditor (テキストエディタ) - FAQの参考に
サクラエディタからコマンドプロンプトを起動して、
C言語/C++のコンパイルを行うVBScriptのマクロを書きました。
ameblo.jp/middleisland88/entry-11611804913.html



EmEditor FAQ: 外部ツールの定義例を教えてください。
Visual C++ でコンパイル
[コマンド] %WinDir%\system32\cmd.exe
[引数] /k "C:\Program Files\Visual Studio\Vc7\bin\vcvars32.bat"&&cl $(Path)
[初期ディレクトリ] $(Dir)
[アイコン パス] C:\Program Files\Visual Studio\Common7\IDE\devenv.exe
jp.emeditor.com/help/faq/tools/tools_external.htm

253 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 02:40:51.79 ID:skb65+d3.net]
>>250
ありがとう
よく分からないけど、とりあえずmingw-get-setupとか言うのをダウンロードしたとこです。
あとは適当になんとかしてるうちになんとか出来る物であればなんとかします。

254 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 02:46:00.98 ID:skb65+d3.net]
>>252
どうもありがとう。
そうゆうのいいね。
秀丸でもそうゆうの出来るかな。たぶん出来ると思うけど。

VC++がコマンドで動くんなら検索してみます

255 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 03:44:35.35 ID:rBQUliqS.net]
>>253
gccとか言うのがインストールされてコマンドでtest.exe作れた
ありがとう

256 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 03:50:23.90 ID:rBQUliqS.net]
なんかよく分からんのだけど、
gccじゃなくてg++でコマンド打てばC++なの?

いやまじ質問厨で本当にすみません

257 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 04:23:31.85 ID:LcpSiDxD.net]
そうなんだぜ

258 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 04:37:59.68 ID:rBQUliqS.net]
いろいろやってみたら思った通りにC++できますた。
本当にありがとう。

259 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 07:52:28.50 ID:Pn8g8BvN.net]
>>247
これは本当にそう思う
国家的な損失にまで発展してる

260 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 08:21:58.74 ID:i13cEfwD.net]
高速逆走車と同じだな



261 名前:デフォルトの名無しさん [2015/12/18(金) 08:42:31.44 ID:OysfGD3G.net]
バカがプログラミング業界に入るのを後押ししてしまった
申し訳ない

262 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 08:48:41.06 ID:GSLUIhyT.net]
俺も俺も

263 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 09:51:47.59 ID:Aqcnirsz.net]
VirtualC++って、その名称だけで害悪だよな
このツール使ってるだけで、「俺、C++使えてる!」だもんな

264 名前:デフォルトの名無しさん [2015/12/18(金) 09:55:03.23 ID:EXrM1djR.net]
そうやって国家的損失を出させるためにわざとプログラミングの敷居を低くしてる奴とかいるよな
H○Pとかな
無血テロの一種だよ
反日活動に他ならないしH○P作ってる奴ってチョンじゃないのか

265 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 10:33:17.13 ID:i13cEfwD.net]
>>263
>VirtualC++
なんだねそれは?

>>264
そういう戦略的な反日活動をや(れ)るのは別な国だろう。いやマジで。

266 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 15:35:30.74 ID:TybGXFad.net]
>>239
基本的に同じものを何度も書かずにバグの温床を減らすことも
メタプログラミングの目的なわけだが、どあほ。

バグ修正時にdouble版でテスト、float版への反映漏れとかありうるわけだが。

267 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 16:30:23.42 ID:hJtnXN6r.net]
>>266
float と double 両方のケースがあって、
テストで double 版しかチェックしてなかったってこと?

268 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 16:34:04.17 ID:i13cEfwD.net]
>>234
epsilonが存在しない型ってあるの?それとも「エラーになる型」の意味かね?

269 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 16:40:18.63 ID:njnmfUV6.net]
>>234の要求は
is_floating_pointでenable_ifして浮動小数点版とその他版作れば出来るからそれでやれ
numeric_limits::epsilonが存在するかどうかじゃ判断できないよ

270 名前:デフォルトの名無しさん mailto:sage [2015/12/18(金) 19:34:49.00 ID:i13cEfwD.net]
やっぱそうだよね



271 名前:デフォルトの名無しさん [2015/12/18(金) 23:15:53.45 ID:H9Ln3p1p.net]
プログラマはMacを使ってるってマジ?
hayabusa3.2ch.net/test/read.cgi/news/1450395043/

272 名前:デフォルトの名無しさん [2015/12/19(土) 12:31:04.93 ID:jcVpBQag.net]
薄い書籍でC++11の機能を含めて解説してるお勧めがあったら教えてくれないかな?
C#しかわからない人間がフリーウエアの将棋エンジンのソースを見ていたところ、C++11の機能が多用されており意味不明だった・・・・
書けるようにはならなくても、コードを読めるように手っ取り早くなりたいな

273 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 12:36:19.99 ID:o/T2uvqt.net]
type_traitsの件ありがとう。
11の機能を全部把握してなかったので、そういうのが出来たのかって感じ。
ただ、結構トリックつかわないと難しそうだね。
if文でうけちゃうと普通に条件分岐のコードがでるから、
boolをテンプレート引数にとるクラスか関数を作って2段階でやるとかなんとか。

274 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 13:09:07.98 ID:G+MS02M3.net]
>>272
将棋ソフトなんて高速化のためのハック満載じゃないの?
遠回りでも他のコードを見たり自分で何か書いてみたりした方がいい気が

275 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 14:14:18.83 ID:xvN4NzGm.net]
>>273
type_traitsは昔からあるよ
ifは実行時分岐だから、コンパイル時分岐との違いを理解しないとTMPは一生理解できないよ
そしてboolをうけとるメタ関数は自分で作らずboostのmplをつかうとよい

276 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 14:29:21.13 ID:L2SZ6ujc.net]
>>273
234の人?それならboolをテンプレート引数にとるとか必要ないと思うが?
enable_ifの使い方を覚えればいいだけだよ
10行も掛けないで出来る

277 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 15:28:55.23 ID:L2SZ6ujc.net]
暇だから書いてみた
https://ideone.com/FGFyhZ
これだけのことだと思うが?10行未満は苦しいかw

278 名前:デフォルトの名無しさん [2015/12/19(土) 16:00:55.05 ID:Lxlb3fZy.net]
template< typename T > inline T hoge( void* ){ return 0; }
int main()
{
struct hage{};
int val;
hage* const p = hoge< hage* >( &val );
return 0;
}

test.cpp: 関数 ‘int main()’ 内:
test.cpp:6:38: エラー: ‘hoge(int*)’ の呼び出しに適合する関数がありません
hage* const p = hoge< hage* >( &val );
とでます。何故ですか
gcc4.9.3です。

279 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 16:10:54.52 ID:GwbSAsaX.net]
gccで日本語のエラーメッセージは出ません
以上

280 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 16:13:42.43 ID:nbsz3GyT.net]
-std=c++11つければコンパイルできる



281 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 16:24:42.68 ID:G+MS02M3.net]
gcc で C++ をコンパイルしてるのか
ちょっともにょっとする

282 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 16:27:05.31 ID:TmayNbxK.net]
おれも昔gccがgnu compiler collectionの略だからどんな言語もコンパイルできると思っていた時期があった。

283 名前:デフォルトの名無しさん [2015/12/19(土) 16:27:42.65 ID:Lxlb3fZy.net]
>>280
何故つけないとコンパイルできないのですか

284 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 16:29:06.77 ID:nbsz3GyT.net]
理由なんてない
つければいいんだよ

285 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 16:38:03.57 ID:G+MS02M3.net]
g++ もバージョンによっては -std=c++11 が標準になったりする
最近 window 環境に tdm-gcc を入れたらそうなってた気が

ところで馬鹿を晒すようだけど質問
-std=c++1y は -std=c++14 とどう違うの?

286 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 16:42:29.86 ID:G+MS02M3.net]
自己解決した

ttp://stackoverflow.com/questions/28825113/difference-between-gcc-compile-options-std-c1y-and-std-c14
> c++1y is a name that was used to refer to the c++14 standard before it was completed, so it is most likely adhering to a draft of the standard, but not the actual standard itself.

ttp://clang.llvm.org/cxx_status.html
> You can use Clang in C++14 mode with the -std=c++14 option (use -std=c++1y in Clang 3.4 and earlier).

c++1y の方が c++14 より新しいと思ってたけど、逆なのね

287 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 19:08:33.87 ID:o/T2uvqt.net]
>>275
ないだろ。
c++11から導入ってなってたぞ

288 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 19:20:09.50 ID:o/T2uvqt.net]
>>276
enable_ifなんてものあるのね。
boolをひきすうにとったテンプレートとかいってやろうとしてたのはまさにこれ。
is_floating_pointをひきすうにとってなんとかしようかなと。

289 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 21:02:14.06 ID:xvN4NzGm.net]
>>287
type traitsは技法の名前

290 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 21:09:07.63 ID:znCnMDXz.net]
なんでこんなにめんどくさいのか
C#みたいに強力なメタ情報をサポートすりゃいいのに



291 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 21:12:18.84 ID:o/T2uvqt.net]
>>289
type_traitsって書いたのに。
type traitsじゃないよ

292 名前:デフォルトの名無しさん mailto:sage [2015/12/19(土) 21:23:05.73 ID:xvN4NzGm.net]
>>291
失礼しました

293 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 00:30:20.08 ID:+3VSZzfw.net]
>>290
受益者負担の原則とかなんとかで、必要なコストは必要な人だけが払う、という考えが C++ の根底にある
だから特に配慮しない限り実行時型情報のサポートは限定的にならざる負えないんじゃないかな
#include <typeinfo> とかしたときにオブジェクトファイルがどうなるか知らないけど、
俺はそう理解してる

っていうか、実際にどうなるの?
gcc/g++ で -g オプションを指定するとソースファイルの情報が埋め込まれるみたいに、
クラス名とかが文字列としてバイナリに埋め込まれるとか?

294 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 00:44:51.48 ID:ujiFhYYe.net]
std::vector<int> vec{0,1,2,3,4};
for( auto num : vec)
{
// ここにコード書いて 0, 1, 2, 3, 4 std::endl出力となるようにしたい
}
これで
次に表示する要素があるときは要素表示のあと", "を表示して、
最後の要素の時はstd::endlってしたいんだけどどうしたら良い?

295 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 00:48:44.06 ID:3zlmhSVS.net]
タイムリーだな

296 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 00:55:57.22 ID:+3VSZzfw.net]
std::vector<int> vec { 0, 1, 2, 3, 4 };
for (auto num : vec) { cout << num << ", "; }
std::cout << "\033[2D\033[0K" << std::endl;

とか?

297 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 01:01:05.51 ID:ujiFhYYe.net]
>>296
for を出た後にstd::endl;なら低脳の俺でも出来る
forの中でやりたいんだ

298 名前:296 mailto:sage [2015/12/20(日) 01:09:14.72 ID:+3VSZzfw.net]
>>297
関数化しなよ
boost 使える環境なら boost::algorithm::join があって綺麗に書けるけど

299 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 04:58:53.33 ID:ejwChM94.net]
1ループごとに前のendl消すかBSでも入れるしかないな

300 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 12:34:00.19 ID:ofrSOHxv.net]
>>224
Fortranがきのこってるのは人力による最適化に適しているからであって
決してゆえなきことではない

逆に言うとFortranがきのこってるのはコンパイラによる最適化技術の追求をサボっている>>224が悪い



301 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 16:32:25.86 ID:A2b3bh9r.net]
>>283
付けたくないならg++を使いましょう

>>294
自分はforの中にif (first) {...}って書くけどお勧めってわけでもない。
c++自体がfirstとかfinallyとかいった構文を用意してくれればいいのに

302 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 16:54:10.94 ID:zUb91iMF.net]
range based forの中でやりたいってのが意味不明
宿題かなんかか?
俺ならforの中では文字列を作ってfor抜けた後で最後のカンマを改行に変えてから出力するな
いちいち出力するよりその方が速いよ

303 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 18:25:45.44 ID:6vo8OCaj.net]
>>297
for (auto num : vec) とかじゃなくてiteratorで回して良ければループ内で先頭と最後を判定できるのでおk、
for (vec_t::const iterator it = vec.begin(); it != vec.end(); ++it) {
 if (it != vec.begin()) { std::cout << ","; }  // ・・・(1)
std::cout << *it;
 it (it == vec.end() - (size_t)1) { std::cout << std::endl; }   // ・・・(2)
}

ただ個人的にはループ内でムダな処理はしたくないので、少なくとも(2)はループ外に出したい(if文は外す
コーディングとテストに時間的余裕があれば(1)もループ外に出したい(その場合vec.size()が0, 1, 2以上のときの場合分けが要るが

"\033[2D\033[0K"の使用はムダなデータが書かれるし、実際表示がうまく逝くかどうかすら環境依存なので認め難い

304 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 18:32:12.48 ID:6vo8OCaj.net]
余談になるかもしれんが、もしstd::ostream::operator<<(const T*)が__declspec(noalias)みたいな宣言付きでないなら、
vec.begin()とvec.end()はループ外でローカル変数にコピーして、ループ内ではコピーした方を使ったほうが速く動く可能性が高い
(さもないと、std::cout.operator<<()の呼び出しでvec.begin()とvec.end()が変更される前提のコードが吐かれる

305 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 18:39:10.23 ID:RO+992jd.net]
>>303
無駄だな
そこは、elseで対応できるだろ
ループ内の++itも要らない

for (vec_t::const iterator it = vec.begin(); it != vec.end();) {
 std::cout << *it;
 it (++it == vec.end()) std::cout << std::endl; else std::cout << ",";
}

306 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 18:43:28.87 ID:6vo8OCaj.net]
>>305
スッゲ良くできてるwwwwwwwwwwwww

307 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 18:47:25.44 ID:RO+992jd.net]
いや、もっと簡単に出来るな
ループ内条件も要らなくなる

if(!vec.empty())for(vec_t::const iterator it = vec.begin();;) {
 std::cout << *it;
 it (++it == vec.end()) {std::cout << std::endl;break;} else std::cout << ",";
}

308 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 18:56:48.94 ID:14eB8c4R.net]
がしかし、フラグを使う方が記述は冗長なものの意図は明確だし
パフォーマンスも良かったりする。

309 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 20:08:22.46 ID:6vo8OCaj.net]
>>308
計ってみたらたしかにそうっぽいorz
VS2010でメモリ上のcharバッファに0..99をお題形式の文字列として100000回書き込むやつで10回計って平均をとったらこうなったわ;
Firstフラグ方式: 平均   3.249秒
>>307そのまま: 平均   9.044秒
vec.end()をループ外に出した: 平均   5.762秒

検証コード:
ttp://ideone.com/O1nUEN
(※ codepad.orgの方が何か死んでるので、仕方なくVS2010のコードのままideone.comの方に貼った。

310 名前:デフォルトの名無しさん [2015/12/20(日) 20:19:11.13 ID:t9oK2aYV.net]
std::threadでsuspendやresumeをするにはどうすればいいですか



311 名前:デフォルトの名無しさん mailto:sage [2015/12/20(日) 20:54:02.51 ID:aEd4AL0D.net]
>>310
native_handle()を使って何とかする

出来なければ環境・処理系固有の命令を使って
自身のスレッドハンドルを取得して何とかする

312 名前:デフォルトの名無しさん mailto:sage [2015/12/21(月) 00:58:22.36 ID:7MqiSgar.net]
イテレータってこんなに時間かかるんけ?

313 名前:294 mailto:sage [2015/12/21(月) 01:34:04.80 ID:CleoLuQ0.net]
お前ら色々感謝
for(:)内で1,2行のコードでやれればベストなんだが、諦めて
下の関数のようにして要素をstringにしたのを返すことにする,orz
template <class T>
string cont_show(const std::string& pre, const std::string& separator, const T& v)
{
std::string str = pre;
for( const auto ele : v){
// str += ele ;
str += std::to_string(ele);
str += separator;
}
str.erase(str.rfind(separator));
return str;
}
cout << cont_show("vec= ", ", ", vec) << endl;

314 名前:296 mailto:sage [2015/12/21(月) 08:43:09.16 ID:bZVc/vPs.net]
>>312
そんなわけないと思ったので確認してみた
で、>>309 がどういう条件でコンパイルしてるか分からんけど、
Visual Studio の Debug モードで測定してる予感

コードほぼそのまま(mingw 環境なので sprintf_s と strcpy_s は snprintf と strncpy に置き換え)で
g++ a.cc -std=c++14 -O2 で測定するとそれぞれの平均は
0.586 s, 0.581 s, 0.591 s で、これはほぼ同等の速度とみなしていいと思う
アセンブラも確認したが特筆するような違いはない

ちなみに最適化レベルを変えると
-O0: 0.653 s, 0.725 s, 0.684 s
-O3: 0.591 s, 0.580 s, 0.578 s
-O3: 0.587 s, 0.583 s, 0.579 s (main の N を 10 から 100 に変更)
って感じ

315 名前:314 mailto:sage [2015/12/21(月) 08:44:20.26 ID:bZVc/vPs.net]
あ、名前欄はミス
>>296 じゃないよ
失礼

316 名前:デフォルトの名無しさん mailto:sage [2015/12/21(月) 11:50:08.12 ID:8MgwTH8n.net]
>>293
実行時の話ではないでしょ。

317 名前:デフォルトの名無しさん mailto:sage [2015/12/21(月) 12:08:05.01 ID:7MqiSgar.net]
>>314
ご苦労であった
たかだかイテレータ使ったが為にこんなにトロいコード吐くわけないと思っていたところだぬん

318 名前:デフォルトの名無しさん mailto:sage [2015/12/21(月) 14:07:33.15 ID:s2cNQ2/b.net]
VSのデバッグモードが糞遅いってこと?

319 名前:デフォルトの名無しさん mailto:sage [2015/12/21(月) 15:11:06.35 ID:j5AZWO2W.net]
そうだよいろんなデバッグ用コードが入るからね

320 名前:デフォルトの名無しさん mailto:sage [2015/12/21(月) 15:21:43.26 ID:bZVc/vPs.net]
>>318
それはまあ仕方ないんじゃないの

で、VS (Comm. 2013) でも試してみた
条件は /O2 /Ob2 /Oi
結果: 0.802 s, 0.798s, 0.821 s
g++ 版より遅いのはなんでだろ
単に snprintf/sprintf_s の差かな
まあマイクロベンチでこの程度の差なら実質同じと言っていいのかな



321 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 00:30:00.59 ID:6ynvCyVW.net]
なんでいまだにハンガリアンなん?
オブジェクト指向言語と相性悪くね?

322 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 00:34:47.34 ID:Ca/2LP3t.net]
コンパイラの最適化知らないとか古参の老害でもなさそうだしワケワカランな

323 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 01:18:51.43 ID:FWHE1HV9.net]
>>321
単なる命名や書き方にそこまでの影響があるわけ無かろう

324 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 02:22:11.40 ID:7c90Jv4P.net]
えっ?!なにっ?!
ハンガリアン記法で書くと最適化が効きやすくなるの?

325 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 03:51:57.86 ID:dbVFaMrP.net]
アンカーついてないから最適化に失敗しちゃったか

326 名前: ◆tAo.kQ2STk mailto:sage [2015/12/22(火) 13:12:57.48 ID:S5fGjlFA.net]
ハンガリアン記法にもシステムハンガリアン記法とアプリケーションハンガリアン記法の二つがあってだな

それらの記法をコンパイラが使うなら最適化も効きやすくなるだろうな。
wasabiって言語がそうなってるって昔どっかで読んだ。
c++だと変わらないんじゃね?

327 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 13:36:19.20 ID:w8K4gGa9.net]
変わってたまるか
言語設計としてそうなってるならともかく、たまたま変数名の先頭が p だったり c だったりで
コンパイラの挙動が変わったら困るだろ

328 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 15:22:18.92 ID:IyWWqIrY.net]
変数名の先頭が i だったり j だったりすると
コンパイラが自動的に整数型にしてくれる言語が…

C++じゃないけどな。

329 名前:デフォルトの名無しさん [2015/12/22(火) 15:52:26.91 ID:/dHF4x6s.net]
研究室にあるその言語のファイル見たら一ファイルあたり1000行超えててワロタ

330 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 17:39:34.68 ID:i6Ub8YBB.net]
大学のプログラムは闇



331 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 18:15:03.49 ID:3LtJTVBP.net]
じゃあモンゴリアンで

332 名前:デフォルトの名無しさん [2015/12/22(火) 18:56:28.29 ID:+S+I61oO.net]
質問です。

構造体の階層が深くなった場合に
このようにコードが長くなってしまうのですが
何か良い方法はありますでしょうか。

if(Aaa[i].bbb[j].ccc[k].ddd<Aaa[i].bbb[j].eee)
{
Aaa[i].bbb[j].ccc[k].ddd=Aaa[i].bbb[j].eee;
}

333 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 18:58:57.92 ID:rq+weehK.net]
>>332
auto & baka = Aaa[i].bbb[j].ccc[k].ddd;
ただしビットフィールドには使えない

334 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 19:59:25.26 ID:P8CDnsgj.net]
>>329
うちのくそコードなんか1関数1000行越えてるのがよくあるぞ。
1万行オーダーのクラスとかもな

335 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 20:02:59.58 ID:w8K4gGa9.net]
>>334
逆に考えるんだ
「自動生成してるのかもしれない」と考えるんだ

336 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 20:38:52.24 ID:KoWAYpVI.net]
VBだとメソッド1000行がデフォルトの案件はよくある
っていうか比較的まだ良心的なほうだな

337 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 20:52:45.82 ID:c/oP9Kt2.net]
でもさ、特に再利用されるわけでもない処理を
長くなるからって理由だけで関数に分けるのは無駄だよな
void func()
{
  func1();
  func2();
  func3();
  ・・・
  func100();
}
これでfunc1〜func100がfuncからしか利用されてなかったのなら
分ける意味ないよな
変数名の汚染が怖いなら、ブロックにわければ良いだけだし

338 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 20:57:21.38 ID:HfEapSwJ.net]
>>337
全然うれしくないけど長すぎたら分ける。

それにしても前提が極端だな。そんなことってあるか?

339 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 20:59:13.50 ID:R5YQBigH.net]
だからってスパゲティを横でズルズルすすられるのもな

340 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:06:33.45 ID:R5YQBigH.net]
メンテも糞も考えてないソースはオボコみたいにコピペの嵐だったりする



341 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:08:22.05 ID:c/oP9Kt2.net]
俺は分けるとしても再利用される可能性が無い処理は
ラムダで関数内関数風にして関数内に封じ込めるけどな
普通の関数やメソッドにしちゃうと名前空間を汚すからね
あちこちから呼び出される可能性を残してしまって読む方も困惑する

342 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:15:51.40 ID:HfEapSwJ.net]
それだと元の関数が短くならないからちょっと心残りだよね。
つか、>>337で、func1〜func100がfuncからしか利用されてないっていう時点で分割のしかたが悪いんだと思う。

なんとか
void func()
{
  util1();
  util2();
  util3();
  ・・・
  util100();
}
っていう形にして、util1〜util100が他でも使えるようにすることを考えたい。

343 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:22:21.51 ID:c/oP9Kt2.net]
オブジェクトの状態が中途半端な状態でreturnしたら始末に終えないから難しいだろうね
一塊な一連の処理というのはどうしても存在するし
そのためだけに設計を練り直すのも、それでプログラムが余計複雑な構造になったら馬鹿らしいしね

344 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:27:35.79 ID:07eSaah4.net]
>>337
あるわ
関数に分ける作業は、スパゲティー化した関数の事後の解析手段としては大いにアリ

ブロックにしただけだと、ブロック外で宣言された変数をブロック内で使い放題なので、本当に使っているのかどうか判然としない
グローバル変数を含まない関数に分けてみてはじめてコンパイラの力で「使われていない」ことが証明可能になる。

1000メンバの構造体に対する読み書きとか、
1000個のグローバル変数に対する読み書きとかやってる関数を考えたらワカル
実際に漏れはやった

345 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:29:09.94 ID:c/oP9Kt2.net]
上から下に綺麗に順番に流れていく処理というのは
構造的な複雑さがなければ、長くなっても順番に読んでいけば読めるしね
そこでgoto文とかを使って複雑怪奇な制御フローにしちゃうと
誰も読めないよねってだけで

安易に関数やメソッドに分けちゃうと、他の箇所からも呼び出される可能性を残すし
単品で呼びだされてもオブジェクトの状態として不整合が無いように実装するには
すごい労力がいるよね

ラムダを使って関数内関数にしておけば他所から呼び出される心配がないから楽だよ

346 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:31:58.20 ID:h9Uf3G+h.net]
この例題だと一箇所からしか使われなくてもメソッドにしたほうがいい
つうかコマンドのリストにするね
分割しない奴はプログラマ廃業したほうがいい

347 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:31:59.16 ID:c/oP9Kt2.net]
>>344
それでもキャプチャ無しのラムダに分ければ十分だよね

348 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:32:18.15 ID:HfEapSwJ.net]
長さの制約ってないんですか?

349 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:42:49.94 ID:07eSaah4.net]
>>347
C++のラムダはよう知らんが、「キャプチャしていない」ことをコンパイラが証明してくれるかどうかに一抹の不安が…
ラムダは本質的に自由変数を束縛するブツなのでキャプチャが思わず自然にできてしまう気がして怖い…

あとgotoが無く構造的に複雑でもないのに読みづらいというケースは有り得る
void foo(<引数>) { Aブロック; Bブロック; Cブロック; Dブロック; Eブロック; }
というちょう長い関数が実はデータフロー的には
 <引数>→A→B→E
 <引数>→C→E
 <引数>→D
でしかなかった、とかがそれ

350 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:48:19.23 ID:07eSaah4.net]
上の例で、A, B, C, D, Eがいっぱいコードが詰め込まれたブロックで、1000メンバの構造体を好き勝手に読み書きしているだけに見えるコード、とか
見かけはガチのスパゲティーコードだが、関数に分けて行けばほぼ機械的な作業でブロック間のIN/OUTが明らかになる、



351 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 21:52:41.05 ID:h9Uf3G+h.net]
つかc++プログラマってこんな馬鹿だったっけ
>>337とか深刻なレベルでヤバイよな

352 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 22:05:36.21 ID:fpkW4NSe.net]
Cスレと間違ってるんだろ

353 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 22:10:24.68 ID:w8K4gGa9.net]
データ構造とアルゴリズムを議論せずにコード量を云々しても……
1000メンバの構造体ってありえるの?

354 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 22:24:18.60 ID:07eSaah4.net]
>>353
>データ構造とアルゴリズムを議論せずにコード量を云々しても……
できる!
アルゴリズムの選択と、関係ないものをまぜこぜにしたコードの汚さは分けて議論できる
処置も然り

データ構造については一つの構造体が読みも書きもされる、という時点で黄色信号が点っていることがワカル
void foo(struct Foo& a)よりもvoid foo(const struct Bar& a, struct Baz& b);の方がなんぼかマシ
(*thisはどうなんじゃ、という反論が来たらもっと書く

1000メンバの構造体は、入れ子の構造体を数えたら1000個超えてた; という形でしばしばある

355 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 22:28:42.75 ID:c/oP9Kt2.net]
メンバ数1000とかは彼が一人で言っているだけだからね
そんなものは処理をメソッドに小分けにしたところで
結局その1000個のメンバにアクセスし放題だから、複雑さは一緒だね

こういうものは、当たり前だが、処理を関数に分ける以前に
まずはデータ構造を小分けにするべきで
そうすると勝手に処理も小分けになるケースだね

356 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 22:31:13.09 ID:c/oP9Kt2.net]
構造体が入れ子になっているのなら
その一つ一つの構造体にデータにまつわる処理をメソッドとして移すのがOOPの基本だろう

357 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 22:32:54.25 ID:vtL8Us2q.net]
てか、長いコードが全て意味的に階層化できずフラットになるとかあり得ない。

358 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 22:35:22.54 ID:h9Uf3G+h.net]
クラスを分割すればいいだけ
メンバ数1000とかギネスでの狙ってんのかよ

359 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 22:36:34.04 ID:c/oP9Kt2.net]
長い処理を分けるにしても、小分けにした処理を違った順番で呼び出すと
エラーになるようなものは例えprivateだとしてもメソッドとして公開したくはない
そう思うのが普通だろう
そういう場合は関数内でラムダを定義して関数内関数にして小分けにすればよいわけだ
そうすれば一切外部に公開されないし、その関数内でしか呼び出せないのだから安心だわな

360 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 22:36:40.78 ID:07eSaah4.net]
>結局その1000個のメンバにアクセスし放題だから、複雑さは一緒だね
驚くべき決め付け力!

関数void foo(struct HugeStruct& x);を
関数void func_ABE(const struct SmallStruct1& x, struct SmallStruct2& y);と
関数void func_CE(const struct SmallStruct3& a, struct SmallStruct4& b);とか
に分ければ>>349なケースにおいて複雑さは減るし、データ構造は小さくなる
IN/OUTを明らかにする、とはこういうことを指向している
(無関係なものを排除するのはデフォ



361 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 22:40:51.37 ID:h9Uf3G+h.net]
>>359
順番に依存しないように関数にすればいいだけ

362 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 22:41:12.85 ID:07eSaah4.net]
>>356
概ね同意だが、元がスパゲティーコードなのだとすると、
構造体の入れ子が意味的に正しい区切りかは解析してみないとワカランし、
構造体の入れ子の中にも、読まれるメンバと書かれるメンバが入り混じったフラットな部分(もっと分割できる)があるかもしれない

363 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 23:22:56.45 ID:42pHJdZC.net]
スパゲッティソースとかジジイかよ
パスタソースと言え

364 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 23:30:00.97 ID:HfEapSwJ.net]
パスタじゃ短いかもしれないだろ

365 名前:デフォルトの名無しさん mailto:sage [2015/12/22(火) 23:48:17.43 ID:kMUIR4Di.net]
うっかり感心するとこだったじゃないか

366 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 01:00:56.72 ID:BzOxQ5F4.net]
C++ユーザなんて基本「こまけえこたぁいいんだよ(AA略」マインドな人ばっかだと思ったけど
一部はきちがい原理主義者とかいるけど

367 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 01:16:36.17 ID:xKy7nhKt.net]
  /)
 // /)
`///  __
|イ二つ/⌒⌒\
| 二⊃ (●) (●) \
/  ノ/⌒(_人_)⌒  \
\_/|  |┬|   |
 / \  `ー′  /

368 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 01:18:38.36 ID:RaRt0JiM.net]
かなり昔Cを少しやってたんだけど、
C++ってネット検索だけじゃ覚えるのに効率悪い?
なんか思ったよりCと違うと言うか、他人の書いた記述が読めない。

あとCって記号とか少なくて、なんでも
aaa bbb ccc;
みたいな書きかたで来るから、aaaがなんなのかcccがなんなのかさっぱり分からないこと多い。

369 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 01:53:40.65 ID:at23GWqE.net]
ネットで十分だよ
一気に覚えようとしないで分からないと感じるとこから徐々にやっていけば良い

370 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 02:02:55.30 ID:RaRt0JiM.net]
そっかありがとう



371 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 08:31:01.78 ID:+NQ/xqJl.net]
>>366
けっこう半々な印象。

372 名前:デフォルトの名無しさん [2015/12/23(水) 09:51:28.52 ID:yPOVGEOY.net]
>>368
参考書買ったほうがいいよ

373 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 10:34:07.94 ID:1VnhNGH+.net]
>aaaがなんなのかcccがなんなのかさっぱり分からない
その辺は名前付け慣習とIDEで何とかするしかない

正直そのレベルでネットでつまみ食いとか話にならない
20年前に C++"マスター" しててもその後の追加機能ついてけないのに

374 名前:デフォルトの名無しさん [2015/12/23(水) 10:42:12.30 ID:3hZVGXtK.net]
>>1
RPGツクール2000 , RPGツクールMV https://tkool.jp/mv/ ( JavaScript 採用 )

WOLF RPGエディター www.silversecond.com/WolfRPGEditor/

デュエル・マスターズ Android版 ,i-OS版、公式 dm.takaratomy.co.jp/extra/dmapp/entrygate_ds/
デュエル・マスターズ対戦CGI ex
https://web.archive.org/web/20150809154946/www53.atwiki.jp/dmsuishinparty/pages/314.html

デュエル・マスターズ(デュエマ)DM ONLINE 1.8a  /  VanGuard ONLINE 1.5a
https://web.archive.org/web/20150809160254/uhyohyohyo.sak ura.ne.jp/hsp.html

ヴァンガード専用ネット対戦ツール【 VanGuard Online 】
https://web.archive.org/web/20150809155032/kiimaa.jugem.jp/?eid=61

「カードファイト!!ヴァンガード」のネット対戦ができる公式オンラインゲーム「Cardfight!! Online」 2015年冬スタート
https://web.archive.org/web/20150809153724/supersolenoid.blog63.fc2.com/blog-entry-6886.html

遊戯王 Automatic Dueling System
https://web.archive.org/web/20150809164855/www3.atwiki.jp/ads-wiki/pages/20.html

遊戯王 デュエル・オンライン
https://web.archive.org/web/20150809171527/www31.atwiki.jp/vipdo/pages/15.html
https://web.archive.org/web/20140628005202/do.yugioh-portal.net/

ウィクロス( WIXOSS ) WEBXOSS webxoss.com/about_en.html webxoss.com/DeckEditor/

BG(ボードゲーム)Engine https://web.archive.org/web/20151209080842/https://bgengine.net/
https://web.archive.org/web/20151209172205/14owl.hateblo.jp/entry/2015/12/09/011234

アプレンティス  マジック:ザ・ギャザリング(MtG)オンライン化 homepage1.nifty.com/Q_Q/ap.html
https://web.archive.org/web/20151202202725/homepage1.nifty.com/Q_Q/ap.html

375 名前:デフォルトの名無しさん [2015/12/23(水) 10:43:02.66 ID:3hZVGXtK.net]
【 オンラインTCGエディター 】   >>1,>>374

デュエル・マスターズ的な非電源TCGの 《 オンライン化ツクール系ソフト 》 制作の企画。

例えば、ガチンコ・ジャッジを直ぐにでも導入できる機能を持っておりながら、
当面それを扱わず単純化させておいて、事後的に導入拡張する際に当該システムを
ブロック構造の組み合わせで後付け挿入できるように予めシステム化してあるソフト(エディター)。
既存の非電源TCGを劣らずに再現できるならば大概のニーズに応えられる筈。
デュエマ、ヴァンガ、ウィクロス、ポケカ、デジモン、ゼクス、モンコレ、旧ガンダム・ウォー、ライブオン、ディメンション・ゼロ、シャーマン・キング、カードヒーローなど
のシステムを完全再現できるように設計するけど、他に此のTCGの此のシステムは再現希望とか有ったら書け。
マジック:ザ・ギャザリングの全システムを完全に再現するのは無理だから、此れだけは必用だ!って部分のみリクエストしろ。
個vs個、多数乱戦、チームvsチーム、個vsチームを実現し、P2P通信対戦プラグイン有り。

設計思想は 《 RPGツクール 》 が良いかな?  他に、優れたエディター有ったら挙げてみろ。

個人や企業などのベンダーが提示する開発費(見積もり)で折り合えば、発注する。

エディター群から基本コンセプトを絞り込む(もちろんオリジナルで優れた新ネタが有れば導入する)。

遊戯王OCGに関しては、タッグフォース、ADS、デュエルオンラインを発注先ベンダーに研究させる。
バトスピ、ヴァンガ、デュエマなど発売済みゲームソフトが存在してるTCGはベンダーに研究させる。

各社TCGを再現するテストプレイ ⇒ 更に改良や修正 + コード記述の仕様書(設計書)を作成。

機能制限した下位版を制作しても原則として発売せず + 上位版デュエリ−グ用でサーバー稼動。

下位版を仮に発売した場合の改造および商用利用には、別途で当社との契約が必要。

さ〜て、インド人ベンダーと日本人の翻訳担当PGを見つけよっと!ww
wc2014.2ch.net/test/read.cgi/entrance2/1450555747/-20

376 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 11:03:57.67 ID:sJwRv/VQ.net]
>>14
本当にcostの領域書き換えようとしたら、OS に依っては、例外で落ちる。
マイコンだったら、ROM 領域に割り当たったりするから、こっちもトラップ起きるか、正常動作しない。

377 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 11:12:39.69 ID:McSS3rOm.net]
そんなラッキーな状況を
さも悪いことの例として書かれても

378 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 12:10:12.62 ID:hTjb3j4U.net]
今定数書くならどれ?
#define
enum
const static
constexpr

379 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 12:13:08.41 ID:r+tlUph/.net]
場合に依るかと
列挙される定数ならenum class、実行時定数ならconst、コンパイル時定数ならconstexprかな。
#defineは定数というかマクロに使う感じ

380 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 12:13:59.15 ID:JwJRlMaE.net]
>>378
ではまず貴様の「定数」とやらの定義を聞こうか



381 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 12:16:35.52 ID:F7FK9/Ld.net]
>>378
constexpr か scoped enum
ただし constexpr はリテラルでしか宣言できないので、非リテラル型なら const
スコープを翻訳単位に制限するときは static const T ... でなく無名名前空間を使って
namespace { const(expr) T ... }
とする って感じ

382 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 12:38:03.02 ID:BrzFNCu8.net]
#defineはありえない
enumみたいな数値に意味が無い定数は結局のところストラテジやステートに置き換えられるからあまり使わない
物理定数みたいな数値自体に意味のある不変の定数はconstかconstexpr
実行時の環境に依存する定数は保守性優先でメソッドでの問い合わせを使う

383 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 12:58:37.25 ID:k0+pKQyY.net]
なるほど。非常に小さい実数をグローバル定数として定義したくて
const auto EPS = std::numeric_limits<double>::epsilon();
としてましたが、これで良かったんすね?
便乗質問ですいません

384 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 13:16:53.46 ID:r+tlUph/.net]
その値はコンパイル時定数だから
constexpr auto EPS = ...
でも通るはずだよ

385 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 13:59:05.72 ID:k0+pKQyY.net]
>>384
そうでした。ありがとうございます

ところで std::numeric_limits<double>::epsilon() が返す 2e-16 って値はどのように決まるんでしょうか?
std::numeric_limits<double>::min() の 2e-308 に比べるとかなり大きいですが

386 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 14:46:16.76 ID:r+tlUph/.net]
>>385
そもそもその値の定義は「1に足したら1以外の値になる、絶対値が最小の正の値」だから。
つまり
union di {
double d;
uint64_t i;
};
di one, one_plus_epsilon;
one.i = 0x3ff0000000000000;
one_plus_epsilon.i = 0x3ff0000000000001;
double eps = one_plus_epsilon.d - one.d;

でも同じ値が計算できる。
double型とint64_t型のエンディアンにも依るけどね。

387 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 15:02:04.89 ID:ykJGFkPv.net]
IEEE 754形式倍が弄ばれている…!

IEEE 754形式は仮数部52 bit + 仮想的な最上位 1 bit(常に1)の計53 bitの精度があるから、
log_2(53) = 15.9故に>>386のような結果になるのだと思われ

388 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 15:04:05.35 ID:F7FK9/Ld.net]
>>385
「計算機イプシロン」でググったらいいことがある予感
というか、数値計算をする上でその程度の理解だとちょっと厳しいのでは
非正規化数とかの用語は大丈夫?

389 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 15:06:32.33 ID:ykJGFkPv.net]
スマン正しくはこうか;
 1 + log_2(52) = 1 + 15.7 = 16.7

つか浮動小数点数の話題は浮動小数点数スレでおk

390 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 15:11:28.29 ID:k0HavgjY.net]
>>378
新機能の enum struct 一択だろう



391 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 15:12:33.40 ID:ykJGFkPv.net]
非正規化数というのはIEEE 754の通常の指数表示規則に従わせると指数部がアンダーフローしてしまうから
通常の指数表示規則に従わせずに使うやつ
近接した2数の差で生じるが、2^(-970)より大きい数同士の差では(近接していても)生じない

392 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 15:14:26.88 ID:r+tlUph/.net]
弄んだ奴は誰だ!
私です(AA略

>>385
何か大きな計算をしてて、引き算をした結果0に近いって意味でのεとは意味が違うので注意ね。
そういう意味で使いたいなら
bool simeq(double x, double y) {
return abs(x - y) / (abs(x) + abs(y)) < 0.01;
}
的な関数を作るべき。

393 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 15:55:04.23 ID:F7FK9/Ld.net]
const 宣言による挙動で白熱したり (>>14-)、浮動小数に関する質問で
あっという間にレスがついたりで、>>366 はちょっとどうかなと思う
言語仕様はもちろんだけど、環境べったりの細かいとこまで触りたいから C/C++ を使うんじゃないかなあ

394 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 16:18:34.94 ID:8eCiuqc6.net]
>>392
abs(x-y) <= numelic_limits<double>::epsilon * abs(x)
じゃないとだめじゃね

395 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 16:26:31.55 ID:k0+pKQyY.net]
愚か者ですいません、計算機イプシロンも非正規化数も知りませんでした。
前者はざっくり言えば double a,b の一致を調べる際に
abs((a-b)/a)<EPS などとするときの EPS ということですね。
実は今までは何となく不安だったので
const auto EPS = 1e3 * std::numeric_limits<double>::epsilon();
としてました。恥ずかしい、、、

後者は驚きでした。これによりDBL_MINよりもゼロに近い数を表現できるんですね。
(有効数字が下がり計算も遅くなる弊害はありますが)

皆様ありがとうございました。勉強になりました

396 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 16:34:01.06 ID:F7FK9/Ld.net]
>>395
>> 1e3 * ...
用途によるけど、別にそれでも問題ない
>>392 が言ってるように、数学的に小さい数を表す(そういう含意がある)ϵ とは意味合いが違うから
むしろ「どんな計算でも計算機イプシロンの精度は保証されてるんだ!」みたいな理解は危ない
あくまで「計算機上で」1.0 < 1.0 + ϵ が保証されてる数に過ぎないから(移項したり辺々に何か足したりしちゃだめだよ!)

397 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 17:53:06.86 ID:ykJGFkPv.net]
今思いついたがIEEE 754前提なんなら
bool simeq(double x, double y) {
 union di {
  double d;
  uint64_t i;
 };
 if (x < y) std::swap(x, y);
 di.d = x;
 di.t &= 0x3ff0000000000000ULL;
 di.t |= 0x1ULL;
 double diff = x - y;
 return diff <= std::abs(di.d);
}
にすれば最高の精度が出る…!
希ガス…!!

398 名前:デフォルトの名無しさん mailto:sage [2015/12/23(水) 20:18:26.85 ID:F7FK9/Ld.net]
精度を気にするならそもそも組み込み型の double を使うべきじゃないのでは (gmp とか)
近似的に 0 かどうかを判定するなら >>395 が言うように
適当な定数を使って比較した方が速いし分かりやすいと思う

399 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 01:49:23.55 ID:Md3mVxx6.net]
やべぇ、ベクトルの一致判定でこんなことしてたけど、これって危なかったのか・・・
if( norm(A-B)/mag(A) < EPS ) //AとBはarray、magはarrayの大きさ(ユークリッドノルム)を返す

magの中で誤差がたまるような演算してたらEPSを超えることも当然有り得るわけで
想定する誤差を考慮してEPSを決めておけって話か
まぁ計算機イプシロンの10倍くらいとっとけば大抵の場合は困らないかな

400 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 11:37:59.71 ID:lQuTvdvQ.net]
どうでもいい話ですが参照記号&をつける位置ってどうしてます?

@int& n = ... 基本これ
Aint &n = ... nのアドレス参照に見えて嫌い
Bint & n = ... 間延びして見える。でも型が長いときはたまに使う



401 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 11:38:41.46 ID:acHF714F.net]
>>400
決めてない

402 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 12:33:32.07 ID:OOhg2rop.net]
学生のころの話だが、C言語で変数宣言を一括でする際、
カンマ区切りで羅列することが多かった

その際、1のように int* とすると、以降すべてがポインタ扱いになるから、
ポインタとして宣言したい変数にのみ*付けてた

int* p, i, j;  //すべてポインタ型
int *p, i, j;  //pだけポインタ型

今じゃ羅列はしてないが、これが元で基本は2を常用しているな

403 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 12:38:33.72 ID:TPzlNnvJ.net]
いや、そのi,jポインタにならなくね?

404 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 12:42:50.03 ID:Pi/jPgdh.net]
> その際、1のように int* とすると、以降すべてがポインタ扱いになるから、
ってのが間違いDANE
C# ならあってるけど

405 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 12:49:27.62 ID:OOhg2rop.net]
あれ、ホントだ、手元のgccだとpだけだ

学生当時はVisualC++6.0だったけど、そのせいか、はたまた記憶違い…?

406 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 12:57:09.69 ID:acHF714F.net]
int*をtypedefしてたんじゃない?

407 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 15:44:23.40 ID:Q3X3HcTd.net]
>>400
3は演算子と被って検索の邪魔になりそう、とかつい思っちゃう
でもたぶん検索することはない

408 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 18:14:23.55 ID:oleU/CSH.net]
>>402
ならないから見た目と実態を合わせるために変数側につけるって話じゃないの?

409 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 18:27:55.53 ID:hibvS7Ml.net]
「&n」はdeclaratorだから&とnがくっつくのは自然。
むしろdeclaratorの一部とspecifierをくっつけるという発想がおかしい。

410 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 18:44:45.28 ID:OOhg2rop.net]
>>408
いや、当時は

1: 「intポインタ型」の p と i と j を宣言
2: 「int型」の ポインタp と i と j を宣言

と自己解釈してて、納得してたんだよ
その上で、1だと意図せずポインタ型になるので、
変数名に明示的にポインタを書くくせを付けてたって話

自分の誤った理解が、今回解けて良かったとはいえ、
VisualC++6.0で確認してみたいが手元にないのが口惜しい



411 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 19:04:25.20 ID:GsssoKmX.net]
VC6だって同じだよ

412 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 20:36:26.99 ID:DECH3WsR.net]
俺もそう思う
そんな変な独自仕様は無かったと

413 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 21:32:48.46 ID:Feh/kJXC.net]
有名な話だと思ってた
注意しなきゃいけないことのひとつとして

414 名前:デフォルトの名無しさん mailto:sage [2015/12/24(木) 22:32:13.69 ID:oleU/CSH.net]
*を型側につけるのが、cとは逆のc++の流儀じゃなかたっけ
その代わり1行1変数にすべしと

415 名前:デフォルトの名無しさん [2015/12/24(木) 22:32:55.13 ID:GU6AGSz2.net]
int* a, * b, * c;


416 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 07:38:33.62 ID:AQI4RQgq.net]
int (*p1)(), (*p2)();
はどうすんだよ

417 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 17:47:35.36 ID:Qe6dmkgC.net]
>>413
「間違わないよう注意しよう」の、注意する部分が強すぎて
間違ったほうで覚えちゃう……ってのは、
プログラミングに限らず世の中けっこうある気がする

418 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 19:26:27.60 ID:rMHOLY0+.net]
いくら記号に余裕がなかったとは言え
アドレスの&を参照の宣言に使ったハゲは死んだ方がいい
ハゲもそろそろ寿命だろ

419 名前:デフォルトの名無しさん [2015/12/25(金) 19:32:12.73 ID:wx0vRYD+.net]
>>418
代案も出さずに文句言ってんじゃねーよゴミ
嫌なら使うなクズ

420 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 19:59:16.21 ID:k5SbnQhg.net]
^よりマシ



421 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 20:10:48.89 ID:Dw2KFXJp.net]
初期の Rust だと ~ ってのがあったな

422 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 20:18:23.43 ID:CaNvFOIE.net]
記号なんてカッコだけで十分なんだよ
目が悪いプログラマをいたわれよ

423 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 20:22:59.50 ID:VYJL9Hps.net]
最も使用頻度の少ない記号ってなんだろ?

424 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 21:09:20.32 ID:sQSCITve.net]
三項演算子の?じゃね?
情報源にも依るだろうけど。

425 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 21:15:38.50 ID:DwoG3pnf.net]
@$#を解放すればいいのに

426 名前:デフォルトの名無しさん [2015/12/25(金) 21:16:58.49 ID:PnL2MC9b.net]
@の胡散臭さは異常

427 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 21:17:30.64 ID:h8PddtoJ.net]
オブジェクトCとか見てるだけで吐き気がするよな

428 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 21:23:47.95 ID:VYJL9Hps.net]
>>424
? は結構使うな。
単体の | じゃないかな

429 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 21:25:52.74 ID:XvkCqMEu.net]
C++的にはやっぱ@と$じゃね?

430 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 21:26:15.36 ID:5nmp/yEA.net]
@演算子があればコードに連絡先をしこめるね
x = foo.bar@example.com;



431 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 21:29:07.75 ID:0xMqAn7x.net]
使わない記号ということであればあとは`か

432 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 21:30:04.57 ID:eCSmWQzW.net]
:: みたいに2文字使えば他とかぶらなかった
int %% ri = v;
みたいな

433 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 21:32:41.95 ID:0xMqAn7x.net]
トライグラフのことも思い出してあげてください

434 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 21:50:38.71 ID:sQSCITve.net]
>>428
単体の|も使うぞ。

内部表現ucs4でターミナルがutf8だと出力するのにシフトと&と|のごった煮が必要になるからな。

435 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 23:43:29.98 ID:kan7orvo.net]
64ビットで表現できる素数が全て欲しいのですが、
Cで適当に書いて見たところ30分経過しても処理が終わる雰囲気ありません。(1から順番に割り切れるのかどうかを全部チェックした)。

まともな時間内で終わらせる書きかたがあるなら、その記述がほしいです。
ないなら、素数の一覧表のURLか何かが欲しいです。
ちなみにその出力が全部でどのくらいのバイト数になるのか分かってません。

436 名前:デフォルトの名無しさん mailto:sage [2015/12/25(金) 23:52:36.72 ID:0xMqAn7x.net]
ググっただけだが、参考になるんじゃね
opp-track.cocolog-nifty.com/blog/2013/02/post-6a30.html

437 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 00:13:46.87 ID:HLaSlD1p.net]
素数は金出して買うもの
タダで欲しがっちゃダメだよ

438 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 01:06:44.98 ID:PQT39fnH.net]
64ビットの素数は1844京6744兆0737億0955万1615個だそうで
やっぱいらないですってことになりました。
ありがとうございました。

439 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 01:08:29.52 ID:APwgJKcv.net]
>>438
いいってことよ、
また悩みがあったら遠慮なく相談しな(´・ω・`)b

440 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 01:08:34.95 ID:PQT39fnH.net]
あれ、書いた直後に気づいたけどこれは64ビットの最大値だった件



441 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 01:24:13.34 ID:sCwZalzQ.net]
しばらくfloodgateに行かない間に
Max_Moves:256
を提示するようになってた;
この情報って何かに活かせるのけ?

442 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 04:38:43.16 ID:ruJtu//g.net]
さすがに 64 bit の素数はディスクに収まらない
32 bit の素数だけなら 300 MiB 以下で収まるから、そこから
篩にかけて列挙してく方がいいね

443 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 04:41:01.32 ID:S13iTXsn.net]
vector<shared_ptr<T>> list; があるとして、これの要素のconst参照を
const shared_ptr<T>& ref = list[0]; のように取ると、listに要素を追加した際に
参照先がおかしくなるのですが、何故こうなるんでしょうか?

https://ideone.com/3YLbwe

444 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 04:57:01.28 ID:bmbNcMd5.net]
>>443
vectorの仕様としか言いようがない
追加→メモリ拡張→必要に応じて全部の要素を移動

445 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 05:51:14.92 ID:S13iTXsn.net]
>>444
それは知ってましたが、移動に応じて参照先も追従してくれるのかと思ってました
・・・よく考えたらするわけないですよね
なんかこういう勘違いをしてる時点でC++をよく分かってないのが明らかですねorz

あと、shared_ptr自体は本問題には全く関係ない話ですね
スレ汚し失礼しました

446 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 11:19:22.26 ID:Bg7Bp4xb.net]
>>445
shared_ptrをつかってるのだから
参照ではなくweak_ptrで実体もらえばいいのに。

447 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 11:26:30.63 ID:CIWNoXeM.net]
ばかはひっこんでなさい

448 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 11:26:51.79 ID:HLaSlD1p.net]
そうだそうだ引っ込んでろ

449 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 11:44:37.92 ID:bmbNcMd5.net]
const shared_ptr<T> &はアホが使うものだとメイヤー先生も言っている
ここは
 × const shared_ptr<T> &
 × weak_ptr<T> &
 ○ const T &
が正解

450 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 12:38:20.64 ID:d8jGfVRJ.net]
普通にshared_ptr<T>でいいんじゃないか



451 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 12:40:06.70 ID:E3MIEZFa.net]
const shared_ptr<T>& ref っていう参照じゃなくて、shared_ptr<T> ptr っていう実態で
受ければ良いだけなんじゃないの?
これなら追尾してくれるよね

第一、const shared_ptr<T>& ref って何でconst付けているか意味不明なんだが
これって、Tの実態を書き換えないって意味じゃなくて
Tは書き換えられるけどshared_ptr自体は書き換えないって意味だよね
ポインタで言ったら int * const p と同じ意味だよね
そんなことする意味有るの?

452 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 12:43:48.18 ID:LYATmO+u.net]
全部間違ってる
追尾するわけないだろ

453 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 12:55:38.05 ID:pVKld/fI.net]
vectorが再配置されてもTの実体は動かないから>>449が正解だろ

454 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 12:57:59.25 ID:E3MIEZFa.net]
追尾っつーかさ、shared_ptr<T> ptr = list[0]って書き方にすると
vectorに入っているスマポへの参照としては追尾しないけど
Tの実際の方へのリンクは貼られたままになるでしょ
それで十分なんじゃないの?

list[0]そのものへの参照が欲しいってことなのかもしれんが
そんな機会はあまりないし、そもそも元のコードは
const shared_ptr<T>& refってconst付きで受け取っているから
参照を通してスマポの値を書き換えることは出来ないし、目的がよく分からんよね

それにlist[0]への参照がほしいならインデックスを取得しておけば済むよね

455 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 13:00:32.11 ID:PFSeoZHa.net]
>>449
メイヤーこんな記事もあるぞどっちやねん

cx5software.sakura .ne.jp/blog/2012/01/16/how_pass_shared_ptr_to_func/

456 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 13:03:51.19 ID:E3MIEZFa.net]
>>453
それだと生参照になるだろ
shared_ptr<T> ptrで受けるのが安全かと

しかし元のコードは const shared_ptr<T>& ref = list[0]; なので、
彼のしたいことは、list[0]のスマポの値が書き換わったら
それがrefにも反映されてほしい、ってことなのかもしれない
list[0]その物への参照がほしいということなのかもしれない
const T & や shared_ptr<T> で受けると実態にリンクされるから
list[0] が書き換わってもそれは反映されない

元のコードとコンパチにしつつバグを取るには
インデックスを使ってアクセスするのが一番手軽だろう

457 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 13:19:03.99 ID:E3MIEZFa.net]
もしくはvectorは並べ替えされることも有って
そのたびにインデックスを更新するのが面倒くさいなら
std::vector< std::shared_ptr<T> * > list;とでもしておいて
auto ptr = list[0];
とでもするかだな
それが
std::vector< std::shared_ptr< std::shared_ptr<T> > > list
とかね
インデックスのほうが楽だと思うけどな

どちらにせよ、彼が const shared_ptr<T>& ref に何を求めているのか謎だから
これ以上は無意味だね
単にshared_ptr<T>で受けるだけで十分な案件かもしれないしな

458 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 13:23:31.82 ID:HLaSlD1p.net]
vector<T> vをSP<vector<T>> pVecに変更してpVecとindex 0をバインドするオブジェクトを作るだけだろ
参照なんて危なっかしいものを素人に触らせるな

459 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 13:26:44.79 ID:HLaSlD1p.net]
c++erはくだらないテクニックより先にオブジェクト指向を勉強しろ
オブジェクト指向をしらないからconst & SP<T>だのvector<SP<SP<T>>>だの正気を疑うようなコード平気で書くようになる

460 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 13:36:19.04 ID:c6cv0Mwc.net]
的はずれな指摘だと思いまーす



461 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 14:01:01.05 ID:g622w7nt.net]
const付きで参照を渡せるc++を使っていると、それが出来ないjavaが怖くて堪らない。

プロジェクトにまぎれこんだ素人が事故でオブジェクトを破壊しかねない。

その割りにconst shared_ptrみたいな重要度の低いfinalの効果はあるんだよね。

462 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 14:10:39.49 ID:HLaSlD1p.net]
>>461
素人だな
java使いはエンティティと値オブジェクトを使いわける事を知っている
c++erはエンティティと値オブジェクトに分離すべきところを横着して中途半端にconstメソッドを使いクライアントコード側でconstを書き忘れるといったミスを平気でする

463 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 14:14:39.93 ID:g622w7nt.net]
値オブジェクトでも何も考えず書き換えられちゃいますってのがjavaの糞な所なんじゃ。

464 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 14:23:40.30 ID:HLaSlD1p.net]
>>463
それは値オブジェクトじゃないだろ
なんか勘違いしてないか

465 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 14:33:21.07 ID:Xbomr4ek.net]
何話してるのか分かってないジャバカ野郎はすっこんでろ

466 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 14:37:28.95 ID:HLaSlD1p.net]
c++erはマトモなコード書けないバカって話題だろ?ちゃんとわかってるよ

467 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 14:51:06.89 ID:Sgv0r5+y.net]
>>418
どっちも同じようなもんだから
&でいいだろ。
分かりやすいし

468 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 15:02:49.96 ID:pVKld/fI.net]
右辺値参照を導入しようとしたときに&&演算子もあったってのができすぎてる

469 名前:443 mailto:sage [2015/12/26(土) 17:48:27.63 ID:S13iTXsn.net]
>>457
const shared_ptr<T>& ref と参照にした理由は、shared_ptr自体のコピーコストを嫌ったためです
(その意味では仰るとおりconst付けるのは無意味でした)

同じ考えで、範囲for文では for (auto& ref : list) と参照で受けるのが半ば習慣になってました
これってforの中でlistの再配置が起こるような処理をしてたら大変なことになってたってことですよね
やばすぎる・・・orz
自分のようなアホは安全のためにも、shared_ptrを受けるときは問答無用でコピーにしたほうがいい気が

470 名前:デフォルトの名無しさん [2015/12/26(土) 21:47:14.83 ID:WauQYE2g.net]
アホだから問答無用にするんじゃなく、
問答無用とかやってるからアホなんだが?

因果関係が逆だよ



471 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 21:50:07.71 ID:HLaSlD1p.net]
アホは永遠にアホのままって事

472 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 22:33:50.15 ID:Xbomr4ek.net]
いいからジャヴァカは黙ってろって
お前が得意気にあさってな知識を披露してる値オブジェクト云々の話じゃないから

473 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 22:38:11.83 ID:HLaSlD1p.net]
>>472
分かってないのはお前の方じゃねえかw

474 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 22:49:47.83 ID:Xbomr4ek.net]
ジャヴォケは死ぬまでおのれのヴォケさにすら気づかない

475 名前:デフォルトの名無しさん mailto:sage [2015/12/26(土) 22:50:38.59 ID:bmbNcMd5.net]
>>470
論理的思考のできない馬鹿はすっこんでろ。
「アホだから問答無用にする」で正しい。
「問答無用でコピー」はアホであることを確認できる行動ないしはそれ故に馬鹿にされる理由に過ぎない

476 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 00:01:46.37 ID:A2Nkiipw.net]
>>469
ちょっとまてよ。
shared_ptrだから実体を受けるという話になっているが、
他の型ならやはり参照で受けたいという意識なわけだな。

問題の本質は、要素の追加、削除をする可能性のあるスコープ中でイテレータや参照を覚えてるってこった。
位置がずれるだけでなく、reallocして一族郎党お引越しもありうるんだし。

477 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 00:52:18.75 ID:tFEpU9wF.net]
>>469
auto&かautoか以前にイテレータが無効になって繰り返し自体が保証がなくなる場合があるからな
forの中で要素の追加削除をするときは注意しないとダメだよ

478 名前:469 mailto:sage [2015/12/27(日) 01:23:29.60 ID:eoyCmYYX.net]
>>476,477
ありがとうございます
肝に命じておきます
深刻なバグを産み出す前に気づけたのは不幸中の幸いかな・・・

479 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 07:43:39.99 ID:Q7k4qUAc.net]
>>476>>469>>477を100回読み直した方がいい

480 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 08:34:04.93 ID:mCeb/k6u.net]
>>462
ごっちゃにしてconstって発想はまさにJavaでゴスリンが
Stringを参照型にしてしまったことだな。
ヘジ「ちょっとジャバの真似したけどC#のstringは間違いだったわスマンww」



481 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 13:58:10.03 ID:UbTOh1DF.net]
>>469
コストを気にするのはいいことだけど、shared_ptrの小さなコストを気にするよりも
vectorの大きなコストを気にした方がいいよ。予測が立てられればreserveで予め確保しておけばいいんだし

482 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 17:45:45.90 ID:LZ1P+G9z.net]
質問ッス!
Futility purningのマージンは、
手番側が静止探索中に回復可能な評価値の上げ幅の上限ということで、
チェスだと3 CPぐらいにすれば良いと聞いたのですが、これってpromoteする場合をどう考えてるの?
将棋の場合ですが、成りが絡むと駒得の上げ幅が10 CPを超えることがあります。
(例: FUの価値=1 CP、TOの価値=12 CPでFUを捕獲した場合、上げ幅は-1 + 12 + (-CP + 1.1 CP) = 11.1 CP)

実験する限り上げ幅5 CP超えは1局あたり3回ぐらいしか現れないのでできれば5 CPぐらいのマージンで済ませたいんですが
割合的にはレアケースとはいえほぼ確実に発生する10 CP超えのケースにどう手を打つべき?

483 名前:482 mailto:sage [2015/12/27(日) 17:47:11.74 ID:LZ1P+G9z.net]
誤爆すたorz、

484 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 18:53:37.77 ID:qJI8FLco.net]
>>481
それよりもっと上の設計段階を見直すべき
c++技術者は細いところばかり気にして設計がお粗末すぎる
これで実行効率が如何の斯うのと言うのだから呆れるよ

485 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 22:06:17.84 ID:V9zzXkir.net]
とある偉い方がtwitterに貼り付けていたコードなのだけど、どういうバグかわかる方います?

auto x = 0
for(auto x = 0; x < 8; x++)
{
// do something
}

x二重定義とかセミコロン抜けとかそういう単純な話なのかしら

486 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 22:11:30.39 ID:VUJqwlMv.net]
forのスコープって、昔はちょっと面倒なことになってなかったっけ

487 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 22:12:00.04 ID:R1VFQ9YE.net]
スコープによるネスト変数も知らんのかこのバカ

488 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 22:14:07.89 ID:R1VFQ9YE.net]
xと::xで交互に参照できるだろバカ

489 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 22:16:20.42 ID:PcNcsJH/.net]
変数名変えれば終わり
c++erってくだらないことばっかり気にしてホント馬鹿

490 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 22:25:50.30 ID:wEcqjPTL.net]
c++er?



491 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 22:38:40.47 ID:tFEpU9wF.net]
しっ! 見ちゃいけません!

492 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 22:39:18.67 ID:ZMHZ9AEQ.net]
>>488
どうしてそう息を吸って吐くように嘘をつくのか

493 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 22:43:22.82 ID:R1VFQ9YE.net]
おれが書いたことが嘘になる環境が糞

494 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 22:54:11.10 ID:ZMHZ9AEQ.net]
>>493
そうかそうか
でもここはC++スレだ
関係無い言語の話題はスレ違いなので去れ

495 名前:デフォルトの名無しさん mailto:sage [2015/12/27(日) 23:19:43.32 ID:UbTOh1DF.net]
>>484
見直すべきかどうかはその設計を見てみないとなんとも言えないな…

496 名前:デフォルトの名無しさん [2015/12/27(日) 23:53:02.38 ID:CfNITRcz.net]
>>475
ブーメランというより定常波か
ずーっとやっとれ

497 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 00:13:01.29 ID:SsjmFHW7.net]
>>489
コンパイルエラーにならないからうっかりミスしてしまうと言う問題の紹介だろうに
「変数名変えれば終わり」だなんて
どれだけお前は頭が悪いんだ

498 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 00:26:31.38 ID:a1uFS38y.net]
>>497
馬鹿なC++erはついうっかりやっちゃうんだなあ
javaエンジニアはまずこんなくだらないループは書かないから安心だ

499 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 00:32:56.39 ID:V87dzSuE.net]
>>485
一体どいつがこんな糞コード書くんだよ?
サンプルにしても質が悪すぎるだろ

500 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 00:39:28.50 ID:j++bijmE.net]
じゃあもっといいサンプル書いてみてよ



501 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 00:50:57.95 ID:Fltzxham.net]
if (distance < 1.0 || 100.0 < distance)
 throw エラー;
// OKだぜ

502 名前:デフォルトの名無しさん [2015/12/28(月) 00:55:21.58 ID:ESQO+1YW.net]
なんでC++相談室でC++叩きしてんだ

503 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 01:03:24.73 ID:o6lgZwvb.net]
>>484
関数を呼び出すと、呼び出しのコストが掛かるから、出来るだけ関数マクロ化したったぜ!
って、ドヤ顔で先輩に言われた時には殴り飛ばす一歩手前まで行ったわ
速くなるかもしれんがメンテしにくいし
頭きたから怒り気味に上から目線で実測させたら遅くなっててワロタ
どうもキャッシュに乗りにくくなってしまった模様

504 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 01:06:12.96 ID:O+Lw46iu.net]
>>499
気分を害してしまい申し訳ありません。
よかったら飲んで下さい。

つ牛乳

505 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 07:07:48.57 ID:rt8g75CW.net]
>>503
インラインにするだけで充分だよな。
でかい関数は、そもそも意味がないし。

506 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 10:51:22.76 ID:v1wGH8h7.net]
>>495
キャッシュマシンしかないご時世に、細切れのオブジェクトをバラバラのタイミングで作って捨てて、
仮想関数で間接参照の嵐をふかせまくってたら遅くなってしかたないわな。

507 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 14:18:58.41 ID:UMA2BrCL.net]
以下のような形で比較評価を複数まとめて書く方法ってありますか?
int a = 2;
if( 1 < a < 3 )
普通に考えたら無理ぽいですけど

508 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 14:34:46.39 ID:i05gjBFH.net]
#define BETWEEN(a,b,c) ((a) < (b)) && ((b) < (c)))

509 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 14:42:43.52 ID:A05iBa2U.net]
if ((1<a)&&(a<3))

510 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 14:57:12.64 ID:i05gjBFH.net]
class Int {
int value;
public:
Int(x) : value(x) {return;}
int get() {return value;}
};

class Bool {
bool premise;
int rhs;
public:
Bool(bool b) : premise(b) {return;}
Bool(int l, int r) : premise(l<r), rhs(r) {return;}
operator bool() const {return premise;}
Bool operator<(int factor) const {return premise? Bool(rhs, factor): Bool(false);}
};

Bool operator<(int lhs, Int rhs) {
return Bool(lhs, rhs.get());
}

Int a = 2;
if (1 < a < 3) { ... }



511 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 14:58:53.94 ID:UMA2BrCL.net]
どうもです
やっぱそんな形しかないですよねぇ

512 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 15:01:50.76 ID:UMA2BrCL.net]
>>510
おぉ、こんなやり方もあるんですね
勉強なります

513 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 15:05:08.13 ID:i05gjBFH.net]
>>512
一旦何かのクラスのインスタンスを作って演算子のオーバーロードでゴリッと解決する方法は
そこまで可読性上がらない割に難解で拡張性に乏しいのがちょっと難点だけどね。

514 名前:デフォルトの名無しさん mailto:sage [2015/12/28(月) 23:53:23.55 ID:JA4sOSJI.net]
式テンプレートかな、そんな使い方があったとは・・・・自分も拝借しようw

515 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 00:16:02.70 ID:MnDqjltQ.net]
別にテンプレートじゃないし型の変遷もないし、式テンプレートのイメージとは違う。

516 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 00:19:40.24 ID:Rykim96A.net]
こういう記述できる言語ってあるんかな
数学とかで需要ありそう・・・
もしかしてMatlab様がもうやってるとか?

517 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 01:53:47.27 ID:RQT/AIDK.net]
Matlabにだってないから。だから無い物ねだりはするだけ無駄。素直に&&でやるべし。

518 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 02:14:10.60 ID:xHO6+WFY.net]
c++エンジニアって馬鹿だなあ
苦労してコスト上げて可読性悪くするんだもんな

519 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 02:26:12.79 ID:VrB6xw8N.net]
Pythonならできる

520 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 05:17:34.81 ID:q3Z51bKg.net]
>>518
理解できないおまえがバカなのにな



521 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 06:26:44.67 ID:bvPeSDE7.net]
>>516
if (low < var < high) とは表記法が違うが
Scheme だと下のように書ける。
(< val1 val2 ...)
全対象が左から小さい順に並んでたら #t (真) が返る。

522 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 07:15:26.63 ID:XNVDRgDP.net]
>>520
わろた
この業界じゃ原始人の発想だろそれw

523 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 07:47:50.10 ID:/0pFLROb.net]
>>521
minじゃないからfoldしているわけではないよね。なんか不思議な感じだ。

524 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 08:20:55.53 ID:x2QuPiOh.net]
>>516
例えばx < y <= z はx < y and y <= z と等価になります。
docs.python.jp/2/reference/expressions.html

525 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 09:40:23.32 ID:ZD2eNqW/.net]
>>507
そんなこと考えるな!

526 名前:デフォルトの名無しさん [2015/12/29(火) 10:59:26.46 ID:pcIQgVwC.net]
一部を見てc++エンジニア全体を知った気になってdisるアホ

527 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 11:04:03.32 ID:RwgMy6a6.net]
>>501
if ( !(1.0 <= distance && distance <= 100.0) )
 throw エラー;

528 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 12:35:54.08 ID:6RBxEQHH.net]
vector<T> l;
for (size_t i = 0; i < l.size(); ++i)
というのをよくやるんですが、size()は毎回評価されちゃうんでしょうか?
今時のコンパイラは賢く定数に置き換えてくれたりしないんでしょうか?

529 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 12:38:01.08 ID:6RBxEQHH.net]
あ、constは付けてないと駄目ですよねさすがに

530 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 12:53:18.17 ID:TUTY/6iG.net]
一般には、その他にもmutableなメンバ変数があったりすると毎回呼ぶ必要が出るね。

std::vectorの場合に限ると、-O2付けた出力はこんな感じになったよ。
https://gist.github.com/pixie-grasper/150777a10d70f0abbbf7
評価されるどころか、vectorクラスのprivateメンバから値持ってくる感じのコードに最適化されるっぽい。



531 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 13:26:27.57 ID:TUTY/6iG.net]
ちなみにうちの環境だと、該当箇所は

/usr/include/c++/4.8/bits/stl_vector.h:642-646
// [23.2.4.2] capacity
/** Returns the number of elements in the %vector. */
size_type
size() const _GLIBCXX_NOEXCEPT
{ return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }

こんな具合。
あと、_M_implはvectorから見てprotectedだったわ。

532 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 14:15:30.87 ID:5o0CYWec.net]
>>528
たぶん毎回評価されず、最初の1回だけ。
ループ中に、コンテナの要素を削除して、エラーになるか試してみ

Javaでは、forループではエラーになるが、
Iteratorではエラーにならない

forループ構文とコンテナは、無関係

一方、Iteratorでは要素を削除すると、sizeも変更されて、
要素数の変化に対応している。
つまり、Iterator構文とコンテナは直結している

533 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 14:28:50.16 ID:TUTY/6iG.net]
>>532
いや、汗を見る限りじゃ毎回評価されてる。

ループ部分を抽出するとこうなるんだけど、[rsp+8]と[rsp+16]にpointer型の
vectorから参照可能なbeginみたいな奴とendみたいな奴が入ってて、引き算したりとか右シフトしたりとかしてsize()の値を計算してる。
.LBB0_4:
movl $.L.str, %edi
callq puts
incq %rbx
movq 8(%rsp), %rdi
movq 16(%rsp), %rax
subq %rdi, %rax
sarq $2, %rax
cmpq %rax, %rbx
jb .LBB0_4

詳細は>>530

534 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 14:33:07.20 ID:yBBCkdZV.net]
sizeの値が更新されないことをコンパイラが解析できれば一回で済む。
まあ、callが入ったら駄目だな。

535 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 14:40:40.47 ID:TUTY/6iG.net]
-O3付きで最適化したら評価がループ前の一回になった(clang, gccどちらでも)。

でもif (*it == 0) {l.pop_back();}みたいな事をループに含めたら
ループ中にしっかり判定するように戻った。
最適化の理屈はわかるが理解は出来そうもないな。

536 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 15:08:32.55 ID:zasxVKJk.net]
>> -O3付きで最適化したら評価がループ前の一回になった
手元の環境だと再現しないからコンパイラのバージョン教えて欲すぃ
>>534 が言うように puts を call してるから static でないグローバル変数について
最適化がかかるとは考えづらいんだけど

537 名前:536 mailto:sage [2015/12/29(火) 15:10:58.33 ID:zasxVKJk.net]
阿呆な勘違いをしてた
グローバル変数じゃないよね…

538 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 15:14:35.21 ID:TUTY/6iG.net]
>>536
ごめん、もう一回確認したらどっちも毎度評価されてた。
間違って(auto i = 0ul; i < l.size(); i++)の代わりに(auto it = l.begin(); it != l.end(); ++it)のコード眺めてたらしい。
本当にごめんよ。

ちなみにバージョンの方はこんな具合
$ clang --version
clang version 3.7.0 (tags/RELEASE_370/final 251906)
Target: x86_64-unknown-linux-gnu
Thread model: posix

$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

539 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 15:24:15.64 ID:TUTY/6iG.net]
但し、最適化を妨げる為に
auto l = vec();
として、std::vector<int> vec();は宣言のみにした。
多分vec関数の中でスレッドを生成して別スレッドでベクタのサイズが変わるような例が
最適化を妨げてるんだと思う。

ので、試しに
static auto vec(int l) {
std::vector<int> ret(l);
for (auto i = 0ul; i < ret.size(); i++) {
ret[i] = rand();
}
return ret;
}
して
auto l = vec(argc);
して試してみたら、-O2でl.size()が1度だけ呼ばれるようになった。

540 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 15:37:43.90 ID:TUTY/6iG.net]
コンパイラさん、スレッド作って内部で書き換えるなんて用途にはatomicなvectorを作って対応するので
もっと賢く最適化してください・・・・・・

色々弄った結果、どうも宣言だけの関数の戻り値には最適化が効きにくいみたい。
まさかコンパイラが1つのファイルに全てを詰め込むスタイルを推奨してたとは。



541 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 15:46:32.38 ID:Wh0+WWK1.net]
コンパイル単位
スレッドも関係ないし

542 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 16:20:44.57 ID:zasxVKJk.net]
翻訳単位外で vec() を↓みたく定義して -flto でコンパイルするとうまいこといくけどー

#include <cstdlib>
#include <vector>
std::vector<int> vec() { return std::vector<int>(rand()); }

スレッド云々は関係ないとしても、ループ内で size() と puts() しか呼んでないんだから
これくらいの最適化くらいはして欲しい気が

543 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 18:05:58.76 ID:FzuTDc5z.net]
>>532
>ループ中に、コンテナの要素を削除して、エラーになるか試してみ
>>528の最適化は結果的には直感に一致してsize()が定数に置き換わるが、
その結果に至るまでにコンパイラの考えはそれほどストレートではない
削除するコードをループの中に入れるや否や、定数だったsize()はループ毎に呼び出されるsize()に変わるであろう、

ていうかコンパイラにとって、size()は「どんな副作用があるかわからない」外部リンケージの関数に見えるのがデフォ
size()がconstメソッドであっても同じ。C++の言語仕様からは、constメソッドを無条件に定数に置き換えてよいという結論が導けない。

ただ、>>528のケースでは幸いsize()はクラステンプレートのメンバなので、
インライン展開されてループ内で呼び出しの結果が一切変化しないことがワカルから運よく定数にできる

544 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 18:10:39.31 ID:zasxVKJk.net]
> 運よく定数にできる
まったくその通りだと思うけど、>>533- で言われてるみたいに
最適化が阻害されてるのはなんで?

545 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 18:13:13.05 ID:FzuTDc5z.net]
最適化において押さえねばならないのは
 (1) 関数呼び出しに副作用が無いことをコンパイラに納得させる書き方
 (2) ポインタを使用した場合、ポインタのaliasが関数内に存在しないことをコンパイラに納得させる書き方
は少なくとも必須、

(1)は>>540の通り、1つのファイルに全て詰め込むことで達成される
(2)はしばしばベンダー独自の言語拡張に頼らねば実現できぬ(__restrictとか__declspec(noalias)とかetc.)

なお(念のため、)(1)、(2)とものマルチスレッドは関係なく、普通にシングルスレッド状況で問題になる

546 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 18:20:19.70 ID:FzuTDc5z.net]
>>544
プログラムとか書いたことの無い素人なのでようわからんが、
多分コンパイラから見て何するかわからない関数puts()が呼ばれていることから、
puts()がIteratorと同じポインタを握っていてsize()の戻り値に相当するprivateメンバを
puts()が書き換える可能性を恐れて
毎回size()の戻り値に相当するprivateメンバをメモリから読み出すコードになるんだろJK、

つまり>>533の(1)と(2)の複合技(悪い意味で

547 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 18:29:22.06 ID:zasxVKJk.net]
>>545
うん、うえのコードだと、size(void) は条件を満たしてるよね
puts(const char*) もそうだと思うんだけど、
実際には size() をインライン展開したものがループ内にあるじゃん
>>533 って要するに (vec.end() - vec.begin()) / sizeof(T) ってことだよね?)
なんでこれがループ外に追い出されないのかなって

>>546
定数の char ポインタとスタック中に置かれたオブジェクトのメンバとの間で
aliasing が起きうるとコンパイラが仮定してるってこと?
納得できるようなできないような……

定数文字列をどこに置くかはリンカが決めることだから
コンパイラとしては aliasing の可能性を否定できない、とか?

548 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 18:35:17.18 ID:FzuTDc5z.net]
>>547
プログラムとか書いたことの無い素人なのでようわからんが、
>定数の char ポインタとスタック中に置かれたオブジェクトのメンバとの間で
>aliasing が起きうる
ということではなくて、puts()の中身についてコンパイラがなんら仮定を置けないことに由来するもの

ひょっとしたら、どっか別の翻訳単位において、グローバル変数か何か経由で
vectorのアドレスがputs()に筒抜けなのかもしれない、
とコンパイラは想定せざるを得ない。それが合法なコードとして実現可能な以上は、、、

549 名前:547 mailto:sage [2015/12/29(火) 19:03:15.94 ID:zasxVKJk.net]
>>548
むむむ 今の場合は値返しだから関係ないじゃんと思ったけど、
(1) vector は普通ポインタを保持してて、そのポインタが unique であることをコンパイラは仮定できない
(2) コンパイラは puts が何をするのか全く知らない。もしかしたら (1) のポインタがグローバルに置いてあって
 それを使って何かしているかも知れない(とコンパイラは考えざるを得ない)
という理解でおk?

550 名前:>>528 mailto:sage [2015/12/29(火) 19:27:40.31 ID:6RBxEQHH.net]
ありがとです
なんか色々調べてもらってすいません

言い忘れましたが、ファイルからデータを読んでvectorにpush_backするつもりです
なので、サイズが定数になることはありえないですよね

せめてforスコープ内でvectorのサイズが変わらないことをコンパイラが判断して
一回目にsize()を呼び出した後はその値をうまくキャッシュみたいに保持してくれたら
嬉しいんですけど、さすがに無理ですかね

まあsize()のコストが気になるケースってそうそうないかな



551 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 19:44:22.68 ID:RQT/AIDK.net]
size()のコストが気になるならローカル変数に取り込めばいいだけの話なので
悩むだけ無駄

552 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 20:32:06.11 ID:Wh0+WWK1.net]
むしろその部分が可変なわけで、そんなの見たらそれでプログラムが正しく動くのか不安になるレベル

553 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 20:33:41.23 ID:oa6bBwaZ.net]
>>551
ほんとこれ

554 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 20:49:36.07 ID:mJLVAknr.net]
String &validate(String &s) {
 return s;
}

String s = String("");
String str = validate(s);
&s == &str; // true

上記のコードを右辺値に対しても実現したいのですが、C++ではそもそも可能でしょうか。
以下の方法を試しましたが、どうしてもムーブコンストラクタが必要になります

左辺のインスタンスをコピー無しでそのまま右辺に渡したいのです

String &&validate(String &&s) {
 return std::move(s);
}

String str = validate(String(""));
// コピーコンストラクタもデストラクタも呼ばれないようにしたい

555 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 21:03:53.91 ID:mJLVAknr.net]
>左辺のインスタンスをコピー無しでそのまま右辺に渡したいのです
右辺のインスタンスをコピー無しでそのまま左辺に渡したいのです

右辺でインスタンスを生成している以上、アドレス上にはデータとして存在しているはずなので
C++なら何かしらの方法があると思って左辺値やらムーブセマンティックをずっと調べていたのですが
ここにきて躓いてしまいました。

556 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 21:10:08.88 ID:ZD2eNqW/.net]
c++って何でこんなにおかしな文法がどんどん増えて行くの?

557 名前:デフォルトの名無しさん [2015/12/29(火) 21:13:03.67 ID:6vdeklix.net]
効率アップの為

558 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 21:20:03.79 ID:ZD2eNqW/.net]
>>557
ムーブとかコピーとか指示しなくてもコンパイラが自動で効率の良い方に判断して決めればいいだろ

559 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 22:23:47.63 ID:6YBnwxxm.net]
その判断にregisterだとかconstだとかの修飾子が必要なんじゃないの?

560 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 22:29:14.30 ID:DyLV+MBH.net]
>>554
> &s == &str; // true
???



561 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 22:29:19.92 ID:RwgMy6a6.net]
自分で既に答えを書いてるようなものじゃないか
ideone.com/EulRlT

562 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 23:24:13.37 ID:B7dg+s8V.net]
>>561
だめだぞそのコード
無効な参照を生成してるからな
ttp://ideone.com/Egnenh

そもそも>>554
String &&validate(String &&s) {
 return std::move(s);
}
が潜在的な危険性が高いものだって話だが

563 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 23:54:01.51 ID:RwgMy6a6.net]
>>562
おっとそうだな
何故ムーブコンストラクターを使うのがダメなのかはさておいて
ムーブコンストラクター無しだと厳しいな

564 名前:デフォルトの名無しさん mailto:sage [2015/12/29(火) 23:58:05.41 ID:6YBnwxxm.net]
もうポインタでいいや

565 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 02:09:58.01 ID:uSM4nvoL.net]
>>544
質問の意味がよくわからんが素直に右辺値参照で拘束すればいいんじゃないの

String &validate(String &s) {
 return s;
}

String && s = String(""); // 右辺値
String & str = validate(s);
&s == &str; // true

566 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 02:16:52.49 ID:Ov2mfylL.net]
>>528
そんなもん気にすんなよ

567 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 09:06:45.17 ID:KphNVLo3.net]
イテレータやrange based forの方がいい

568 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 10:41:20.22 ID:zgXxrRY5.net]
for(size_t i=0, const size_t N=l.size(); i<N; i++)

569 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 10:46:29.16 ID:S3GUoFHZ.net]
何がいいたいのかわからない糞コードの断片のみが書かれた糞レスする奴は去れ >>568

570 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 10:52:55.95 ID:321WQPIr.net]
アホ自慢はいいよ



571 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 11:10:43.39 ID:gI1ebqZA.net]
>>568はC++言語ではないな

572 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 11:16:22.37 ID:D4zykomn.net]
そういや典型的なfor文てループ変数が内部で書き換えられる危険性に常に脅かされるよな
なんか回避策ないものか

573 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 11:34:21.87 ID:Y/XxvHTU.net]
ループ変数使わなきゃいいんじゃなくって?

574 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 11:39:19.42 ID:gI1ebqZA.net]
>>572
3分で考えた。確認はしてない
ideone.com/yJneTF

575 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 11:55:34.57 ID:K47H7mbU.net]
>>565
できれば関数の戻り値等も一時拘束無しで、インラインで記述したいのです。
String a = validate(buildString("a"));
String b = validate(buildString("b"));

色々試しましたが、どうしても戻り値の代入タイミングでなにかしらのアクションが必要になるようです。

String str = validate(String("")); // 代入時Stringのコピーコンストラクタが呼ばれてしまう
String &&str = validate(String("")); // 同じ参照が渡るが代入時にデストラクタが呼ばれてしまう

576 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 11:59:27.37 ID:K47H7mbU.net]
結局、右辺値を左辺値として返すことは出来ないのではないかと理解しています。
右辺値と左辺値が同じアドレスの物であることを保証する仕組みがあれば、実現は可能なのかもしれません。

577 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 12:00:16.50 ID:gI1ebqZA.net]
>>572
>>574の [i=i] は [&,i=i] の間違い。
実用的じゃないからどうでもいいけど

578 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 12:24:09.10 ID:gI1ebqZA.net]
右辺値と左辺値が同じアドレスの物であることを保証する仕組みは>>565が示したが
出来ないと否定する理由を聞きたいものだ

String && s = String(""); // 右辺値

579 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 12:47:19.38 ID:CQCHxdlR.net]
String ** 演算子が存在しなければ、 &&も成り立たないだろ
ほんとバカだな

580 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 12:57:29.01 ID:8m5+SCRD.net]
とキチガイアスペがラリっております



581 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 13:04:03.82 ID:CQCHxdlR.net]

sssp://o.8ch.net/4rfx.png

582 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 13:04:20.00 ID:8RoCccmO.net]
>>575
一時オブジェクトの寿命について調べた方が良いよ
それが危険な考えだとわかる

そのStringクラスのムーブコンストラクタが十分高速ならば、そんなまどろっこしいことを考える必要は無い
(それこそStringの中にポインターが一つしか無いような場合等)

583 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 13:29:51.94 ID:K47H7mbU.net]
>>554です。
出来ればワンラインで記述する方法を見つけたかったのですが、もともとの目的は処理の高速化であったため、
>>578>>565さんの方法もしくは当初の参照を使う方法を採用することにします。

String &&s = String("");
String &&str = validate(std::move(s));
&s == &str // true

584 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 13:35:17.89 ID:CQCHxdlR.net]
それだとバカなコンパイラは参照カウンタインクリメントしてくれないだろ
最期の&が 文字型の参照だからよう ダメだろそれ

585 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 13:45:36.21 ID:CQCHxdlR.net]
String str = String("") ; // 実体を保持
String &&s = str ;
String &&str = validate(std::move(s));
&s == &str // true

586 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 13:59:44.67 ID:K47H7mbU.net]
ご指摘ありがとうございます。
参照を用いた本来の方法が一番よさそうですね。

String &validate(String &s) {
 return s;
}

String s = String("");
String &str = validate(s);
&s == &str; // true

587 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 14:11:32.39 ID:gI1ebqZA.net]
>>585
クレイジーなコードで混乱させんなボケ

>>586
>>565の完成形から劣化させんなボケ
そのStringクラスはムーブコンストラクターがないんだろ?
(575でコピーコンストラクターが呼ばれると書いてるんだから)

588 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 14:15:17.23 ID:CQCHxdlR.net]
>>587 は?テメェ参照の定理理解してねぇだろボケ!

589 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 14:25:17.74 ID:Y/XxvHTU.net]
先輩方はどのような分野のプログラムを組むのにそのような高尚なテクニックを使用しているのですか?

590 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 14:32:43.34 ID:PBmz2gbU.net]
なんで実体を保持してんのに&&で受けるんだ?



591 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 14:36:15.67 ID:gI1ebqZA.net]
>>590
それはですね
>>585がアホで理解してない上にアホだから
コンパイルも通らない出鱈目なコードを書いてみただけなんです

592 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 14:50:11.85 ID:CQCHxdlR.net]
っんだよ、下にstr居たのかよwクソ
String retainedstr = String("") ; // 実体を保持
String &&s = retaiinedstr ;
String &&str = validate(std::move(s));
&s == &str // true

593 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 14:51:54.26 ID:CQCHxdlR.net]
何だよこのワケワカなソースは
実用性あんのかよw

594 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 14:52:25.29 ID:gI1ebqZA.net]
ほらほら
いまだにコンパイルすら通らない
とんちんかんなウンコードを投下しちゃって

595 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 14:58:47.36 ID:CQCHxdlR.net]
あーうるswぇクソヤロウがw
String retainedstr = String("") ; // 実体を保持
String &&s = retainedstr ;
String &&str = validate(std::move(s));
&s == &str // true

596 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 15:00:47.53 ID:gI1ebqZA.net]
こんだけ罵倒されても
コンパイルが通るか確認しようとしないんだから…
このウンコめ!

597 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 15:01:13.41 ID:CQCHxdlR.net]

sssp://o.8ch.net/4rsw.png

598 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 15:25:53.68 ID:gI1ebqZA.net]
人を笑わせる才能だけは認めざるを得ない
腹痛ぇ

>>597
あのな、右辺値参照は左辺値で初期化できないんだよ
ついでに String && x = String(""); は
一時オブジェクトがxのスコープだけ延命されるからretainedstrを別の変数に入れるのが全く無駄なんだよ
ついでにmoveに渡す変数はString&&型である必要がないから、やはりString&&を用意することが無駄なんだよ
ついでに一度ムーブした残りカス(変数s)に触れるのは一般的に悪いこととされてるんだよ

わかったら一週間穴にこもってろ

599 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 15:33:30.50 ID:CQCHxdlR.net]
え?俺じゃなくてコレ最初に書きはじめたバカに言ってよw

600 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 19:09:52.98 ID:M6A8aZEH.net]
C++ でイマドキな感じの GUI フレームワークおしえてくらはい



601 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 19:12:48.26 ID:D4zykomn.net]
Qt
wxWidgets

602 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 19:21:13.20 ID:Q+VQ416F.net]
Qtはオワコン

603 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 20:10:57.71 ID:Q+VQ416F.net]
>>568>>551の例としてあげたんだよな
for(size_t i=0, N=l.size(); i<N; i++)と言いたかったんだろうけど

604 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 20:42:43.53 ID:gI1ebqZA.net]
>>589
右辺値参照はアプリケーションプログラムはともかく
ライブラリなら分野を問わず常用
ただ右辺値参照を一時オブジェクトで初期化して延命するのは
糞スレの糞レスぐらいでしか使い道がない
>>574のテクニックもしかり

605 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 21:38:59.41 ID:M6A8aZEH.net]
>>601
Qt や wxWidget ってイマドキなんですか
イベントハンドラをラムダで渡したり、他の言語 (Python とか Ruby とか) と相互運用したりできる?

606 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 21:48:21.07 ID:QbRR4fzN.net]
ではまず貴様の「相互運用」とやらの定義を聞こうか

607 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 23:21:19.30 ID:M6A8aZEH.net]
>>606
実行中にスクリプト側から動的に GUI の項目を操作したり ハンドラをスクリプトで記述したりできて、
かつそのスクリプトを C++ 側から実行時にアタッチ / デタッチできること
……かなあ
全部 C++ で作るのはめんどいししんどいよ

608 名前:デフォルトの名無しさん mailto:sage [2015/12/30(水) 23:53:48.02 ID:JlgYQswX.net]
どの辺がめんどいの?

609 名前:デフォルトの名無しさん mailto:sage [2015/12/31(木) 00:00:12.94 ID:6VYBPGte.net]
イベントハンドラーをラムダで登録とか、悪い予感しかしない
ideone.com/hTB42J
書いた奴の自己満足フレームワーク

610 名前:デフォルトの名無しさん mailto:sage [2015/12/31(木) 00:03:18.17 ID:6VYBPGte.net]
しまったQの相手をしてしまった



611 名前:デフォルトの名無しさん mailto:sage [2015/12/31(木) 00:06:15.09 ID:Lrxj+qUj.net]
QはQtがお好き

612 名前:デフォルトの名無しさん mailto:sage [2015/12/31(木) 00:23:06.96 ID:PyyPCfRY.net]
なにの悪い予感がするって
要らなくなったラムダはイベントハンドラから削除しなければならないんだけど
削除したオブジェクトをラムダがキャプチャしてたら不味いから
同じタイミングで削除しなきゃならないんだけど
削除しようと思うと削除したい対象のラムダを探索しなきゃならないわけだけど
どうせ、thisポインタをキーにしておくぐらいしか、うまい方法が無いわけだけど

613 名前:デフォルトの名無しさん mailto:sage [2015/12/31(木) 06:35:28.32 ID:hwCO+aFi.net]
bank.sumitomo.link/

614 名前:デフォルトの名無しさん mailto:sage [2016/01/01(金) 00:05:21.74 ID:PDfM8fXt.net]
もうGCでいいじゃん

615 名前:デフォルトの名無しさん mailto:sage [2016/01/01(金) 00:09:07.31 ID:9DJLBWi4.net]
>>614>>612を100回読み直した方がいい
GCで救えるのはイベントハンドラーの登録先も不要になったときだけ

616 名前:デフォルトの名無しさん mailto:sage [2016/01/01(金) 00:27:37.65 ID:dF7ELeO+.net]
登録したらハンドラクラスを返すんじゃダメなのか

617 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 09:25:44.20 ID:RY1Mzif4.net]
C++は型のコピーを作れないんだね。

618 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 09:36:05.09 ID:oefJgHjC.net]
class HogeCopy : public Hoge {};

619 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 09:52:03.42 ID:RY1Mzif4.net]
それって生成されるプログラムも同じ?

620 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 10:47:18.41 ID:d/OgN9t0.net]
こんにちわ、剛力殺めです



621 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 12:36:29.20 ID:0Z0E4/iT.net]
>>618
Hogeのprivateにアクセス出来なくね?

622 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 12:53:28.32 ID:x5rHK6YB.net]
じゃあこれでどうだ
using HogeCopy = Hoge;

623 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 12:55:05.98 ID:JG29ScMD.net]
>>621
コピーってprivateにアクセスする必要ある?
そもそも型のコピーってなんじゃ

624 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 13:27:37.05 ID:ryo9pTzs.net]
まず目的を言ってくれないと。
別名をつけるメリットは思いつくけど
コピーするメリットが全く思い浮かばない。

625 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 15:57:11.58 ID:RY1Mzif4.net]
>>622 それはコピーじゃなくて別名だよね
>>624 型のコピーとコピーじゃないのによってテンプレートの特殊化を別物にするとか、intに新しい演算を定義するとか。

626 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 16:17:45.65 ID:31VDmaGa.net]
メタプログラミングしてるときのコンパイルエラーとかデバッグとかの負担を軽減する方法ってあるの?
もしかしてこのスレの強者は少なくともコンパイルエラーなんてヘマはしないとか?

627 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 18:03:58.04 ID:FhMj24vi.net]
コンセプトさんが何とかしてくれるはず

628 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 18:41:52.04 ID:PWQd7yEq.net]
>>625

特殊化できる時点で別の型やん…

629 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 18:59:21.74 ID:RY1Mzif4.net]
表現が既存の型と同一だが,型システムの中では別の型として識別されるような型のことを言ってるんだよ。

630 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 19:19:01.31 ID:sMTgy5ar.net]
言語仕様の改定として最近提案されていた記憶はあるが
現時点ではそのような機能は無い



631 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 20:58:24.95 ID:PWQd7yEq.net]
>>629
それをコピーって言ってるの?
オレオレ表現にも程があるぞ…

632 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 21:00:04.95 ID:PWQd7yEq.net]
ま、本筋とは異なる批判はさておき、classでラップすれば良いだけなのでは?

633 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 21:53:48.21 ID:lELbBk3M.net]
>>628
コピーと言ってるんだから別の型に決まってるだろ
日本語を勉強して出直せ

634 名前:デフォルトの名無しさん mailto:sage [2016/01/04(月) 23:10:05.98 ID:IfH9xfDw.net]
うわー、さわっちゃいけない人
キタ━━━━(゚∀゚)━━━━!!

635 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 02:51:49.34 ID:C4wviD0G.net]
エイリアスじゃなくてコピー…って意味合いなのかな?
空のクラスに継承したんじゃ駄目なんだろうか

636 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 03:01:52.60 ID:qdeLL6th.net]
そんな意味での型のコピーなんて出来る言語なんて存在するのか?

637 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 04:16:47.81 ID:h4uipHpM.net]
コピーと言われても分かるわけないだろ。
strong typedefとかopaque aliasとか言ってくれないと。

638 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 08:19:48.66 ID:KIPOXvA0.net]
>>636
たいていの言語でできるでしょ
型定義の部分選択して ctrl-C ctrl-V …

639 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 09:28:32.45 ID:LntnFA7d.net]
既存の型と同一、か。
intとlongが同一ビット数なら同一だと言えるのかね? やれることは一緒だし。
そういう関係を一般的に作り出す方法は考えつかないなあ。
ちなみにVC++で確認してみたらintと__int32でオーバーロードすることは出来なかった。

640 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 12:44:07.71 ID:bgpEtT/U.net]
>>638
爆笑した



641 名前:デフォルトの名無しさん [2016/01/05(火) 16:48:35.45 ID:zdhQndDP.net]
scottmeyers.blogspot.jp/2015/12/good-to-go.html
C++はオワコン

642 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 17:11:18.29 ID:qdeLL6th.net]
文盲キタ

643 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 18:44:58.55 ID:7Q2tXWc2.net]
C++がオワコンって事はノイマン式が終わるって事でおk?

644 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 19:12:54.90 ID:Woj1scU2.net]
>>641
読んでないけど戦慄した

645 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 20:21:52.49 ID:pdn2jg8d.net]
>>625
継承で十分だろ。
もしかしてJavaScriptのプロトタイプのこと言ってるのか?

646 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 21:16:44.23 ID:00c582j0.net]
是非Meyerさんにはc++を一掃する力を持つ独自言語を開発してほしいね。
googleあたりはjavaもc#もswiftも超える独自言語を手に入れたいはず。

dirt?go?何それ美味しいの?

647 名前:デフォルトの名無しさん [2016/01/05(火) 21:18:38.17 ID:Nzvsp30A.net]
Dはなぜ死んだのか

648 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 21:18:43.75 ID:R3czB2hZ.net]
>>617
良くわからないから、君の所望する機能が実装されている具体的な言語を教えてくれまいか?

649 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 22:54:08.85 ID:7Q2tXWc2.net]
システム―何かを実現する仕掛けというのは「あれば望ましい程度」の物を詰め込むと扱いが厄介でコストパフォーマンスが悪い物ができる。
Dはその愚を犯したのかもしれないな。
C#とかも危なそうに見えるんだが設計が良いのかGUIの利便性を追求したというセールスポイントが良かったのか?まだ元気。
Javaもマルチプラットフォームがウケてるのかな?
Dのセールスポイントがハッキリしないという事かもしれない。

型のコピーって何?

650 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 23:35:37.60 ID:WmZ+DE/+.net]
え、D死んだん?
流行るとか言ったやつ誰だよ



651 名前:デフォルトの名無しさん mailto:sage [2016/01/05(火) 23:51:07.57 ID:D1dQyGLj.net]
D言語くんは流行ってるけど?

652 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 00:17:50.87 ID:dKGWEjRg.net]
>>637
そのどちらも外してるだろ文盲

>>643
妄想キチガイは去れ

>>645
お前の程度の低いオツムでは十分かも知れないが同意は求めない方がいい。
Aと別の型Bを作ったのにB&がA&にキャスト出来てしまったらおかしいだろ低能

653 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 00:37:31.38 ID:5UG3hvjQ.net]
>>652
あくまでも「既存の任意の」型Aに対してそのコピーとなる型Bを作りたい、しかもソースコードコピペ改変ではなく、
ということだったら答えは「C++では無理」だと思う。

それができるように設計した型に対してだったらできるだろうけど。

654 名前:デフォルトの名無しさん [2016/01/06(水) 00:59:11.25 ID:NeF0se+2.net]
そんな機能欲しくなるってどんな状況だよ

655 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 02:23:54.37 ID:kBV+7dn0.net]
D言語がコケた原因の一つがネイディブコードでありながら
C言語とソースコードレベルで互換性が無かったから
具体的にはCのヘッダをそのまま読み込めなかったから
有志の人がCのヘッダをDに移植しまわってるけど
そんな怪しげなものを使いたいとは思わないだろう

656 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 08:36:21.49 ID:KjcuT4OL.net]
>>655
コケた原因はひとえに絶え間ない破壊的変更のせい
ライブラリも入門サイトもせいぜい半年でなぎ倒される
誰がそんなもの使うか

657 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 08:46:49.87 ID:/XlzX9bH.net]
他山の石

658 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 11:54:46.98 ID:6VagEy4C.net]
プログラミング初心者です。
下記のサイトを参考に電卓のプログラミングを作成しているのですが、添付画像の黄色枠で囲っている部分では何故if文で{}が用いられていないのかがわからないので教えて頂きたいです。

www5b.biglobe.ne.jp/~suugaku/vc++kougi/kiso/dai6koudai7wa.html

i.imgur.com/cU9edjZ.jpg

659 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 12:16:44.47 ID:QNndC4zW.net]
ブロック内にステートメントが1つだけあるから。

660 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 13:00:25.49 ID:zF3cauCR.net]
if文の処理が一行の場合は{}が省略できるんだお。
if (y2==0)
 z=z&10;
と書いてもいいお。



661 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 13:39:31.62 ID:03yrwXIO.net]
省略できるけどするな
それバグの温床だから

662 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 13:41:09.64 ID:T4CebiEs.net]
>>658
初心者がいきなり C++/CLI はやめた方がいいと思うぞ
C++ を覚えたいのなら素の C++ 、.net 覚えたいのならば C# から入った方が良いと思う

他のページは見ていないが、張ったコードを見る限り他のサイトで勉強しなされ
初心者はなるべききれいなコードだけを見た方が良い

663 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 13:42:19.10 ID:/g1uIeri.net]
それって忌むべき慣習だと批判されたことある
それで可読性が高まるなら別に問題ないと思うけど
でも可読性なんて主観の問題でもあるしな

664 名前:デフォルトの名無しさん [2016/01/06(水) 13:51:31.05 ID:UxbtoQe/.net]
省略はするべきじゃないな
一貫性がなくなる
クラスや関数のカッコは省略できないしカッコをつける方向で統一すべき

665 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 14:02:25.34 ID:3zvgfCMD.net]
勉強ガンバレよクソガキ

666 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 14:14:52.15 ID:/XlzX9bH.net]
ifの後が一行の場合は{}がなくてもいい、ってのは「省略」ではないと思う。
省略していい/良くない、という議論はなにか違う。

667 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 15:40:33.70 ID:audoA3Q/.net]
省略じゃないよなifは引数にステートメントを1つだけ取る関数で、それを沢山渡したい場合はブロックステートメントで階数を上げて沢山渡すってことだからな。

668 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 15:46:38.00 ID:audoA3Q/.net]
ifは関数じゃなくてステートメントだということと、引数はステートメント1つとエクスプレッション1つをとることを付け加えておく。

669 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 15:49:22.23 ID:/XlzX9bH.net]
うーん

670 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 16:08:02.61 ID:/g1uIeri.net]
そういや{}使わんかったせいで昔NASAのロケットが落ちたんだっけ?



671 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 16:42:35.44 ID:kBV+7dn0.net]
ifやelseに絶対カッコを付けるので統一するなら
else if はどうするの?
if(...){}
else { if(...){} }
って書くの?

672 名前:デフォルトの名無しさん [2016/01/06(水) 16:47:00.21 ID:2xmASC79.net]
あほくさ
cにはelseifという構文はない!とか言いたいだけじゃないのか

常識的に考えてelse if{}だろ

673 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 16:47:28.42 ID:/XlzX9bH.net]
いや、待て。>>658に乗せられているぞ。
この話はやめようじゃないか。

674 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 17:40:22.69 ID:RGaENvv1.net]
そもそも省略できると表現する方がおかしいよね。
文法上は複文も使えるという感じだろう。

675 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 17:43:46.46 ID:C2N+bGa7.net]
>>671
わりと気づかずそう書いちゃうことはあった…

676 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 18:22:24.51 ID:3zvgfCMD.net]
ガキがC++を理解するには早すぎる

677 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 19:14:46.63 ID:9fKkTwJd.net]
>>670
コロンとセミコロンだったか、ピリオドとカンマの
打ち間違いでトラブルが起きたって話は聞いたことがある。
CやC++じゃないと思うけど。

678 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 19:58:42.59 ID:KjcuT4OL.net]
カンマ演算子を知らないと恐ろしいトラブルが生まれる

679 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 20:58:21.95 ID:/g1uIeri.net]
カンマ演算子オーバーロードできるんか知らなかった・・・

680 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 21:01:15.49 ID:5UG3hvjQ.net]
そのオーバーロードをトラップするテクニックは分かりにくいよな



681 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 21:55:31.41 ID:dKGWEjRg.net]
2ちゃんねるで自分のコーディングスタイルこそ正義と信じて他人にコーディングスタイル押し付ける低能が自演もとい集うスレはここですか

682 名前:デフォルトの名無しさん [2016/01/06(水) 22:00:39.10 ID:dAXQ+tnq.net]
コーディングスタイル自由化という修羅の道を望む奴やめてくれ
行き過ぎて押し付けは悪だけどある程度押し付けてくれないと初心者おれが死ぬ

683 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 22:10:21.76 ID:5UG3hvjQ.net]
>>682
押し付けるって、誰が?
初心者にそういう人間が必要になる状況って何なの?理解に苦しむ。

684 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 22:14:22.86 ID:dKGWEjRg.net]
一つのプロダクトの開発に関わる人の間や同じ組織内での統一することは良いことだが、
2ちゃんねるで無縁の人に自分のコーディングスタイルを押し付けるのは間違いなくキチガイ

685 名前:デフォルトの名無しさん [2016/01/06(水) 22:14:34.93 ID:dAXQ+tnq.net]
>>683
自分でスタイル模索するとエライことになるから、ある程度洗練されたスタイルを教えて欲しいの

686 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 22:21:42.87 ID:dKGWEjRg.net]
普通の人: 参考になるスタイルを知りたい。掲載して欲しい
変態: ボクにスタイルを調教して下さいハァハァ!

>>682はどちらかというと後者
683が理解に苦しむのはいたしかたない

687 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 22:31:41.76 ID:dKGWEjRg.net]
>>685
よしお前に天下のGNUスタイルを教えてやろう
if (func (arg1, arg2))
 statement;
else
 {
  statement;
 }

https://www.gnu.org/prep/standards/html_node/Formatting.html#Formatting

688 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 22:31:50.76 ID:FyCc+Dtf.net]
ifとelse ifで"("の高さが変わるのなんとかしてほしい…

689 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 23:03:51.66 ID:5UG3hvjQ.net]
ifの後に適当にタブ挿入すればいいんじゃないの?

ところでVisual Studioって設定次第だろうけど
if のあとスペース開けずにtab押すと変なことするね。
たとえば if(a=0) でifと(の間にカーソルがある状態でtab押すと勝手にこうなる。

if (true)
{

}(a = 0)

やめてほしいんだけど、どの設定だっけ?

690 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 23:43:20.72 ID:xma6U5e/.net]
>>689
なんにせよ、if (a=0)はきもいな…



691 名前:デフォルトの名無しさん mailto:sage [2016/01/06(水) 23:57:57.54 ID:5UG3hvjQ.net]
>>690
おおっww悪い悪いwww

692 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 00:05:26.31 ID:jV+PPUjD.net]
>>687
なんだこれは・・・たまげたなぁ

693 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 00:08:53.89 ID:P0u7J+GC.net]
>>692
Googleも個性的なスタイルで有名
『do not use C++ exceptions.』
https://google.github.io/styleguide/cppguide.html#Exceptions

694 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 08:03:05.37 ID:02/PEFdC.net]
LLVMはstd::endlを使うなとか言ってたな

695 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 12:16:30.75 ID:jV+PPUjD.net]
ひょっとしてGCCがデファクトのCコンパイラの座から陥落する日も近いのかね
もうしてるとか?

696 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 12:36:35.50 ID:Wfw0ONSO.net]
複雑な処理をマクロにして
高速化するって
変態ですか?

以下がそのマクロたち
codepad.org/Fh4fq2mJ

上から順に αブレンド、ベクトル内積、ベクトル正規化
一番下はもうやけくそ
俺の場合
#define 主義 { C++で組む = C99で組む; if(C++で組む== C99で組む) inlineは使わない主義;}
int main() {
主義
return -1;
}
なんだよねぇ

697 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 12:40:18.58 ID:ig6R4qGw.net]
どうせ実行時評価が必要なのに、実行時型安全で最適化も期待できるtemplateを使わない意味はない
ということで、つぎのかんじゃさんどうぞー

698 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 12:42:21.20 ID:ig6R4qGw.net]
実行時型安全→コンパイル時型安全

699 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 13:44:47.87 ID:bWvRU875.net]
>>696
2番目のは内積じゃなくて外積に見えるけど?
3次元に決めうちなんだから普通の関数にしてもなんらペナルティはなさそうだ。
自分はマクロ定義不使用縛りを課している。

700 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 13:52:14.06 ID:uG/iUsjb.net]
>>696
そんな無駄なif文書いてる時点でお察し
おれならSSE使ってinline関数だな



701 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 14:03:07.83 ID:Pf5s4Kd+.net]
おまえらほぼ記述や書きかたについてばかりだけど、
なに作ってんの?これが一番重要なんだけど。
俺は作る物なくて困ってる。

それとも仕事かなんかで作りたくない物だけ作ってんの?
俺は別に数学が好きなわけでもなんでもないし。

702 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 14:09:36.60 ID:bWvRU875.net]
>>701
自分が便利になるツール

703 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 14:25:48.01 ID:JBjLWnoq.net]
>>699
無茶言うなって思ったらpragma onceはほぼ全てと言っていいほどのコンパイラでサポートされてるのね。

704 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 15:31:12.80 ID:jV+PPUjD.net]
>>696
マクロは根絶されるべきもの
いやしくもこのスレの住人ならばマクロ撲滅運動に貢献しなさい

705 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 15:37:35.70 ID:bWvRU875.net]
>>703
ああゴメン
インクルードガードだけは使ってるわ。
気にさわったら袋だたきにしてくれ

706 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 15:44:02.75 ID:bWvRU875.net]
だけど #pragma once が犬小屋でエラー出た記憶がある。

707 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 15:49:08.26 ID:N1UvBltE.net]
a once upon a time

708 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 16:23:58.40 ID:7vfkJ+8f.net]
ログ出力あたりだとマクロ使わないと面倒

709 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 16:38:26.25 ID:jV+PPUjD.net]
根絶は言いすぎか
goto同様、要は使い用かね

710 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 17:02:11.92 ID:h6IODMw0.net]
>>704
テンプレートの特殊化でマクロをよく使うなあ。
boostでもよく使われてるよね。



711 名前:デフォルトの名無しさん [2016/01/07(木) 17:05:45.32 ID:HwbuJDkG.net]
boostが使うのはいいがお前は使うな

712 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 17:08:10.76 ID:h6IODMw0.net]
だって楽じゃん。

713 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 18:08:52.01 ID:9s+XESwg.net]
GTK+で手が込んだことをやる時にもマクロを使うかな

714 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 18:32:12.25 ID:LXmdZrFU.net]
マクロで便利なのはWin32APIのウィンドウプロシージャのラッピングかな
MFCからパクっただけだけど

715 名前:デフォルトの名無しさん [2016/01/07(木) 20:37:47.61 ID:DDM1Q/Wc.net]
マクロ作りたがる奴は大規模開発やったことがないアホ

716 名前:デフォルトの名無しさん [2016/01/07(木) 20:56:21.96 ID:lRIC4Lm0.net]
大規模開発やったことないやつはアホ

717 名前:デフォルトの名無しさん mailto:sage [2016/01/07(木) 21:07:57.54 ID:zpJ8fCsq.net]
>>716
どれくらいの規模を大規模開発って言うの?

718 名前:デフォルトの名無しさん [2016/01/07(木) 21:23:44.17 ID:JpTJcFqH.net]
>>717
UNIXv6

719 名前:デフォルトの名無しさん mailto:sage [2016/01/08(金) 00:16:01.66 ID:SFovjtWA.net]
>>717
ttp://techon.nikkeibp.co.jp/article/COLUMN/20120210/204592/
> F-35のソフトウエア規模は全体で1800万行。このうち新規開発は1160万行で、
> 同じステルス型戦闘機として有名な「F-22A」と比べても4倍の規模だそうです。

F-35はC++だけど、F-22はAdaな。
むしここではF-22がAdaで1800/4万行ってのほうがなんか凄みがあるが。

720 名前:デフォルトの名無しさん mailto:sage [2016/01/08(金) 09:30:19.71 ID:tpB5KsLp.net]
F35ってハードよりソフトのほうが金かかってんだっけか



721 名前:デフォルトの名無しさん mailto:sage [2016/01/08(金) 11:54:38.75 ID:fLzwOGxi.net]
そもそもハードはN台つくるとほぼコストN倍
ソフトはN台作ってもほぼコストは1倍ですしおすし

722 名前:デフォルトの名無しさん mailto:sage [2016/01/09(土) 00:44:09.61 ID:G8JADAju.net]
クラスfooの型情報をクラスに持たせようと
static const string typeName
というメンバに"foo"を入れてるんですが、
もっと頭いいやり方絶対ありますよね?

723 名前:デフォルトの名無しさん mailto:sage [2016/01/09(土) 00:56:50.93 ID:N16yOwle.net]
>>722
typeidとtypeinfoでどうよ?

724 名前:デフォルトの名無しさん mailto:sage [2016/01/09(土) 01:17:39.23 ID:hFixEK58.net]
型情報を何に使用するかでなく
保持することが目的になってしまっている馬鹿は
言うことが違うな

725 名前:デフォルトの名無しさん mailto:sage [2016/01/09(土) 07:02:07.66 ID:Fk82Ooai.net]
C++は強く型付けされた言語なので、型情報をオブジェクトに持たせる設計が間違っている。
rttiなんて使ってるのは世界中で7人くらいと推定されている。

726 名前:デフォルトの名無しさん mailto:sage [2016/01/09(土) 07:57:31.33 ID:U1JQjBCj.net]
>>722
qtとか割とメジャーなOSSでもそうやっているから、あまり良い解は無さそうだ。

727 名前:デフォルトの名無しさん [2016/01/09(土) 10:38:03.41 ID:0Ig0qDlp.net]
>>725
QueryInterfaceにvoid**渡してswitchでキャストとかやってんじゃん
あれdynamic_castと内容的に同じことだし、
dynamic_castはvtableを使うわけだよな
つまりおまえさんが間違ってると言っている相手は動的結合そのものだぞ

728 名前:デフォルトの名無しさん mailto:sage [2016/01/09(土) 13:07:31.90 ID:CpCNnIMM.net]
間違っているというか、もう古過ぎるということだろう。
枯れているから使ってるだけで。

729 名前:デフォルトの名無しさん [2016/01/09(土) 13:33:10.30 ID:Fk82Ooai.net]
>>727
どうしてお前はそんなに頭が悪いのだ?
rttiはC++に閉じた仕組み、QueryInterfaceはC++に閉じていない。

730 名前:デフォルトの名無しさん [2016/01/09(土) 13:40:55.46 ID:KXL8RYc/.net]
>>729
おいおい話をすり替えるなよ
間違っているかどうかであって、閉じているかどうかではないぜ
頭が悪くて申し訳ないが、頭が狂ってる人こそ自分の心配をしたらどうだ



731 名前:デフォルトの名無しさん mailto:sage [2016/01/09(土) 14:17:58.94 ID:e/TIyCm2.net]
Cギスギス

732 名前:デフォルトの名無しさん [2016/01/09(土) 14:33:46.75 ID:Fk82Ooai.net]
>>730
本当に頭が悪いな。C++に閉じた世界では間違っているといってる。

733 名前:デフォルトの名無しさん [2016/01/09(土) 14:38:01.86 ID:Fk82Ooai.net]
バカにも分かり易くたとえ話で解説してあげよう

質問: char *a="abc", *b="123"; でa+bでつなげようとしましたができません。
オレ: それは間違っている。
バカ: 正しい。+で文字列を連結できる言語がある。

734 名前:デフォルトの名無しさん mailto:sage [2016/01/09(土) 14:46:38.43 ID:6gDXs0JP.net]
言語のRTTI機能とライブラリ・アプリケーションレベルの型情報は別に考えるべきかも知れない
だが>>733の例えは意味不明だ

735 名前:デフォルトの名無しさん mailto:sage [2016/01/09(土) 19:21:30.12 ID:G8JADAju.net]
>>723
そういやこんなのあるんでした。忘れてました
>>726
自分も、とあるそこそこでかいOSSで同じことしてたのを真似てました
typeidみたいな実行時型情報をあえて使わない理由があったりするんですかね?
クラステンプレートと相性悪いとか?

736 名前:デフォルトの名無しさん mailto:sage [2016/01/09(土) 20:03:52.03 ID:7Jt43H00.net]
複雑なポインターのエキスパートになる特訓方法を教えてください。

737 名前:デフォルトの名無しさん [2016/01/09(土) 20:29:01.57 ID:m1NDYqaC.net]
>>734
設計として間違っているかどうかという問題が、
なぜ言語機能とそれ以外に分ける必要が出てくるんだ?
アプリ屋が言語のせいにして逃げる口実に使えるかどうかという視点で論じているのか?

738 名前:デフォルトの名無しさん [2016/01/09(土) 22:00:04.64 ID:Fk82Ooai.net]
>>737
なんでお前、そんなに頭悪いんだ?

739 名前:デフォルトの名無しさん [2016/01/09(土) 22:35:44.20 ID:m1NDYqaC.net]
やーい、罵倒しか言えなくなってやんのw

740 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 00:04:39.98 ID:550mM9t8.net]
>>737
もともと>725はC++がstatic typingであることを理由に挙げているのだから
RTTIの是非が言語機能についてのみ言及であることはおかしくはない
突然「分けて考えるの禁止」などという俺ルールを持ち出す>>730のような馬鹿はどうしようもない



741 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 00:06:39.12 ID:KZTskEjX.net]
ここのところの乱高下のせいかみんなイライラしてんな。

742 名前:デフォルトの名無しさん [2016/01/10(日) 00:08:06.98 ID:ldysN96R.net]
サイコロで決めて良いなら、俺が判決出してやっても良いよ。
どうする?

743 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 00:22:29.45 ID:550mM9t8.net]
>>742
お前のサイコロ情報に価値など無いから
代わりに半ケツでも出してたらどうだ

744 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 00:34:26.25 ID:A0I7pImo.net]
さわっちゃいけないヒト
キタ━━━━(゚∀゚)━━━━!!

745 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 01:24:12.69 ID:JhCLPk/2.net]
今のうんこrttiはいらないけど代替は欲しいかな

746 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 08:00:23.93 ID:dvof2tBX.net]
そんなにウンコかなrtti
普通に使ってんだけど

747 名前:デフォルトの名無しさん [2016/01/10(日) 09:11:38.85 ID:qudb7NGO.net]
>>739
わかりやすく説明してやっても理解できないバカは罵倒するだけ。

748 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 14:09:10.54 ID:C+WC2CnF.net]
仕事で作るわけでもないvisual c++でmfc等を使ってのwindowsプログラムの作り方
を働きながらプライベートな限られた時間で学習して一人前になれますか。
c++の文法でつまずくことは特にないです。

749 名前:デフォルトの名無しさん [2016/01/10(日) 14:11:05.66 ID:CDjvfoVa.net]
↓一人前の定義を決めてもらえないと話も出来ないアホ登場

750 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 14:20:41.86 ID:7+LAjb+g.net]
一つ確実に言えることは、MFCは使うべきじゃない



751 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 14:27:33.96 ID:wjEuI9UW.net]
MFCはC++覚えたてのナンチャッテPGの設計臭がする

752 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 14:47:08.34 ID:KZTskEjX.net]
templateが無かった時代からあるんだから糞で当たり前だろ。

753 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 14:59:23.67 ID:qudb7NGO.net]
しかし、.Netを使わないならば、他の選択肢もクソ

754 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 20:01:43.31 ID:A0I7pImo.net]
>>748
可能だけど、そればかりは個人の資質次第としか言いようが無いと思う

755 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 20:04:34.86 ID:mfbMaCRH.net]
プログラムってある程度、
理解や調べる速さや物覚え、
そして妥協点で満足して分かったつもりになる能力がないとまともな速度では学習しきれない。

756 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 20:05:40.33 ID:mfbMaCRH.net]
書き忘れたけど、趣味ならどんな大変な目に遭ってもすごい速度で作り続ける情熱も必要

757 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 21:01:35.84 ID:DqVvg+zx.net]
MFCの範囲でやるならC#の方がいいと思うな
C++03,C++1x,標準ライブラリとかガン無視されるのもマイナス

758 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 22:09:34.67 ID:3R0pjSOb.net]
.NetはC#で実装すればいいと思ってる

759 名前:デフォルトの名無しさん mailto:sage [2016/01/10(日) 23:41:23.62 ID:lr/f1ZoA.net]
許可するやりたまえ

760 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 01:37:57.70 ID:wq6N3Kc5.net]
>>757
MFCを採択するようなニッチな場面で
C#という選択肢があるはずがないだろう低能



761 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 01:51:39.59 ID:dz1SW2uz.net]
このスレ見るようになって半年くらい経つけど、バカとか低能とか言うのって特定の1名っぽいね
スレの空気悪くなるからやめてほしいんだが・・・

762 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 02:01:44.75 ID:uJtkKKOe.net]
>>761
バカをバカと呼んで何が悪い
スレの空気が悪くなるからくだらない非難は止めろ

763 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 02:07:28.30 ID:Edevw0n0.net]
>>762
>バカをバカと呼んで何が悪い
空気が悪い

764 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 02:17:25.64 ID:wq6N3Kc5.net]
バカと馬鹿を含むレスはこのスレで三つしかしていないな
低能を含むレスは半分が俺のようだ

765 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 08:09:50.96 ID:uJtkKKOe.net]
>>763
それでは、このスレに来ないという選択をすれば良いな。

766 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 08:54:46.87 ID:rxVWnOdq.net]
C++の規格を読むよう人はなぜか攻撃的で
他人の意見を聞かない。>>3のテンプレからもわかる。
>>765も冗談じゃなくて本当のことだね。
きっと>>761も自演でしょ。

767 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 11:33:24.99 ID:dz1SW2uz.net]
自分はこのスレは情報が欲しくて見てるだけ
慣れ合いはともかく煽り罵りは邪魔でしかないけど、どうしようもないことだからスルーしてる
でもたまにイラッときて、いい加減にしろと言いたくなってしまう

768 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 13:32:12.40 ID:zbh6igZO.net]
>>766
もちつこう。
それは言い過ぎかと。

>>767
激しく同意。
ここ数年同じパターンだから、さすがに慣れたわ。
罵倒くんのおかげで、リアルでも耐性ついて、俺自身の人間性がレベルアップした気がする。
そういう意味で、あいつには割と感謝してる。

769 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 13:41:15.01 ID:LTvMV7ia.net]
>>767
あまりスルー力が高そうに見えないな

参考画像
https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcRmfN9x3aAMz1bm6VjOlHpjcwbb17inqmyR5sWLoC2b4-H816VZWvcSDHsJ

770 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 13:46:37.80 ID:IjRCLy/E.net]
ム板とマ板ってレス毎に暴言いれなきゃ話せない子がいるよね

バトウ君の別個体かも知れないけど、
ふらっとC#も荒れてるしウンザリ



771 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 14:00:37.53 ID:JutXF6Cv.net]
に、にちゃんねるって殺伐としたふいんきを楽しむところだったんじゃ…

772 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 14:30:28.70 ID:2XBLH7sU.net]
殺伐かどうかって実際は無意味なパラメータなんだよなw
レスの技術的価値、殺伐さ、という組み合わせで
有有←読む価値ある
有無←読む価値ある
無有←価値無し
無無←価値無し
結局こうだから

773 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 15:13:48.75 ID:clK+goHo.net]
>>771
昔はそういうところも2ch文化ってことで是としてた節があったけど
今は2ch自体がただの掲示板にすぎないからな
文化も糞もない

774 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 17:14:26.46 ID:6EuZL6LC.net]
テンプレートの >>3
言葉遣いこそ悪いものの有益な情報がちゃんと含まれてるからなぁ。

質問者をただ見下すだけ罵倒するだけの返答はお断り、っていう
スレッドの趣旨を例示したものだと思っていた。

775 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 17:22:13.78 ID:uJtkKKOe.net]
見下されるのは人格的に問題がある質問者。知らない事で見下される事は無い。
罵倒されるのは知ったかぶりしてウソを答える自称回答者。此奴は叩いて潰さないとダメ。

776 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 19:37:30.31 ID:wq6N3Kc5.net]
>此奴は叩いて潰さないとダメ

お前の方が人格を疑われかねないぞ

777 名前:777 mailto:777 [2016/01/11(月) 19:44:18.73 ID:NyTNyuvA.net]
777げっち(´・ω・`)b

778 名前:デフォルトの名無しさん [2016/01/11(月) 19:52:51.32 ID:d9M93+6h.net]
シーピーピー・ワンフォー!

779 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 20:19:59.74 ID:uJtkKKOe.net]
>>776
バカがまき散らかしたウソが蔓延してる掲示板には価値が無い。

780 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 20:24:22.57 ID:Fah0ydLs.net]
バランスだよな
スレの品質を保とうとする勢力がまだ残っていたら
バカや嘘を締め付ける力が優勢だけど
品質が低下してあるラインを超えたら見捨てられるから
あとはノイズだけが降り積もっていくだけ
バカは放置されこうしてコミュニティは一生を終える



781 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 20:32:48.21 ID:IUrb95R1.net]
>>775
ウソの回答が付いたとわかったなら正しい解答をすればいいだけだろう。
それが技術者として「叩いて潰す」ことになる。
正しい解答にだって罵倒を含めれば受け入れない言い訳にされてしまう可能性だってある。
まったく合理的でない。

782 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 20:39:31.92 ID:Fah0ydLs.net]
技術こそが本質ならば
罵倒か否かは語るべき価値もない
罵倒の有無で論旨が左右されることもない

783 名前:デフォルトの名無しさん [2016/01/11(月) 20:54:16.37 ID:qDZy1U6Z.net]
>>779
嘘を訂正しないで馬鹿って言うだけ?
いやーん馬鹿

784 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 21:06:51.37 ID:wq6N3Kc5.net]
嘘を訂正することは誰も否定していないのだが
馬○鹿には>>772>>782のような論理的思考は難しかったようだ

785 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 21:13:58.07 ID:IUrb95R1.net]
論旨を左右しない罵倒をわざわざ行うのは論理的とは言えないね。
論理的だというのならその客観的で妥当な目的を説明してもらわないと。

786 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 21:17:20.09 ID:wq6N3Kc5.net]

論理的に必然性が導き出せないことと
論理的に間違っていることを混同した馬鹿

787 名前:デフォルトの名無しさん [2016/01/11(月) 21:19:43.23 ID:qDZy1U6Z.net]
ひょとしてリアルキチガイ?

788 名前:デフォルトの名無しさん [2016/01/11(月) 21:35:15.89 ID:qDZy1U6Z.net]
         ,,-―--、
        |:::::::::::::;;;ノ  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
        |::::::::::( 」 < 論理的に必然性が導き出せないことと
論理的に間違っていることを混同した馬鹿

        ノノノ ヽ_l   \______________
       ,,-┴―┴- 、    ∩_
     /,|┌-[]─┐| \  (  ノ
      / ヽ| |  バ  | '、/\ / /
     / `./| |  カ  |  |\   /
     \ ヽ| lゝ    |  |  \__/
     \ |  ̄ ̄ ̄   |
      ⊂|______|
       |l_l i l_l |
       |   ┬    |

789 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 21:36:27.27 ID:VI4UFV9n.net]
最近はアホほど上から目線だよなw
意識高い系なんだろうね

790 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 21:39:22.35 ID:zbh6igZO.net]
C/C++系のスレは、上手く使うとスルー力鍛えられるぜ?
マジ、オヌヌメ。



791 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 21:40:58.64 ID:JutXF6Cv.net]
無関係な話題はスレチなんじゃ…
C++の話題に対して間違いを正すのはギリおk
罵倒は、C++との関係を立証した方がより望ましい

792 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 22:21:02.51 ID:VI4UFV9n.net]
アホはレスするな

793 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 22:23:48.78 ID:JutXF6Cv.net]
>>791
>>791は「C++」の文言が入ってるからギリおk

794 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 22:32:05.73 ID:wq6N3Kc5.net]
というのがアスペの見本です

「本スレのあり方について言及しているから」でなく
「キーワードが含まれているから」といあたりが
どうしようもなく低能のアロマ

795 名前:デフォルトの名無しさん [2016/01/11(月) 22:37:47.65 ID:qSBpiVnS.net]
>>789
>>792
渾身のネタ乙

796 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 22:42:13.02 ID:VI4UFV9n.net]
↑わざわざ出てこなくてもいいのに出てくるアホ

797 名前:デフォルトの名無しさん mailto:sage [2016/01/11(月) 23:24:48.46 ID:UhSyCJUj.net]
Qの自演タイム終わり?

798 名前:デフォルトの名無しさん mailto:sage [2016/01/12(火) 02:27:17.30 ID:I6rTk7bH.net]
QZみたいのが増えるよりはいくらか荒れてた方がマシかなあ
間違った事を強弁されるのは本当に萎えるよ

799 名前:デフォルトの名無しさん mailto:sage [2016/01/12(火) 07:09:31.65 ID:xNqBHdx2.net]
いや荒らしてるのお前だから

800 名前:デフォルトの名無しさん mailto:sage [2016/01/12(火) 19:50:56.19 ID:7kdSKUGZ.net]
QZはC++はスルー



801 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 00:17:19.69 ID:L5klkXci.net]
このスレで他人をすぐ罵倒する人は複数人いるようだ

802 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 18:57:15.02 ID:z0Cmtt7f.net]
初心者ですが素朴な質問いいですか?

近年のC++プログラミングでは、トレイトなどを駆使したメタプログラミングにより
処理を実行時ではなくコンパイル時にやってしまうのがトレンドのようですが、
従来型の実行時(動的)な処理は基本的にすべてコンパイル時(静的)の処理に置き換えられるものなんでしょうか?
それとも、無理な場合もあるんでしょうか?

ちなみに、こんなことを聞いたのは以下のようなブログを読んだのがきっかけです
ttp://qiita.com/Riyaaaa_a/items/887f6190e710c6410994

803 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 19:06:59.98 ID:3B0MZy9T.net]
実行可能なバイナリをリリースした後に書かれたコードを呼び出すのは無理だな
あとテンプレートはダックタイピングになるので強い型安全の保証も難しいだろう

804 名前:デフォルトの名無しさん [2016/01/13(水) 19:17:00.39 ID:2hL1OeUF.net]
>>802
きもい質問だろ

805 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 19:38:10.21 ID:QjeDGB/s.net]
>>802
quiitaってしたり顔でサクッとウソ書いてあるから疑ってかかった方が良い
> 各インスタンスが関数ポインタテーブルを持つことでスタックを圧迫し、

普通の知能もってりゃ、テーブルの実体はクラスごとに1つあればオッケーで、
インスタンスはそれへのポインタが1つ増えるだけで良いとわかりそうなもんだが。
こういうマヌケな事を書いてるところは、その先を読む気もしないわ。

806 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 19:58:03.40 ID:69fUgg/c.net]
>>805辛抱強いじゃんw
俺は
> class Base{
> class Super : public Base{
この名前の次点で素早くギブアップしたw
そこから下は一行も読んでない

807 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 20:27:36.78 ID:pyDKoxXs.net]
関数ポインタがスタックを圧迫wwwおぅえ?w

808 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 21:14:54.44 ID:EoYroDLn.net]
>>806
たしかに真逆とは

809 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 21:36:42.99 ID:QjeDGB/s.net]
こういうアホには
「バカか? ポインタ1個分がスタック圧迫するだと?」
と罵倒できる、ここの方が健全だよね。

810 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 21:42:47.06 ID:69fUgg/c.net]
真逆というかなんというか
Derived : Base
Sub extends Super
って感じかな
だから余計にカオス



811 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 22:10:05.57 ID:z0Cmtt7f.net]
>>803>>805 ありがとうございます
なんだか自信に満ちた書きっぷりだったので、普通にフムフムと読んでしまいました

ただ、仮想関数テーブルは速度の観点でよろしくないことがあるとは聞きます
そういう場合にメタプログラミングで置き換えられないか考える、という感じでしょうか?

812 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 22:11:01.63 ID:d5qzONzB.net]
そのくらいは設計時点でどっち使うか決める
というか見当つけないとやばいような

813 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 22:18:54.46 ID:LUXlk2QR.net]
>>809
真偽は別として、
仮想関数の数だけ関数ポインターを格納したvtableを
すべてのオブジェクトが持つためと書いてあるだろ文盲

814 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 22:25:15.88 ID:BvZrk89z.net]
>>811
仮想関数である事がパフォーマンス上の問題になるケースって、相当少ないから気にしなくて良いよ。
本の1〜2回、ポインタによる間接参照を辿る程度。
そういうのは問題になってから、原因を調査した上で改良すれば良いだけ。
ほとんどの場合、全然関係ないところにボトルネックはあるから、気にしない気にしない。

815 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 22:26:07.60 ID:QjeDGB/s.net]
>>813
少しでも知能があればインスタンスごとに持つ必要がないのは明白であり、
既に>>805で偽であると断じている

死ね、バカ

816 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 22:33:19.79 ID:QjeDGB/s.net]
>>811
二重の間接参照のペナルティはおうけど、それが問題になる局面で仮想メンバ呼ばなけりゃ良いだけの話

件のブログは全く読む気しないが、テンプレートで性能アップなんてのは幻想だと思うよ

817 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 22:45:41.98 ID:1MrQElfZ.net]
>>803
ダックタイピングになっても、動的型付けになるわけじゃないんだから型の安全性は変わらんよ
お前テンプレートメタプログラミングしたことないだろ

818 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 22:50:22.90 ID:LPUWxnLk.net]
>>803
「書かれたコードを呼び出す」とはこれまた曖昧な

819 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 22:53:59.49 ID:bHHjMdz0.net]
関係ないけど、参照もしくはポインタ渡しでなければポリモーフィズムが効かないことを、その
オブジェクトがヒープ上になければいけない、と勘違いしてるやつが以前いた。
放置した。

820 名前:デフォルトの名無しさん mailto:sage [2016/01/13(水) 23:32:42.49 ID:z0Cmtt7f.net]
>>814>>816 ありがとうございます
自分にはメタプログラミングは敷居が高く感じるので、それを聞いて安心しました
だいたい、経験浅いくせに凝ったことやろうとしてもろくなことにならんですよね



821 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 02:21:42.64 ID:87BOzuvC.net]
頑張って最後まで読んでみた。
baseclass->virtual();が遅い、デカイと言いながら
パフォーマンス向上!!と謳ったテンプレートではbaseclass->virtual();が実現できないと記事の最後に書いてあって和ロタ

こういうアホにスペース貸し出すな。qiita

822 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 03:35:19.02 ID:wi7HAYBx.net]
>>813
そもそもそれが真だとしてスタック食い潰すか?
仮想関数でポリモルしたいならポインタで扱う事になるし

823 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 03:49:31.16 ID:87BOzuvC.net]
>>802
> Riyaaaa_a
> 北の方で高専生やってます。 C++でゲーム作ったり、テンプレートメタプログラミングをしたり。
ずいぶん幼稚な思考だと思ったら案の定。

824 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 15:11:12.77 ID:3xoxSYC8.net]
D&E(和訳)読んでふむふむ、とか思ってたのに自分もvtblはインスタンスごとにあると思ってた
何故今までおかしいと思わなかったんだ自分・・・吊ってくるorz

825 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 19:29:33.39 ID:Sio+1GmJ.net]
コンストラクターの実行中は基底クラスの構築が完了する度に仮想関数が変わっていくんだから
インスタンスごとにテーブルを持ってると考えてしまうことはそんなにおかしな発想じゃあない

826 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 19:40:40.78 ID:xs/jHoAF.net]
>>825
便乗質問ですが、
テーブルの作成はクラスの初回のインスタンス化で行われ、
2個目以降のインスタンス化では何もしないということですか?

827 名前:デフォルトの名無しさん [2016/01/14(木) 19:47:12.71 ID:b/ISwWkG.net]
何もしないっていうより無駄がない
つまり共有できるところは共有するということでは(キリッ)

828 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 20:12:29.09 ID:MzRmodn1.net]
>>826
いんや、コンパイル時に作成だよ。

829 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 20:14:56.37 ID:hYstN1PO.net]
chronoでは日付は扱えないようですね。標準で日付を扱える最新ライブラリはどれですか?

830 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 20:56:56.66 ID:wi7HAYBx.net]
>>825
基底クラスの仮想関数が呼び出せないとでも思い込んでなきゃ
そういう発想にはならないと思う



831 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 21:39:02.45 ID:26y3BBuX.net]
お前らポリモなんとかとかバーチャルなんとかとか小難しいことばっか言ってるからそんなんなんだぞ

832 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 21:50:18.45 ID:xs/jHoAF.net]
>>828
ありがとです。一人で変な勘違いしてました
単なるテーブルなんだからコンパイル時に出来上がって当然ですよね

833 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 22:37:12.93 ID:P4SGT366.net]
>>826
初回かどうかは関係なくインスタンスごとにテーブルの初期化が行われるように振る舞う
ideone.com/TyPDhY

834 名前:デフォルトの名無しさん mailto:sage [2016/01/14(木) 23:32:48.35 ID:P4SGT366.net]
>>829
ctime

残念ながらC11のtimespecは使えないので
ミリ秒まで必要ならstd::chronoを組み合わせて使うしかない

835 名前:デフォルトの名無しさん mailto:sage [2016/01/15(金) 07:04:44.57 ID:WQIaqYsW.net]
シンゴー、シンゴー

836 名前:デフォルトの名無しさん mailto:sage [2016/01/17(日) 22:58:32.40 ID:aEwXbHoX.net]
コンストラクト中に呼んじゃ行けないのは純粋仮想関数だけ

837 名前:デフォルトの名無しさん mailto:sage [2016/01/17(日) 23:42:22.64 ID:l2MX1byn.net]
呼べないじゃん

838 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 00:07:48.02 ID:kCdvK5WI.net]
お前らポリモなんとかとかバーチャルなんとかとか小難しいことばっか言ってるからそんなんなんだぞ

839 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 00:20:19.57 ID:PN/aZH6j.net]
うるせーバカ
ピュア・バーチャルな関数があるとコンパイル通らないわ

840 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 00:36:29.76 ID:1IQlXDwz.net]
お前のマイナーなコンパイラーの挙動をエラそうに書かれても
それに間接的似呼ばれている場合はコンパイルエラーにすることが不可能だし



841 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 01:02:18.06 ID:PN/aZH6j.net]
はいはい。難癖つける奴が出てる来ると100%予測してました。

842 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 07:07:28.85 ID:1IQlXDwz.net]
難癖と言うが具体的なコンパイラーの名前を書いて見ろよ
どうせ妄想のコンパイラーだろ?

843 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 09:13:04.59 ID:20Rww3ua.net]
>>834
悩みたくないのでBoostのdate_time使います

844 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 09:55:38.04 ID:PN/aZH6j.net]
>>842
ideone.com/hLWFJG

845 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 10:47:02.69 ID:AVCLJmiz.net]
>>844
> prog.cpp: In constructor 'Kantoka::Kantoka()':
> prog.cpp:13:11: warning: pure virtual 'virtual void Nantoka::nantoka()' called from constructor

"warning" を「コンパイル通らない」と言うかどうか、という点の認識が違うんじゃないかな。
コンパイルは通ると言う人のほうが多いと思うよ。

純粋仮想関数がオーバーライドされてないクラスのインスタンス化できないことについては
たぶん誰も異論は無い。
でもそこはコンストラクタ中の純粋仮想関数呼び出しとは関係ない。

846 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 11:01:49.40 ID:PN/aZH6j.net]
>>845
そういうのを「難癖」と表現しました。
結局インスタンス化できないんだからピュア・バーチャルはコンストラクタから呼べないということには間違いは微塵もないんだが。
あとワーニングはエラー扱いしたほうがいいよ。俺はずっとそうしてる。そうしない奴とは一緒に仕事したくない。

847 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 11:06:03.21 ID:ib6exPCP.net]
>>846
ワーニングかエラーかって言葉の定義の問題だから、スタンスの問題にすり替えられても少々困る。

848 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 11:17:37.56 ID:AVCLJmiz.net]
>>846
もしかして、 Kantoka からさらに派生したクラスで nantoka() をオーバーライドすれば
派生クラスがインスタンス化できる(純粋仮想関数を呼び出す Kantoka のコンストラクタが呼ばれる)のに
気づいてないのかな?

849 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 11:33:19.11 ID:PN/aZH6j.net]
>>848
難癖の上塗り
その場合nantoka()はピュアバーチャルじゃないからw
つかそんなへんてこりんな設計するな

850 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 11:35:23.24 ID:FsCZAz0x.net]
ワーニングwwww



851 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 11:51:13.65 ID:AVCLJmiz.net]
>>849
いや、>848の場合でも>844-845と同じ警告が出るんだけどね。
コンパイラが間違ってるとでも言うの?

852 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 12:11:39.59 ID:5L4n9nSa.net]
基底クラスのコンストラクタの話かと思って読んでたら違った…

853 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 13:02:04.77 ID:HetPa4FB.net]
コンセプトってC++17で入るんですか?

854 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 13:34:41.80 ID:PN/aZH6j.net]
>>848
ideone.com/jJHfvI
試しにやってみたけどリンクエラーになるんですが?結局コンストラクタではピュアバーチャルは呼べない。
>>850
バーカ。お前は難癖野郎未満。

855 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 14:08:04.19 ID:uMGt1p7o.net]
>>854
ideone.com/jFx9uA

856 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 15:39:02.12 ID:PN/aZH6j.net]
あ!

857 名前:デフォルトの名無しさん mailto:sage [2016/01/18(月) 18:16:12.49 ID:IEnSuMyH.net]
ここは怖いインターネットですね

858 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 00:43:10.26 ID:Lt3kNDHx.net]
>>854-856
定義しなけりゃエラー、定義すりゃ動くって話じゃなくて、どっちも未定義動作の結果だから気をつけてな。

859 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 01:28:27.98 ID:tEwpEdlT.net]
0 3 4 8 3 2 3 9 4 2 3 4 ...と続くファイルから一個ずらしの差分をとってどこかに出力する場合、

ifstram ifs {input_file};
ifstream_iterator<int> iite1 {ifs};
ifstream_iterator<int> eos;
ifstream_iterator<int> iite2 {ifs};
ofstream ofs {output_file}
ofstream_iterator<int> oite {ofs};
transform( ++iite1, eos, iite2
 , []( const int& post
   , const int& prev)
  {
    return post - prev;
  }
);

ってやったらダメなんですか? なんか結果がおかしいんですが

860 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 01:40:19.12 ID:tEwpEdlT.net]
あ、ifstream_iteratorじゃなくてistream_iteratorですね



861 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 01:59:26.13 ID:Lt3kNDHx.net]
>>859-860
2つの iite1, iite2 それぞれがインクリメントのたびに ifs >> x するから、
片方をインクリメントしたときに取り出された値はもう片方からは見えなくなる。

たぶん adjacent_difference() さんの出番。
https://www.google.co.jp/search?q=adjacent_difference

862 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 12:28:34.20 ID:I8HE+idC.net]
参照と左辺値の両方を受け取れる関数って作れますか?
ムーブやコピーを使わずに両者を一括で処理できる関数を作りたいのですが。

ideone.com/GAlNj2

863 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 12:40:31.71 ID:LBmPehyf.net]
>>862
結局何をやりたいのかは不明だけど、まずconstを勉強しなさい
ideone.com/OH9KJ8

864 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 12:56:09.58 ID:o3vXp8Uj.net]
>>861
ああこれだと思ったんですが、それの仕様で、最初の一項はそのまま残すってのが、何でこんな風にしちゃったのって思いますね。
要らないなら最初を飛ばせばいいじゃんって思うかもしれませんが、例えば別のクラスからdoubleなんかへ『特定の二項関数を適用した場合のみキャストが定義』されるってケースでは
adjacent_differnceでは最初の一項が単なる代入となってしまうので次元が違うんですよ
具体例を挙げるなら、time pointとtime pointの差でtime durationが定義されるって場合、欲しいのはtime durationのリストなのに、最初の一項を代入が発生すると、それはtime pointだから型が合わないわけです
じゃあ特別に初項のtime pointだけ無理矢理time durationに変換するコードを定義するってなると邪道というかコードが汚れるというか、そもそもそんな定義に正当性はあるのか、とか余計なことを色々考えなければならなくなるので、とにかくなんでこんな仕様にしたのか残念でなりません
点毎の微分係数のリストが欲しいのに初項だけなぜか原始関数が入ってるみたいな感じです

865 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 13:29:59.33 ID:LBmPehyf.net]
それなら最初を捨てればいいだけじゃないの?
初期値が0扱いされてるだけだから正当性もクソもないよ
残念なのは。。。

866 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 14:13:46.61 ID:u5xt7rMo.net]
>>865
出力されるものは、
初項のみ入力型、それ以降は入力型どうしの差の型です。
両者が一致しないならコンパイルエラーになるでしょう?
取り敢えず生成して最初だけ捨てるとか以前にコンパイルでストップするでしょ

867 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 14:31:29.68 ID:I8HE+idC.net]
>訂正
>参照と左辺値の両方を受け取れる関数って作れますか?
>参照と右辺値の両方を受け取れる関数って作れますか?

>>863
まさにこれがやりたかったのです。ありがとうございます。
h関数やmoveの用途に誤解を招くミスがあったので元ソースを修正しておきました。

ideone.com/GAlNj2

868 名前:864 mailto:sage [2016/01/19(火) 16:48:12.65 ID:u5xt7rMo.net]
私と同じ悩みを持っている人により質問がされていて、あれこれ議論されているサイトを見つけました。根本的解決法はないようです。(自分で初項を代入しない版adjacent_defferenceを作るしかないようで、そうするとSTLの最適化メカニズムから外れる可能性があると)
stackoverflow.com/questions/8267806/implicit-transformation-while-calling-stdadjacent-difference

なので、ワークアラウンドとして出力型から入力型への変換関数を書き、無条件でNaNを返すようにしました。
これなら今後意図しないところでうっかり勝手なキャストがされてしまったとしても見つかり易いでしょうから。(本当はそんなキャストをした値など持ち回して、その内比較などした時点でエラーで停まって欲しいんですが)
いずれにせよバグの卵を仕込んだようで気持ち悪いです(感想)

869 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 17:03:44.18 ID:QRF0ukOE.net]
俺ならublasつかってpop_frontしたものからpop_backしたものを引く
正確にはpopはできないからrangeを使うことになるが

870 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 20:30:59.08 ID:I2igp/Hj.net]
そもiostreamの時点で遅いのだから
最適化とか気にしても仕方ない気がするが



871 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 21:30:54.15 ID:LBmPehyf.net]
iostreamのイテレーションでは最適化なんて出来ないだっろ

872 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 22:45:17.98 ID:hRgr/fBZ.net]
int a[][2] = { {1,2}, {3,4} };
の中身を
vector<array<double, 2>> v;
に渡したいんですが、forで回すのではなく1発で渡す方法ってないですか?

873 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 23:07:55.63 ID:xZbak6Ni.net]
intをdoubleに、はないんじゃないかなあ

874 名前:デフォルトの名無しさん mailto:sage [2016/01/19(火) 23:22:51.00 ID:hRgr/fBZ.net]
>>872
しまった、タイポしましたorz

875 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 00:30:15.92 ID:NAm3D3i5.net]
>>872
https://ideone.com/hWx03e

876 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 00:33:42.12 ID:NAm3D3i5.net]
>>864
格好つけないでベタなコード書け
その方が速い

877 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 00:33:42.79 ID:NAm3D3i5.net]
>>864
格好つけないでベタなコード書け
その方が速い

878 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 00:34:38.51 ID:NAm3D3i5.net]
ミスった連投スマヌ

879 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 01:15:07.18 ID:CgeLzYDg.net]
>>875
おお、ありがとうございます
しかしこれは・・・実際使うわけにはいきませんね

880 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 05:48:14.00 ID:t0Y9mTVs.net]
>>877
格好つけてないで ベタなコードだけで
毎日何かを頑張っていりゃ

書いていくんだ それでいいんだ
型に飲み込まれ エラーではじかれて
それでもその手を離さないで
バグがあるんだ みんなあるんだ
解はどこにある 君は休みを取れない



881 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 06:41:42.51 ID:HskUHurd.net]
>>880
なんかメドレーになりそうで嫌だ

882 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 08:39:28.48 ID:NAm3D3i5.net]
ウダウダやってる時間があったら
自分で初期値ありのadjacent_differnceでも作れ
ただ自己満足したいだけなら続けてどうぞ

883 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 21:54:30.21 ID:gq7zZGSJ.net]
CPUって普通の整数に比べて、2のn乗で割るの得意っすか?

884 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 21:54:59.79 ID:Ci1f4cma.net]
整数の種類による

885 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:01:53.08 ID:7pHwgTRU.net]
>>883
まぁ一般的には得意じゃね?

886 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:08:23.19 ID:e8aI9wBz.net]
>>883
シフトより普通の割り算の方が速いCPUやDSPを見たことが無いから、
まあ普通は2のn乗で割るのは得意と言えるでしょう

>>884
整数の種類とは?

887 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:13:49.51 ID:1TVX6yTA.net]
>>886
2の乗数か否か

888 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:15:13.15 ID:LUAhyj75.net]
書くのも簡単だよね
ビットシフトするだけ

889 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:17:22.40 ID:e8aI9wBz.net]
>>887
まあ確かに、
「2の乗数で割るのに比べて2のn乗で割るのが得意」
とは言えないわな

屁理屈

890 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:17:35.51 ID:Ci1f4cma.net]
>>887
日本語読解能力の無い低能は去れ



891 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:19:24.38 ID:e8aI9wBz.net]
シフトより乗算の方が速いCPUはあるから、
割る数が固定であれば割り算の代わりに乗算を行うことで特に得意とは言えないCPUも存在はする

892 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:24:51.80 ID:KVzlV0R1.net]
0初期化はxorだよね!

893 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:27:40.37 ID:e8aI9wBz.net]
subでも

894 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:28:44.12 ID:Ci1f4cma.net]
割り算の話に反応して無条件にビットシフトなどと言い出す低能は
一週間穴にこもるべき

895 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:28:44.83 ID:I6UYKzry.net]
除数がコンパイル時定数で2の階乗ならシフト使うこともあるだろうけど
そうじゃなきゃ割り算命令(または逆数乗算)使うから

896 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:38:02.27 ID:e8aI9wBz.net]
>>894 >>895
コーディング時に2^nだってわかっていれば
プログラマーがシフトに変更できるから普通は速い

明らかな2^nによる除算をシフトに置き換えられるコンパイラが存在するかどうかは知らん
Visual Studio 2015 は無理そう

897 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:42:44.15 ID:e8aI9wBz.net]
>>894 >>895
それから最近の高性能CPUだと、割る数が2^nの場合の除算命令は処理が早く終わるのが普通
スループットが向上しレイテンシも短くなる

instlatx64.atw.hu/

898 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:45:09.29 ID:e8aI9wBz.net]
てことで、
低能は >>894

899 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:54:20.69 ID:e8aI9wBz.net]
同じ割る数による除算がひたすら繰り返されるような処理だと、
2^nかどうか事前に判別して違うコードを走らせるってのも可能だね

>>895
2の階乗って2だけど、2のべき乗の間違いだよね
あと、変なところに誤爆したでしょ?

900 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:56:21.78 ID:I6UYKzry.net]
>>897
>割る数が2^nの場合の除算命令は処理が早く終わるのが普通
例えばそのリストのどれを見ればそれが分かりますか?
ちょっと見たけど分からなかった



901 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 22:58:02.65 ID:I6UYKzry.net]
>>899
そう。べき乗の間違いでした

902 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 23:35:22.15 ID:I6UYKzry.net]
Skylakeで試してみたけど除数が2^nかそうじゃないかでは処理時間に有意な差は見られないなあ

903 名前:デフォルトの名無しさん mailto:sage [2016/01/20(水) 23:49:09.97 ID:Ci1f4cma.net]
>>895
20年前に見たボーランドbccですら
2のべき乗以外の割り算でもシフトが使われるケースは有るのだが
嘘をつく前に生成されたアセンブリコードを確認したらどうだ?

904 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 00:16:53.77 ID:RQbtFNgK.net]
はいはい20年前
割り算命令がそもそも無いとかあってもすごく遅いとかあったからね

905 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 00:21:15.60 ID:0HmD462y.net]
Visual Studio 2015のx64でも
unsigned intの9や10での割り算をシフトを使ったコードに置き換えるというのに

906 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 00:34:21.36 ID:RQbtFNgK.net]
>>905
ホントか?試してみたけどdiv使ってるんだが

907 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 02:50:22.80 ID:RQbtFNgK.net]
どうした?0HmD462y=Ci1f4cma
どういうコードをどういうオプションでVS2015のx64でコンパイルしたら、unsigned intの9や10での割り算をシフトを使ったコードに置き換える
って言うんだ?答えられなけりゃ20年前のbccの件も虚言と見なす
>嘘をつく前に生成されたアセンブリコードを確認したらどうだ?
とか言ったんだからそれくらいは当然だよな?

908 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 07:11:22.26 ID:0HmD462y.net]
>>906
Releaseにしないとdivになる

909 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 07:12:57.80 ID:0HmD462y.net]
ていうか普通のintですら単純な左右シフトじゃなくて複雑な計算になるだろ
int_val / 8
の結果ぐらい確認してないのか

910 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 08:24:59.65 ID:TVvRrwr+.net]
むしろ定数の割り算divを使うことがあるのかと
でhttps://goo.gl/T8WrIL



911 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 09:20:33.26 ID:y+dNRHZw.net]
基本的に長文連投する奴は間違いが多い
まともに確認すらせずに返答するしな

912 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 10:50:16.84 ID:RQbtFNgK.net]
話にならない連中だな
>>908
Releaseでもdivだね
>>909
unsigned intの9や10での割り算って言ってるだろアホ
>>910
定数なんざ問題にしてねーよ
定数ならシフト使うこともあるって俺は>>895で書いた

913 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 11:00:46.87 ID:TVvRrwr+.net]
>>912
それは変数が9か10かを確かめるコードが出るって言ってるのか?
さすがにそんなコードは出ないだろ
unsignedの定数での割り算ならさらに簡単になるだろうしな

914 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 11:05:36.66 ID:RQbtFNgK.net]
あっそうか定数で2^nじゃない場合について言ってたのか
これはとんだ勘違いだった謝る

915 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 11:23:15.37 ID:TVvRrwr+.net]
これはひどい

916 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 13:00:57.22 ID:X8Ey5hke.net]
プログラマには自説を曲げてはならないという掟でもあるの?

917 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 14:02:30.61 ID:y+dNRHZw.net]
大マヌケな発言しちゃって恥かきたくないんだろ
シフト演算とdivじゃ10倍以上の差があるのにな

918 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 14:15:16.66 ID:Ln13efwQ.net]
引数でもらったイテレータから、そのコンテナのメンバ関数を呼び出す方法はありますか?

919 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 14:55:52.13 ID:Ln13efwQ.net]
list か forward_list を受け取ってどっちでも共通に動作するコードって簡単に書けるんでしょうか?
片方はemplace、もう一方は emplace_after だし、挿入位置違ってきますよね。

抽象的に、リンクで繋ぐ系のコンテナを貰って、条件に合うところに幾つか要素を挿入します(listでもforward_listでも結果は同じになります)って関数を自然に書けるものなのでしょうか? それともメタプログラミング必須ですか?

920 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 15:13:19.94 ID:zscSzf1M.net]
今確認してみたけど定数での割算は全部かけ算命令とシフト命令に変換されてるね



921 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 15:21:02.57 ID:F7LwJmHZ.net]
>>919
STL(standard template library)の横断なんだからメタプロ必須
traits一個作るだけ

922 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 15:32:17.65 ID:+1Wa9Hdc.net]
>>916
ほら、傲慢は美徳って言うし…(意味が違います

923 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 16:05:24.51 ID:RQbtFNgK.net]
ぐちゃぐちゃしつこいね
定数の2^n以外の場合については俺が間違いだったことを認めるから
昨日のe8aI9wBzは俺の>>900の質問に答えてくれないかな

924 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 16:16:04.74 ID:RQbtFNgK.net]
>>902に書いた通り
俺I6UYKzry=RQbtFNgKが試してみた限り
Skylakeのdivでは2^nかどうかでは差は見られないんだが
差が出る「最近の高性能CPU」って例えば?是非教えてほしいな

925 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 16:40:30.24 ID:zscSzf1M.net]
2^nかどうかでは変わらないけど割る数によって速さは違った
結果が小さくなる方が速く終わるっぽい

926 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 17:15:24.08 ID:RQbtFNgK.net]
>>925
ちなみにCPUは何ですか?
こっちでは(Skylake+GCC4.8.4)では結果が小さくなるようにしてもdiv系命令使ってる限り差は出ないけど

927 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 17:40:25.35 ID:zscSzf1M.net]
Intel(R) Core(TM)2 Duo CPU P8700

1.c
unsigned int a (unsigned int a)
{
return 1111111 / a;
}

2.c
unsigned int a(unsigned int);
int main ()
{
int i;

for (i = 0; i < 100000000; i++)
a (10000000);
return 0;
}
このコードだとa(1)とか10000000とかが一番速く終わって2が一番遅くなる

928 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 17:44:54.10 ID:zscSzf1M.net]
Intel(R) Atom(TM) CPU N280 @ 1.66GHz
これだと全部同じだった

929 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 18:02:27.03 ID:y+dNRHZw.net]
divを最適化で置き換え直す必要性も16bit以上のdivの速度が一定でない事も
intelの文書に書いてあるよ
知らないにしても他の人みたいに動かして確認すればいいのに何なんだコイツは

930 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 18:05:51.20 ID:Ln13efwQ.net]
forward_list、思ったより使えない
back()やsize()すら無いって・・・



931 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 18:11:37.46 ID:0O01DQba.net]
テンプレートメタプログラミングのテストってどうやってますか?

932 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 18:43:50.40 ID:E9KCKHCx.net]
>>916
そのような自説を持ってるのはQだけです

だが最後に自分の誤りを認識した時点で素直に謝れるメンタル だ け は凄いと思うわ

933 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2016/01/21(木) 18:55:00.91 ID:ypubXGFS.net]
>>931
static_assert使え

934 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 19:27:35.76 ID:Ln13efwQ.net]
>>921
メタプロはまだぼくには早いなぁ

935 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 19:41:52.93 ID:hKcolSLC.net]
weak_ptrってlock()して有効かどうかをif文とかで調べてから使うのが正しい使い方ですよね。
つい面倒なので wp.lock()->hoge() と横着しちゃうんですが、いつか痛い目みそうな予感がします。
上手い具合に何とかする方法ないでしょうか?

936 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2016/01/21(木) 19:45:22.06 ID:ypubXGFS.net]
if (auto ptr = a.lock())
{
...
}

937 名前:デフォルトの名無しさん mailto:age [2016/01/21(木) 20:09:41.71 ID:ypubXGFS.net]
あげ

938 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 20:34:19.36 ID:LqtdmCnC.net]
>>930
size( ) はまだしも back( ) のためのポインタケチるためのものだし、当たり前だろ

939 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 21:59:56.82 ID:Ln13efwQ.net]
ミニマlist

940 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 23:10:02.14 ID:H8Alaf9u.net]
>>936
>if (auto ptr = a.lock())

copy elisionが期待できるとしても無駄なコピー/ムーブが
発生しうる書き方はどうも落ち着かない。
auto &&と書きたくなってくる。



941 名前:デフォルトの名無しさん mailto:sage [2016/01/21(木) 23:35:41.37 ID:ySY5R7YZ.net]
えっ

942 名前:デフォルトの名無しさん [2016/01/22(金) 06:57:40.42 ID:xsHc+uK/.net]
weakの生存チェックが必要ならsharedにしたら

943 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 07:49:31.44 ID:KaWUxaNQ.net]
>>942
そんなどこぞの女王みたいな事言ってたら、デストラクタが暴動を起こすぞヽ(^。^)ノ

944 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 07:54:12.64 ID:nKA5Ublh.net]
↑馬鹿

945 名前:935 mailto:sage [2016/01/22(金) 10:14:57.31 ID:5LnUGiwJ.net]
>>936
今までそうしてきました。
elseの中でどのクラスのどの関数なのかエラーメッセージを出したりしてたんですが、
面倒臭くなって質問した次第です。

946 名前:935 mailto:sage [2016/01/22(金) 10:17:26.65 ID:5LnUGiwJ.net]
>>942
クラスで互いに参照を持たせたいんでweak_ptrも必要なんです

947 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 18:21:29.83 ID:iI4n/Grb.net]
話を聞いている限り子にsharedで親にweakもたせる案件のような気が

948 名前:935 mailto:sage [2016/01/22(金) 20:25:00.39 ID:5LnUGiwJ.net]
親と子というのはそれぞれ管理する側と管理される側のことですか?
相互参照させる場合、前者は後者への強参照を、後者は前者への弱参照を
メンバとして持つのが普通だと思ってたのですが、もしかして逆なんですか?

949 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 21:19:55.44 ID:gy9aPLY5.net]
>>948
それだと親が生きてる限り子への参照が無くならない。
明示的に子の削除をしなければならなくなる。
>>947なら子への参照が無くなればその子は消える。
全ての子が消えれば親も自動的に消える。

950 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 21:59:23.10 ID:9qqofano.net]
子が生きている間は親も生きていると考えるのが普通だから
子が親のweak_ptrを持つのはあまり旨みがないというか、生ポインタでも良いんじゃね?ってなる



951 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 22:06:48.94 ID:9qqofano.net]
weak_ptrからshared_ptrを生成できるので
子が親のshared_ptrを他のオブジェクトに渡すとかという場面で
生ポインタじゃなく、子が親のweak_ptrを持つのも一応意味があるっちゃあるが
逆の方が何かと都合がよいことが多いのだ

なにせ子が生きている間は親も生きているわけだろうから
親をweak_ptrで持っていてもnull_ptrが返ってくることは無いので

952 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 22:10:32.65 ID:63yfy9By.net]
cpp-lang.sevendays-study.com/problemex4.html
このサイトの問題4.4で、何も入力せずenterを押すと入力を終えるの部分をどうやれば作るか教えて下さい
while (1) {
cin >> a;
if (a.length()==0) {
break;
}
このように入力した文字をaにいれてaの長さが0ならループを抜けるようにしたのですがうまくいきません

953 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 22:17:40.62 ID:fbzf1CVx.net]
改行文字にすりゃええやん

954 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 22:26:02.40 ID:63yfy9By.net]
>>953
改行文字とはendlのことですか?
判定する所でa==endl としてもエラーが出ます

955 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 22:33:49.62 ID:iI4n/Grb.net]
>>948
依存性が逆に見えたから言ってみただけ
Observerパターンなら親がweak持てばいいけど違うなら逆じゃないよん
循環参照は機能分割が不十分な事による設計ミスのが多いよ

956 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 22:42:11.03 ID:BMlJwOmj.net]
親子の関係にshared_ptr,weak_ptrを
持ち出すあたりが既に設計の誤りの可能性大。
というかshared_ptr使ったコードは高確率で糞コード。

957 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 22:45:56.01 ID:iI4n/Grb.net]
>>952 >>954
string str;
while( getline(cin,str) && str.length() ){
 処理
}

958 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 22:58:26.71 ID:63yfy9By.net]
>>957
すみません、よくわかりません
getline関数はこのサイトでまだ扱ってないので使い方がわからないのと、どうしてそのコードで入力が空白かどうか判定できるのでしょうか?

959 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 23:06:21.99 ID:iI4n/Grb.net]
>>958
getline(cin,str) // cinの入力を一行strに取り込む(改行文字なし)、失敗で偽
str.length() // 1文字以上なら真、0文字なら偽

このスレは怖い人がいっぱいいるから質問するなら下のにしなさい

【初心者歓迎】C/C++室 Ver.97【環境依存OK】
peace.2ch.net/test/read.cgi/tech/1439849418/l50

960 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 23:12:12.68 ID:PuO012nm.net]
>このスレは怖い人がいっぱいいるから
一番攻撃的なのはお前なんだが



961 名前:デフォルトの名無しさん mailto:sage [2016/01/22(金) 23:28:13.82 ID:63yfy9By.net]
>>959
理解できました。
ありがとうございます

962 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 00:09:49.18 ID:oOoz6Peh.net]
>>960
ずいぶん攻撃的だねえ・・・

963 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 00:10:09.38 ID:ACxJywqs.net]
インテルのやつはビットシフトよりテーブルにした方が速い、
希ガス

964 名前:935 mailto:sage [2016/01/23(土) 00:54:21.22 ID:M1o1eQTV.net]
>>956を見てハッとしました。たぶん、いや確実に今書いてるコードは糞なんだと思います。
この糞コードを書いたときの流れはこんな感じでした。

クラスもインスタンスもたくさんあってメモリリーク怖いから、とりあえずインスタンス化には
スマートポインタshared_ptr使っとこう。
 ↓
そういえばクラス関係は 国→県→市→番地 みたいな階層構造になってるんだった。
(左側クラスは右側クラスを複数含む)
 ↓
じゃあメンバでvector<shared_ptr<class>を持たせよう。
 ↓
逆方向 国←県←市←番地 にものアクセス欲しいな。
 ↓
shared_ptrメンバじゃ循環参照になってしまうから、weak_ptrメンバにしとくか。
 ↓
weak_ptrいちいちlock()すんのめんどくせー。
 ↓
>>935に至る。

まぁ事実まともな設計とか全くしたことない素人なんですが、改めて書き下してみると酷いな・・・

965 名前:935 mailto:sage [2016/01/23(土) 00:59:37.64 ID:M1o1eQTV.net]
今一度足りない頭でクラスの所有関係と各クラスが持つべきメンバについて
考えてみたのですが、こんな感じで合ってるでしょうか?

親クラス(管理側)をP、子クラス(非管理側)をCとして、
@PはCをメンバとして所有する。複数所有したいならvector<C>とする。
ACはPへアクセスする必要があるなら、Pへの参照メンバを持たせる。
BPのvector<C>メンバの並び順をCの内部状態によって変えたいなら、vectorではなくlistにする。

Bが正しいか気になります。

966 名前:935 mailto:sage [2016/01/23(土) 01:03:44.65 ID:M1o1eQTV.net]
ここまで考えて思ったのですが、クラスメンバにスマートポインタがあるのは所有関係を
きちんと考えていない、つまり設計が不十分な可能性を疑うべき、ということでしょうか。
>>955さんの
>循環参照は機能分割が不十分な事による設計ミスのが多いよ
や、>>956さんの
>というかshared_ptr使ったコードは高確率で糞コード。
はそういう意味だったんですかね。

そうするとスマートポインタが主として登場すべき場面とは、関数内でテンポラリ的にインスタンスを作り
それを他の関数に渡す等のごにょごにょした作業をしたいときなんでしょうかね?

なんかレスが多くなってすみませんが、指導していただけると助かります。

967 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 02:07:22.97 ID:ACxJywqs.net]
このスレは荒れる…!

現実のアーキテクチャで走るプログラムは
(1) アルゴリズムと、(2)データ構造と、(3)スレッド間通信
からなる

このうち、(1)はの範囲は処理の順序が命なのであって、
設計完了=処理の順序が明らか、ということなので設計完了したならばスマポの出番など無い

一方(3)は、スレッドAからスレッドBにデータを渡しっぱなしにできたら
同期化が簡単になって無駄な実行時コストも抑えられるからスマポの出番と言える
ていうかimmutableなオブジェクトを他のスレッドで破棄させるケースぐらいしか
スマポの使用は正当化されない

残りの(2)は、(1)に属することもあれば(2)に属することもある
(スマポ自体のデータ構造とか、カーネル内のデータ構造とかは(2)の範疇
スマポ自体の是非とは関係ないので省略

968 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 02:09:35.49 ID:oOoz6Peh.net]
>>964-965
循環参照のミスというのは同層のことで、親子のただの相互参照は一般的だよ
Bは速度がいらないならvector、他はそんなに問題あるとは思えない
weak_ptrのエラー分岐が億劫ならマクロにしたらというぐらい

人に教える程の立場でもないのでこれぐらいにしておきます

969 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 02:12:14.42 ID:ACxJywqs.net]
訂正;
誤:残りの(2)は、(1)に属することもあれば(2)に属することもある
  (スマポ自体のデータ構造とか、カーネル内のデータ構造とかは(2)の範疇
正:残りの(2)は、(1)に属することもあれば(3)に属することもある
  (スマポ自体のデータ構造とか、カーネル内のデータ構造とかは(3)の範疇

あと補足で、std::unique_ptr<T>は(1)の範疇でも実装上のテクニックとして多用することもあるが
あんまり賢くないのでここではスマポに含めないものとする、

970 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 06:32:51.71 ID:9P3xRRKy.net]
>>964
shared_ptrを使うのはその名の通り特定のオブジェクトによる所有や集約の関係ではない場合、生存期間の管理が疎結合の場合に使う
国の知らない間に一部の市が消えることがあるか?
市より先に国が消えることがあるか?
国→県→市→番地 なら多くの場合は「国が複数の県を所有または県は国に集約」のパターンになることが多い



971 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 08:02:49.16 ID:+qmFdC28.net]
スマポって作ったオブジェクトをいずれ殺さなきゃならないときに使うイメージだわ
殺す必要がない(vectorのメンバとして作られるからあとで自動で死ぬとか)なら子が持つ親のポインタはスマポじゃなくて生ポインタでいいんじゃない?
ポインタじゃなくて参照型のメンバ変数持ってルートノードは自分への参照でもいいけど、==演算子のオーバーロードは面倒くさそうだし結局親ノードの判定にポインタの比較しそうな気がするわ

972 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 10:58:19.45 ID:xWQTZZB9.net]
抜き身の刀だらけの相談室

973 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 11:41:45.07 ID:2xi+SZqr.net]
『一つのパーティションにつき一つの要素のみ』って英語のコメントでどう書けばいいですか?
// Only one element by one partition.
前置詞わかんないです><

974 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 11:56:10.39 ID:BpJ08GBs.net]
// the each partitions only has one element.
自信ない

975 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 12:05:54.61 ID:bbKQS1co.net]
// one element == one partition
// A partition has only one element
// Only one element for(in) each partition

// At most one element can be appeared in each partition
// A partition has at most one element
// Multiple elements are prohibited in a partition

// 一つのパーティションに一つの要素だ。日本語も読めない馬鹿はクソして寝ろ

976 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 12:32:51.86 ID:Tt4ej2Ee.net]
パーティションてのは区画じゃなくその仕切りのことを言うわけだが、間違いだよな?
Only one element in one section

977 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 12:40:10.50 ID:9P3xRRKy.net]
>パーティションてのは区画じゃなくその仕切りのことを言うわけだが
いえそれはパーティションでなくpartitionです
用語と一般名詞の区別ぐらいはした方がいい

978 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 12:42:14.32 ID:Tt4ej2Ee.net]
>>977
働くならパーティションのある会社の方がいいぞ?

979 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 12:44:29.00 ID:VPAh/uPo.net]
Only one element is for each patition.

980 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 12:44:52.04 ID:9P3xRRKy.net]
なるほど
文脈を読まずに単語レベルで反応してしまったんだろうな



981 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 12:48:38.88 ID:Tt4ej2Ee.net]
一般名詞とか言っててそれか
頭大丈夫か?

982 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 12:48:39.35 ID:ZeOvtoAd.net]
スレ違いなのでよそでやれ。

983 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 13:42:00.33 ID:7KDEJB/l.net]
C++こそ至高の頂

984 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 13:43:05.61 ID:7KDEJB/l.net]
バカの壁を突破できんと使いこなせんのよ

985 名前:964 mailto:sage [2016/01/23(土) 14:42:34.05 ID:M1o1eQTV.net]
>>967>>968>>970
ありがとうございます。さっそく糞コードを修正します。
いやはやとんでもない勘違いをしていた・・・

986 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 16:52:12.93 ID:2O2OeDHJ.net]
std::partition_pointやで!!

987 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 19:41:20.94 ID:2xi+SZqr.net]
なるほど、partitioned rangeが正しい英語ですね
Only one element can belong to each partitioned range.
こうかな

988 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 19:50:19.75 ID:MQWxukSB.net]
one element is in the only one patitioned range.

989 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 20:00:22.29 ID:xc9KTHaP.net]
さあw patitioned rangeなんて表現聞いたこと無いんだが

990 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 20:07:07.21 ID:xc9KTHaP.net]
patitionってもともとrange的な意味を含んでるから
仕様上でpatitionの意味がはっきりしてればわざわざrangeつけるのは普通の表現としてはクドい
『一つのパーティションにつき一つの要素のみ』なら
each partition can have only one element.
とかでいいんじゃないか?



991 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 20:24:11.82 ID:xc9KTHaP.net]
std::partition_pointとかの説明で出てくるpatitioned rangeって
「patitioned(部分集合化)されたrange」のことだからな
>>973のいうパーティーションはそれぞれの部分集合のことだろ

992 名前:973 mailto:sage [2016/01/23(土) 20:30:47.80 ID:2xi+SZqr.net]
>>990
ありがとうございました。この問題は対話を通じ、双方が同意できる恒久的な解決がなされました。

993 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 21:46:41.75 ID:2O2OeDHJ.net]
恒久的な解決といっても何がどう恒久なんだかようわからん国もあるけどな。

994 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 21:52:02.81 ID:xc9KTHaP.net]
1つのパーティションに0個の要素っていうのがあり得るのかどうかでも表現は変わってくるわな

995 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 23:04:39.12 ID:HdItgJjm.net]
ジスレ立てますか

996 名前:デフォルトの名無しさん mailto:sage [2016/01/23(土) 23:16:08.61 ID:HdItgJjm.net]
C++相談室 part122
peace.2ch.net/test/read.cgi/tech/1453557975/

997 名前:デフォルトの名無しさん mailto:sage [2016/01/24(日) 00:03:08.58 ID:XILi4z/P.net]
>>993
おっとQの悪口はそこまでだ

998 名前:デフォルトの名無しさん mailto:sage [2016/01/24(日) 00:18:02.59 ID:ZhXA5MpP.net]
plam

999 名前:デフォルトの名無しさん mailto:sage [2016/01/24(日) 01:39:42.78 ID:+srqsch5.net]
999

1000 名前:デフォルトの名無しさん mailto:sage [2016/01/24(日) 04:52:41.80 ID:vt7CmcBy.net]
1000 イタダキ!



1001 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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