2ちゃんねる★スマホ版★■掲示板に戻る■全部1-最新50
レス数が900を超えています。1000を超えると表\示できなくなるよ。

C++相談室 part129 [無断転載禁止]©2ch.net

1 :
2017/01/09(月) 14:49:27.56 ID:p96WJVyd0
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part128
http://echo.2ch.net/test/read.cgi/tech/1480172629/

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

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2 :
2017/01/09(月) 16:53:24.81 ID:FJMj93WYK
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

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

---- テンプレ ここまで ----
3 :
2017/01/09(月) 16:56:41.17 ID:jVBRIf3C0
これは>>1乙じゃなくてシフト演算子なんだからね
4 :
2017/01/09(月) 17:39:43.46 ID:MgtRKFl00
ご苦労!
5 :
2017/01/09(月) 17:40:19.60 ID:s0WlKSpH0
これは>>1じゃなくてストリームへの入力なんだからね
6 :
デフォルトの名無しさん (ワッチョイ df98-S/j3)
2017/01/09(月) 20:32:19.17 ID:IZbe/h670
catch(>>1& err)
{
err << "うむ、ご苦労";
}
7 :
2017/01/09(月) 20:48:55.53 ID:NzCLpVsYr
>>2
ゴミを貼るなボケ
8 :
2017/01/09(月) 20:57:29.53 ID:FJMj93WYK
へへへっ
9 :
デフォルトの名無しさん (ワッチョイ fb04-nASw)
2017/01/09(月) 22:45:37.43 ID:cNtoCjW40
グローバルなstatic変数は(コンパイル単位が違うと)初期化タイミングが不定だから使うな
みたいな話がありますが、これはクラスメンバのstatic変数でも同じでしょうか。

やはり定番のローカルなstatic変数の参照を返すのがベストでしょうか?
10 :
2017/01/09(月) 23:42:53.87 ID:YmMsaSRh0
static int a = f();
 ↓
static int &get_unko() {
 static int a = f();
 return a;
}

問題解決になるとは到底思えない
ちなみにクラスの静的メンバーでも同じ
11 :
デフォルトの名無しさん (ワッチョイ 1b7b-p/5D)
2017/01/10(火) 00:09:01.54 ID:qNfJPVUt0
>>9
ベストは静的な寿命をもつ変数が別の静的な寿命を持つ変数を参照するような設計にしないこと
やむを得ずそうなる場合はローカルなstatic変数の参照を返す方法がベター
しかしそれも構築は初めて呼ばれた時になるが、破棄の順が不定なのは変わらずだから注意
12 :
2017/01/10(火) 00:34:11.81 ID:kCG+Vhkl0
>>11
破棄準は構築と逆順になるよ。 [basic.start.term]
13 :
デフォルトの名無しさん (ワッチョイ 1b7b-p/5D)
2017/01/10(火) 01:22:55.56 ID:qNfJPVUt0
>>12
ホンマやね
メモリ上の配置と関係なしに構築した順番覚えてるのな。
14 :
デフォルトの名無しさん (ワッチョイ 0f33-Flmg)
2017/01/10(火) 02:41:10.58 ID:YALu2HFR0
しかし、関数内で定義したstatic変数ってどうやって「一度のみ初期化」を実現してるんだろう?
規格上の明記は無いよね?

もし、コード上に初期化フラグ的なものを保持して毎回判定してるのだとしたら、単純なグローバル変数よりアクセス遅くなるのかな?
15 :
2017/01/10(火) 03:28:04.72 ID:kCG+Vhkl0
>>14
気になるならアセンブリ出力を見ればいい。 https://godbolt.org/g/Rp3mVk
効率は実測でどうぞ。
16 :
2017/01/10(火) 03:42:52.33 ID:N3Ngq+Oq0
江添は何て言ってる?
17 :
2017/01/10(火) 04:16:44.71 ID:UGgokZQL0
規格オタクの江添に実装のことを聞いてどうするのか
18 :
2017/01/10(火) 07:19:19.96 ID:xRFVWFBm0
>>17
規格上明記は無いのではという>>14の疑問に対して>>16のレスだろうから、実装は関係ないでしょ。
19 :
2017/01/10(火) 08:35:32.37 ID:WWXPDPHuM
>>14
スコープが違うだけだろ
フラグとか意味わからん
20 :
デフォルトの名無しさん (ワッチョイ 0f33-Flmg)
2017/01/10(火) 09:01:12.67 ID:YALu2HFR0
>>18
主要な実装がどうなっているのか気になりますねー。
21 :
デフォルトの名無しさん (ワッチョイ 0f33-Flmg)
2017/01/10(火) 09:03:05.70 ID:YALu2HFR0
>>19
関数内の場合は初期化タイミングが明確にされている部分が違うよね?
22 :
デフォルトの名無しさん (スプッッ Sdff-5duh)
2017/01/10(火) 09:17:26.16 ID:Kh8Jpf0Qd
静的ローカル変数のデストラクタはどうやって呼び出してるんですか
コンパイル時には順番決まらないですよね
23 :
2017/01/10(火) 10:17:49.42 ID:KPiaZgHCM
>>22
生成された順にデストラクタスタックに積んどきゃええだけやろ
24 :
2017/01/10(火) 21:06:37.99 ID:aZrJHKL80
>>14
マルチスレッド下でも1度だけ初期化しなけりゃならないのでややこしいことをやってる
25 :
2017/01/10(火) 21:27:26.24 ID:A8TeocJX0
スレッドセーフな点がありがたいと思っているんだが
26 :
2017/01/11(水) 09:57:17.96 ID:kJf5mE6d0
その意味で、どのスレッドが最初に呼び出して初期化するか
分からないっていう怖さは有るがな
スレッドに紐づくようなものを初期化するのはNGだ
(COMであるとかウィンドウであるとか)
もしくはプログラムの最初で明示的にメインスレッドから呼び出して初期化しておくか
スレッド間でシェアする必要がなければTLSにしておくか
27 :
デフォルトの名無しさん (ワッチョイ df98-S/j3)
2017/01/11(水) 11:52:08.85 ID:z2RHK6s+0
最初からいきなりマルチスレッドなわけじゃなし
mutexやatomicでどうにでもできるでしょ
28 :
2017/01/11(水) 12:30:02.49 ID:kJf5mE6d0
関数内で定義したstatic変数を初期化するスレッドをメインスレッドなどに制限するのを
>mutexやatomic
でどうやって解決するのか熱く語ってもらおうか
29 :
デフォルトの名無しさん (ワッチョイ df98-S/j3)
2017/01/11(水) 12:37:09.06 ID:z2RHK6s+0
質問の意味がわからんぞ
30 :
2017/01/11(水) 12:37:52.47 ID:ZhOyh3uTr
>>26
>スレッドに紐づくようなものを初期化するのはNGだ

いきなりお題改変乙
グローバルに置くんだからスレッド間で共有したい場合の話に決まってるのに
31 :
2017/01/11(水) 12:53:45.95 ID:kJf5mE6d0
>>29
お前が
>mutexやatomic
って言ったんだろ
いっとくが排他制御の話など誰もしてないぞ
世の中には生成されたスレッドに紐づいてしまうオブジェクトというものがあって
Windowsのウィンドウであれば、生成されたスレッドのメッセージキューで
メッセージポンプを回すことになるし
COMは生成されたスレッドのアパートメントで一生を過ごす
どのスレッドで初期化されたかが重要になるオブジェクトもあるってこった
そして関数内static変数は最初に呼び出したスレッドで初期化処理が走る
この問題をお前は >mutexやatomic で解決するんだろ?
さあ、熱く語れ

>>30
スレッドに紐づくようなもの(WindowsのCOMやウィンドウ)を
関数内で定義したstatic変数で初期化するのはNG
→スレッドに紐づかないものであればOK、スレッド間で共有もできる

何がお題変更なの?
グローバル変数やシングルトンに関数内static変数は便利だけど
相性が悪いものもあるって話なのに
32 :
デフォルトの名無しさん (ワッチョイ df17-pn3f)
2017/01/11(水) 14:03:34.54 ID:9AYGk8zp0
static変数を考える場合、このスレ的にはC++11から導入された thread_local を無視できないでしょ。

スレッド局所記憶(英: Thread local storage, TLS)
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E5%B1%80%E6%89%80%E8%A8%98%E6%86%B6
33 :
2017/01/11(水) 15:00:37.89 ID:ZhOyh3uTr
>>31
>何がお題変更なの?
相性が悪いものの話なんかしてねーし
スレッド間で共有したい変数の話の最中に
「スレッド間でシェアする必要がなければTLS」とか力説し始めて
アホなの?
34 :
デフォルトの名無しさん (ワッチョイ df98-S/j3)
2017/01/11(水) 15:51:10.26 ID:z2RHK6s+0
同感
35 :
2017/01/11(水) 15:53:31.57 ID:kJf5mE6d0
相性が悪いものがあるっていう書き込みをして何が悪いんだ?

>スレッド間で共有したい変数の話の最中に

それはお前が勝手に決めたことだろ
元々あくまで関数内static変数の初期化がスレッドセーフになっているというだけの話であり
本質的にロジックとして変数をスレッド間で共有する必要が有るのか無いのかまでは関係ないだろ
本質的にスレッド間で共有する必要がない場合はTLSに変更することもできる
ってだけの話で
そのほうがパフォーマンスが出る場合もある
36 :
2017/01/11(水) 16:34:37.80 ID:ZhOyh3uTr
static変数ってどうやって〜を実現してるんだろう?
 ↓
MT保証で複雑なことしてる
 ↓
そのstatic、ホントに必要ですか?
 ↓
いきなり何を言いだすの
 ↓
本質的にロジックとして変数をスレッド間で共有する必要が有るのか無いのかまでは話してないからな←今ここ
37 :
2017/01/11(水) 16:47:40.32 ID:kJf5mE6d0
>そのstatic、ホントに必要ですか?

スレッドローカル関数内static変数の事すら理解していないのがよく分かった
38 :
2017/01/11(水) 17:27:25.47 ID:7JGhXUMg0
>>27
どのような状況で呼び出されても確実に一回だけ初期化する事が要求されている
mutexは初期化する必要があるから役に立たん
39 :
2017/01/11(水) 17:41:25.81 ID:9AYGk8zp0
IDが見えるスレッドなのに、ひとりの相手とやりとりしている錯覚に陥った ID:ZhOyh3uTr 氏は失礼ながら、精神疾患の兆候があるかも。
40 :
デフォルトの名無しさん (ワッチョイ df98-S/j3)
2017/01/11(水) 18:35:56.09 ID:z2RHK6s+0
俺は一言もstaticとは言ってないし
mutexとatomic「だけで」とも言ってないのに
人の話の前提条件を勝手にでっち上げて叩く
ストローマンに辟易としちまった
41 :
2017/01/11(水) 18:45:08.90 ID:7JGhXUMg0
>>26まではstatic変数(特に関数内)の初期化の話をしてたのに、知ったかぶって参加しようとしたID:z2RHK6s+0がグチャグチャにしたって事か
42 :
2017/01/11(水) 18:48:17.00 ID:wUdtm8ww0
いつもながらのぐちゃぐちゃ展開
それがこのスレの醍醐味
43 :
2017/01/11(水) 20:16:24.69 ID:wUdtm8ww0
>さあ、熱く語れ
>どうやって解決するのか熱く語ってもらおうか

どちらかというと>>26あたりからおかしくなったようだ
クスリでもやっているのか、>>28あたりは何か幻覚を見たのではないかと
44 :
2017/01/11(水) 21:00:46.12 ID:7JGhXUMg0
具体的な例はないけど、作成したスレッドはRW、それ以外はROなんてのもありうるわけで
「スレッドに紐付付いてるのは共有するな」は受け入れ難い
と考えると、これをstatic変数の初期化に使うのは要注意と言う指摘は一理はあるかと
45 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/12(木) 15:07:52.74 ID:8CizHZGj0
>>38
ひんとstd::mutexのコンストラクタはconstexpr修飾されてる
46 :
2017/01/12(木) 15:28:40.45 ID:sAPGeyQI0
>>45
std::mutexってランタイムライブラリじゃ無いだろ
47 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/13(金) 00:15:44.24 ID:nVxQCvXm0
>>46
ちょっと何言ってるのかわからないから誰か解説者よろ
48 :
2017/01/13(金) 10:28:33.20 ID:VKtyxMUH0
>>47
なんだ、そこからかよ
static変数の初期化の話題だってわかってる?
49 :
2017/01/13(金) 10:37:18.84 ID:7CvKX7vR0
ぜんぜん話が見えてこない
50 :
2017/01/13(金) 12:28:56.30 ID:LkImdLNRM
>>48
関数内のstatic変数だろ。
51 :
デフォルトの名無しさん (ワンミングク MMe2-dqLr)
2017/01/13(金) 12:56:57.82 ID:kKg87s4oM
>>48
それとランタイムライブラリが何って?
52 :
2017/01/13(金) 13:13:35.85 ID:y8BGYaW90
ランタイムライブラリじゃない = ヘッダーファイルのみでOk
という意味に、私は解釈したんだがほかの人は道南?
53 :
デフォルトの名無しさん (ワンミングク MMe2-dqLr)
2017/01/13(金) 13:16:53.58 ID:kKg87s4oM
>>52
それが>>45へのレスとしてつながる?
54 :
2017/01/13(金) 17:12:37.37 ID:76Aeg2JY0
ランタイムライブラリが通じなかった?
llvmで言うところのcompiler-rtだよ
55 :
デフォルトの名無しさん (ワンミングク MMe2-dqLr)
2017/01/13(金) 18:02:07.52 ID:kKg87s4oM
>>54
それが?
56 :
2017/01/13(金) 18:31:46.73 ID:76Aeg2JY0
>>55
これで何がわからない?
57 :
デフォルトの名無しさん (ワンミングク MMe2-dqLr)
2017/01/13(金) 18:45:44.38 ID:kKg87s4oM
58 :
2017/01/13(金) 18:49:34.49 ID:76Aeg2JY0
>>57
llvmで言うところのcompiler-rtって理解してる?
59 :
デフォルトの名無しさん (ワンミングク MMe2-dqLr)
2017/01/13(金) 18:55:22.83 ID:kKg87s4oM
>>58
うん。
それとstd::mutexのコンストラクタがconstexprだということの関連性がわからん
60 :
2017/01/13(金) 19:03:56.40 ID:76Aeg2JY0
>>59
じゃ、static変数の初期化の排他制御にstd::mutexを使うと言うお笑い提案に付いては?
61 :
デフォルトの名無しさん (ワンミングク MMe2-dqLr)
2017/01/13(金) 19:08:40.80 ID:kKg87s4oM
>>60
規格上は別に問題ないんじゃない?
62 :
デフォルトの名無しさん (ワッチョイ 3298-los8)
2017/01/13(金) 19:14:15.66 ID:LnYnqLIL0
>>60=28
ストローマンまだ粘着してたのか
63 :
2017/01/13(金) 19:24:27.07 ID:weu0eN0Dr
>>60
まだやってんのかよ
バカに構うと時間を損するだけだぞ
64 :
2017/01/13(金) 19:57:05.24 ID:76Aeg2JY0
>>61
constexprを理解してないのか
もう一回規格読んでから出直しなよ
重要なところは3.6.2だぞ

>>62
理解できないからって、おかしな捏造してごまかすのはやめたまえ
65 :
デフォルトの名無しさん (ワントンキン MMe2-dqLr)
2017/01/13(金) 20:13:13.38 ID:8qb1acaCM
66 :
2017/01/13(金) 20:15:51.46 ID:76Aeg2JY0
>>65
だから、何?
67 :
2017/01/13(金) 20:19:22.63 ID:76Aeg2JY0
>>65
それのどこをどうよ読むと
static変数の初期化の排他制御にstd::mutexを使えると言うお笑い提案が出てくるんだ?
68 :
デフォルトの名無しさん (ワントンキン MMe2-dqLr)
2017/01/13(金) 20:22:34.22 ID:8qb1acaCM
>>67
他のスレッドより先に初期化されることが保証されているんだから排他に使えるでしょ。
まさに例で書かれてるんだけどコード読めないの?
69 :
デフォルトの名無しさん (ワントンキン MMe2-dqLr)
2017/01/13(金) 20:38:51.43 ID:8qb1acaCM
ランタイムライブラリがどう関係してくるのか一つも説明ないんだけど、どういう事なの?
70 :
2017/01/13(金) 20:46:26.83 ID:nYJUER3p0
お願いします.

C::a, C::b を protected のままにしたいのですが,どうしても public を要求されます.
なぜなのでしょうか
http://ideone.com/x3ymxM
71 :
2017/01/13(金) 20:51:50.76 ID:daPh3nWD0
>>70
なんか色々言いたくなるけど
とりあえずmyabsがfriendじゃないから要求されてるんじゃ?
72 :
2017/01/13(金) 20:53:38.14 ID:daPh3nWD0
>>70
ってエラーにそう書いてあるやん
73 :
2017/01/13(金) 21:06:18.40 ID:nYJUER3p0
すみません.ありがとうございます.
http://ideone.com/BhdBHO

他になにかいろいろまずいところがあるんですね.
お手を煩わすようで恐縮ですがコメントいただけないでしょうか.
よろしくお願いいたします.
74 :
2017/01/13(金) 21:12:36.47 ID:eTv8M5MG0
>>73
明らかにfriend不要になったでしょ
比較クラスが比較対象を継承してるのも意味不明
意味わからずコード書いてる感じがするから勉強し直したほうが良い気がする
75 :
デフォルトの名無しさん (ワッチョイ c621-q48i)
2017/01/13(金) 21:30:49.97 ID:AzvsCcDE0
すごいコードだ
76 :
2017/01/13(金) 22:09:13.50 ID:nYJUER3p0
>>74
ありがとうございます.
確かに例示としては
http://ideone.com/Hi50Xi
で十分でした.

しかし次の場合はどうでしょうか?
不適当とは思いながら CCompare を C の継承としましたが,それでも protected がききません.
http://ideone.com/XJbnUo

http://echo.2ch.net/test/read.cgi/tech/1480579110/96
を書いている際にぶつかった問題です.
よろしくお願いいたします.
77 :
2017/01/13(金) 22:20:31.99 ID:76Aeg2JY0
ああ、わかって来たぞ
void func()
{
static std::mutex mtx; // ←これ
...
}
このmtxの初期化を排他制御するために、非ローカルなstd::mutex生成して使うと言うお笑い提案か
目の付けどころが鴻海過ぎる
78 :
デフォルトの名無しさん (ワントンキン MMe2-dqLr)
2017/01/13(金) 22:34:28.85 ID:8qb1acaCM
>>77
何言ってるのかわかんねえわ。
79 :
2017/01/13(金) 22:51:30.29 ID:76Aeg2JY0
>>78
自分で言い出したんだろ
>>65
80 :
2017/01/13(金) 22:59:08.33 ID:ByW8JYfQ0
>>76
CCompareがアクセスできるのは自身のメンバとしてのa,bだから

概念的にいうならCCompareが持っているのはCから継承した自身のメンバ
CCompare::a,CCompare::bへのアクセス権であって
C::a,C::bへの直接のアクセス権を持っているわけではないから
81 :
デフォルトの名無しさん (ワントンキン MMe2-dqLr)
2017/01/13(金) 23:18:01.19 ID:8qb1acaCM
>>79
関数ローカルのstaticなstd::mutexをなぜmutexで保護しようとしたのかサッパリとわかんねえって言ってんの。
ランタイムライブラリとstd::mutexのデフォルトコンストラクタがconstexprである関係性の説明一つもないし相手しても出てこないって解ったから相手するのやめるよ。
最初から最後まで何が言いたいのか一ミリもわかんなかったわ。
82 :
2017/01/13(金) 23:21:37.61 ID:nYJUER3p0
>>80
map や priority_queue にあたえる比較関数オブジェクト(CCompare) の中に,
別のクラス(例では C) の private/protected をアクセスすることはできないのでしょうか
なんとかならないでしょうか
83 :
2017/01/13(金) 23:59:19.90 ID:ByW8JYfQ0
>>82
一般的には真っ当やり方ではどうにもならない
>>76のケースならCとCCompareのunionを使って真っ当にどうにかなるのかもしれない
84 :
2017/01/14(土) 00:05:54.36 ID:8QfSwFFH0
>>81
関数ローカルなstatic変数の初期化は排他制御しなけりゃならない
これはOKかな?
その排他制御にstd::mutexを使えというお笑い提案が>>45
85 :
2017/01/14(土) 00:37:53.00 ID:rG4STkB+d
>>84
ランタイムライブラリじゃなければならない理由を説明するつもりならコード書いて例示すればいいんじゃないの?
断片的なコメント書くよりわかりやすいと思うぞ
86 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/14(土) 00:42:02.10 ID:Q3G32+hm0
>>85
関数ローカルのstatic変数の初期化を排他しなきゃいけないなんて言ってるバカを相手にしちゃいけないよ
87 :
デフォルトの名無しさん (ワッチョイ b633-zxSj)
2017/01/14(土) 00:47:15.28 ID:/xjCjFtE0
>>82
#define private public
#define protected public

異論反論は勿論認める。
88 :
デフォルトの名無しさん (ワッチョイ b633-zxSj)
2017/01/14(土) 00:51:08.04 ID:/xjCjFtE0
あ、コード見てなかった。
ネタにもなって無かったわ…ごめん。
89 :
2017/01/14(土) 01:17:03.19 ID:RBO90iTA0
質問ですが、mapやunordered_mapの[]演算子が非constしか用意されていないのは
何か理由があるんですか?
90 :
2017/01/14(土) 01:39:44.07 ID:mg/r9n9z0
>>89
指定したキーに対応する要素が存在しないときは新たに要素を作成するから
91 :
デフォルトの名無しさん (ワッチョイ b633-zxSj)
2017/01/14(土) 01:40:54.24 ID:/xjCjFtE0
>>89
そのキーが存在しなくても、自動的に追加する仕様だから、const にはできない。
92 :
デフォルトの名無しさん (ワッチョイ 4f04-lw3D)
2017/01/14(土) 02:18:12.38 ID:kOBEZk8k0
static変数の話の戻るんですけど、非ローカルstatic変数は生成/開放順序が不定
だから、使うな(googleスタイルガイド)やstaticローカルの参照にしろ(effective c++)
は言っているわけですけが、非ローカルstatic constexpr変数なら問題ないですよね?
93 :
2017/01/14(土) 02:22:43.34 ID:RBO90iTA0
ありがとうです
仕様がそうなっているからですか
わざわざatが用意されているのもそれが理由なんですね
94 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/14(土) 02:59:59.47 ID:Q3G32+hm0
>>92
変数にconstexpr付けたらコンパイル時定数になるから実行時の初期化とは無縁
95 :
2017/01/14(土) 08:04:44.63 ID:8QfSwFFH0
>>94
あーあ、はいはい

3.7
The zero-initialization (8.5) of all block-scope variables with static storage duration (3.7.1) or thread storage
duration (3.7.2) is performed before any other initialization takes place.
Constant initialization (3.6.2) of a block-scope entity with static storage duration, if applicable, is performed before its block is first entered.
96 :
2017/01/14(土) 08:14:50.33 ID:4HVF8lbq0
話の前提(規格と実装)がずれてるような気がしなくもない
97 :
デフォルトの名無しさん (ワッチョイ 3298-los8)
2017/01/14(土) 08:16:06.74 ID:BjO/qPFR0
>>91
正確にはconstにできないのではなく、
constにするのは良心が咎める、だろ
データの実体はthisに指されていないわけで
98 :
2017/01/14(土) 11:01:30.33 ID:f29MAUgw0
>>76
protectedなんて使うな、あんなもんpublicと一緒だ

いくつかそれっぽいの書いてみたから好きなの使え
http://ideone.com/GkUTFI
http://ideone.com/IvYKWe
http://ideone.com/ZrgkZM
99 :
2017/01/14(土) 13:46:51.12 ID:TZ84v9ShM
心が洗われるようなコード
100 :
2017/01/14(土) 15:44:02.75 ID:SDa1ObQ20
struct A {
int value;
};

auto p1 = new A;
auto p2 = new A();

cout << p1->value << endl; // <- 不定
cout << p2->value << endl; // <- ゼロ

この挙動の違いは規格のどの部分で定義されてるんじゃろ?
101 :
2017/01/14(土) 15:59:48.64 ID:kCGGguyq0
規格を読まずに言うと8.5p11
102 :
2017/01/14(土) 16:00:41.57 ID:kCGGguyq0
嘘を言った
8.5までわかっていて、規格を見たら段落11だった
103 :
2017/01/14(土) 17:01:56.80 ID:pjYHXW8Q0
>>98
ありがとうございます.C++11以降の新鮮な書き方ですね
個人的には3番目のラムダ式のものが分かりやすくていいと思いました
using 文を名前スペース以外に使う方法って,なんていうのですか?詳しく調べたいと思います.
104 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/15(日) 12:13:55.44 ID:OwCHVx6x0
>>92 がバカに騙されてないか少しだけ心配
105 :
デフォルトの名無しさん (オイコラミネオ MMce-mZvv)
2017/01/15(日) 12:52:42.89 ID:oZyLvSNYM
>>104
何も考えんとアホみたいにstatic使ってるやつよりマシやろ
106 :
2017/01/15(日) 13:12:23.80 ID:n2HQszSv0
マシかどうかではなく問題の有無で語るべきではないか
107 :
2017/01/15(日) 13:19:44.69 ID:oZyLvSNYM
>>94
みたいな回答がついてそれに
>>95
とツッコまれるくらいの問題はあるやろ
108 :
2017/01/15(日) 13:41:07.01 ID:gYQA4gmtM
「コンパイル時に定数として評価される」ことと「コンパイル時に解決される」ことを混同している人は結構いると思う。
109 :
2017/01/15(日) 13:50:38.16 ID:dIwTpKXnM
>>108
どうちがうの?
110 :
2017/01/15(日) 14:48:53.66 ID:Vh4eztBka
111 :
2017/01/15(日) 16:26:13.53 ID:6tnmROhD0
>>95
それ C++14 の 6.7p4 ね。で、 3.6.2 p2 にこんな規定もある。
> Together, zero-initialization and constant initialization are called
> static initialization; all other initialization is dynamic initialization.
> Static initialization shall be performed before any dynamic initialization
> takes place.
だから>94の言う「実行時の初期化とは無縁」というのは間違ってないと思う。

あと、ここらへんの文面が C++14 の後に変わってて、>95の引用した文面は消えてる。
http://wg21.cmeerw.net/cwg/issue2026
112 :
2017/01/15(日) 20:39:17.85 ID:T6BZe6fz0
>>111
3.6.2のタイトルを1000回音読してから出直してくれたまえ
113 :
2017/01/15(日) 20:51:15.65 ID:6tnmROhD0
>>112
3.6.2 Static initialization [basic.start.static]
で、これ読んだら話がどう変わると思ってるの?
114 :
2017/01/15(日) 21:57:06.54 ID:T6BZe6fz0
>>113
なるほど、名前も変えるの見落としてた
なんか支離滅裂な提案してるなと、読み込みを本能的に拒絶してた

>>94が正しくなるということだね
>>86みたいな電波とばしてるからマグレ当たりだろうけど
115 :
2017/01/15(日) 22:22:21.32 ID:6tnmROhD0
>>114
名前?提案?いったい何の話?

>46 からずっと、ほとんど何言ってるのかわかんなくてこわい。
もうちょっと伝わる文面にしてもらえないものか。


あと、「>>94が正しくなる」じゃなくて現行の C++14 でも正しいよ。
116 :
デフォルトの名無しさん (ワッチョイ 3298-los8)
2017/01/15(日) 22:24:11.33 ID:RPIsJnBb0
>>108
今現在の流れにどんな関係があるんだ?
constexprの効力は最適化と関係ないぞ
117 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/15(日) 22:39:13.98 ID:OwCHVx6x0
>>115
少しでも解るなら凄いよ…
俺全く理解出来ないからスルーすると決めたもの。
118 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/15(日) 22:49:15.83 ID:OwCHVx6x0
デタラメばかり言ってるから流石にもう騙される人は居ないと思うけど、一応関数ローカルなstatic変数の初期化タイミングに排他必要ないという記事張っとくよ
ググって日本語で一番上にでた記事だよ

http://d.hatena.ne.jp/yohhoy/touch/20120309/p1
119 :
デフォルトの名無しさん (ワッチョイ 3298-los8)
2017/01/15(日) 22:54:49.73 ID:RPIsJnBb0
ggrを最高神とあがめる信者か
採用1年目からアレをやらされるとそうなるかねえ
120 :
2017/01/15(日) 23:01:04.84 ID:Ah8VE8+/0
読点の前に書かれているように
読点の後を鵜呑みにするか試しているのではないか
121 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/15(日) 23:02:17.22 ID:OwCHVx6x0
>>119
検索したらすぐ解ることを読めもしない規格だけ読んで間違って解釈するやつの前でそんな事言えんの?
残酷な奴だな
122 :
2017/01/15(日) 23:02:52.43 ID:T6BZe6fz0
>>118
そこにも日本語で解説してあるだろ

> gcc 4.0.0から既定動作でスレッドセーフなコードが出力される。(自動的に排他制御コードが埋め込まれる。)

これは最初から言っている(>>24)
123 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/15(日) 23:08:33.39 ID:OwCHVx6x0
>>122
いや、そんな事十分に理解しておりますよ。
自分で排他制御を書く必要ないって書くべきだったか?

どこぞのレスで
> >>86みたいな電波とばしてるからマグレ当たりだろうけど

って書いてるからそれに騙されてる人が居ないか心配で書いただけだよ
124 :
2017/01/15(日) 23:14:37.92 ID:T6BZe6fz0
>>123
はあ? 自分で排他制御なんてどうやって書くんだよ
バカも休み休み言え
125 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/15(日) 23:20:48.48 ID:OwCHVx6x0
それは
>>84
に言えよ
ってやべー間違ったわアンカー付けたの触ったらダメな奴だった
126 :
2017/01/15(日) 23:25:26.18 ID:T6BZe6fz0
>>115
>あと、「>>94が正しくなる」じゃなくて現行の C++14 でも正しいよ。

現行はこれだろ
> Constant initialization (3.6.2) of a block-scope entity with static storage duration, if applicable, is performed before its block is first entered.
つまりブロックスコープのstatic storage durationな変数はそのブロックに最初に入る時に初期化、すなわち実行時
127 :
2017/01/15(日) 23:30:17.30 ID:T6BZe6fz0
>>125
>>45
> gcc 4.0.0から既定動作でスレッドセーフなコードが出力される。(自動的に排他制御コードが埋め込まれる。)
こう言う自動的に埋め込まれる排他制御にstd::mutex使えなんて愉快な提案してしたんだろ

> ひんとstd::mutexのコンストラクタはconstexpr修飾されてる
128 :
2017/01/15(日) 23:35:49.06 ID:6tnmROhD0
>>126
before は「前」って意味ね。ブロックに入る「時」とまでは限定されてない。

同時に、定数初期化(を含む静的初期化)はあらゆる動的初期化より前に行われる
とする規定があるのは>>111で挙げたとおり。

これにより、動的初期化(実行時の初期化)との間で順序が問題になることはない。
129 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/15(日) 23:42:21.31 ID:OwCHVx6x0
>>92
の質問が

>非ローカルstatic constexpr変数なら問題ないですよね?

だからブロックスコープの話ですら無いんだけどね。
130 :
2017/01/16(月) 00:16:22.26 ID:4D4bT+Tb0
>>128
ブロックに入る前なので、「実行時の初期化とは無縁」じゃ無いだろ

あと、>>111に書かれてるのは現行は
3.6.2 initialization of non-local variables
の規定だね
131 :
デフォルトの名無しさん (ワッチョイ 3298-los8)
2017/01/16(月) 00:21:18.11 ID:UB1GTfE40
>>121
すぐ解ることって自分で言いながら読めもしないって
言ってる意味わかんねえぜ
検索と規格のどっちが難しいかも逆に認識してるみたいだし
まあ1年目に魔改造されたアタマっちゃそれらしいが
132 :
2017/01/16(月) 00:39:27.16 ID:5OapSwc60
>>130
ブロックに入る前、且つ、すべての動的初期化より前、だから「無縁」でもいいんじゃないの?
ローカル static constexpr 変数について初期化順の問題が起こり得るというなら、コード例
出してみてよ。

>>114 の「名前」は 3.6.2 のタイトルのこと言ってたのか。ようやくわかった。
でも 3.6.2 のタイトルがどうあれ、>>126 で引用した箇所にある "Constant initialization" の
定義は 3.6.2 によるんだから、話は変わらないよ。

誤解を招くタイトル含め文面がマズいのは認めるけど、だからこそ本来の意図に沿うように修正
されたんだろうし。
133 :
2017/01/16(月) 00:44:11.56 ID:4D4bT+Tb0
>>129
実行時の初期化とは無縁の理由として
> 変数にconstexpr付けたらコンパイル時定数になる
をあげている(ローカルでもコンパイル時定数になる)

ところが、コンパイル時定数であってもブロックスコープのConstant initilizationは実行時初期化(ブロックに入る前)なので間違い
134 :
2017/01/16(月) 01:02:26.19 ID:4D4bT+Tb0
>>132
6.3.2を参照してるのはConstant initializerの定義だけ、
その初期化が行われるタイミングは6.7に書かれている通りブロックに入る前
ロード後、プログラムに制御が移る前かもしれないし、mainが呼び出された後かもしれない
135 :
2017/01/16(月) 01:17:19.08 ID:5OapSwc60
>>134
Constant initializer じゃなくて Constant initialization の定義ね。
その Constant initialization に対する規定がローカル static の場合だけ
無視できるとする根拠が何かあるの?
136 :
2017/01/16(月) 02:10:36.59 ID:4D4bT+Tb0
> その Constant initialization に対する規定がローカル static の場合だけ
> 無視できるとする根拠が何かあるの?
6.7で参照してるConstant initializationは
3.6.2のConstant initialization is performed:の下で3つ列挙されてる部分
定義であって、初期化のタイミングは参照していない それぞれに別の記述がある

タイミングは何度も引用してるけど6.7は
> Constant initialization (3.6.2) of a block-scope entity with static storage duration, if applicable, is performed before its block is first entered.

3.6.2は
> Together, zero-initialization and constant initialization are called static initialization; all other initialization is dynamic initialization. Static initialization shall be performed before any dynamic initialization takes place.
137 :
2017/01/16(月) 02:53:47.44 ID:5OapSwc60
>>136
別の記述があることが根拠?
それら2つの規定の両方が適用され得るだろうと言ってるんだけど、
なんでどっちか片方しか適用されないと思ってるの?

A ⊃ B の場合に A に対する規定が B にも及ぶってことを認めないの?
(この場合は A = "Constant initialization", B = "Constant initialization of a block-scope entity")
138 :
2017/01/16(月) 07:40:40.27 ID:a6XjHitHr
>>137
>>134の主張は3.6.2, 6.7のどちらとも矛盾しないように見えるのだが
139 :
2017/01/16(月) 08:43:01.09 ID:4D4bT+Tb0
むしろ
3.6.2 initialization of non-local variables
と、明確に分けられてる項の規定が全部適用されると言ってるのが不思議過ぎる

http://wg21.cmeerw.net/cwg/issue2026もバグ指摘されてるし、前途多難だ
140 :
2017/01/16(月) 09:38:47.49 ID:5OapSwc60
>>138
タイミングについての言及だけ読めばそうだけど、彼は 3.6.2 にある静的初期化一般に対する規定が
ローカル static の場合に限っては及ばない、とする主張をしている。


新しい理由付けも出なくなって平行線みたいだし、次期規格ではざっくり改定される文面の話だし、
もういいかな。
141 :
2017/01/16(月) 10:48:30.43 ID:4D4bT+Tb0
3.6.2のnon-localに関する規定は6.7で「そのブロックに入る前」と上書きされてるだろ
3.6.2がlocal, non-local問わずに有効なら「そのブロックに入る前」と言う規定は矛盾する
142 :
デフォルトの名無しさん (スプッッ Sdf2-9KqD)
2017/01/16(月) 11:01:51.83 ID:ULOq3Vpcd
https://cpprefjp.github.io/reference/atomic/atomic.html
atomicを使ったspinlockなるmutexの例があるのですが
これを再帰ロック可能なrecursive_spinlockにするには
どのように実装すればいいですか。
143 :
2017/01/16(月) 19:11:32.79 ID:a6XjHitHr
>>141
「ブロックに入る前、且つ、すべての動的初期化より前」
規格がUNKOなのはさておき、論理的にどこも矛盾していないのでは?
144 :
デフォルトの名無しさん (ワントンキン MMe2-dqLr)
2017/01/16(月) 19:40:06.27 ID:LWQyQSVNM
仮にブロックスコープのconstexpr変数が実行時に初期化されたとして、どんな問題が発生するという主張なん?
145 :
デフォルトの名無しさん (ワッチョイ 3298-los8)
2017/01/16(月) 22:29:50.06 ID:UB1GTfE40
翻訳時に評価せよと指定したものが
実行時に評価されるようなら
コンパイラを窓から投げ捨てて
アセンブラか機械語を使うしかない

int main() { return 1; }で0を返されるのと同じで
もはや何を言っても無駄、根本的に話にならないということ
146 :
2017/01/16(月) 23:04:39.73 ID:4D4bT+Tb0
>>145
初期化の意味がわからない子は参戦しないように
147 :
2017/01/16(月) 23:23:13.66 ID:+uglxnZcr
>>144
特に実害はなくても>>94の『実行時の初期化とは無縁』が真実でないことを問題と考える者がいるのだと思っていた
148 :
デフォルトの名無しさん (ワントンキン MMe2-dqLr)
2017/01/17(火) 03:28:47.43 ID:tvPWGsMMM
なんというか糞の役にもたたんな
今現在そんな実装のコンパイラがあるわけでもなし、今から実装するにしてもわざわざ複雑にして実行速度落とすような実装にするとも思えないし
149 :
2017/01/17(火) 04:25:31.38 ID:ngprCvv90
最近猫でもわかるって奴読んで独学でちょくちょく勉強してんだけど、こんまま独学でプログラミング学んでったらオセロくらいなら作れるようになる?どんくらいかかるかな
150 :
2017/01/17(火) 07:56:18.72 ID:ueZ17iDzM
>>144
組み込みじゃ、ROMになるかRAMになるか大きな違いが出るな
151 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/17(火) 13:27:45.10 ID:mkv39b380
>>150
constすら付けなくても初期値が決まっていて変更する可能性のあるコードが無ければ最適化で定数に置き換えられる時代にそんな事気にするんだ?
152 :
デフォルトの名無しさん (ワッチョイ b624-los8)
2017/01/17(火) 13:30:54.01 ID:Pbl2vPGV0
>>146
おい間抜け
どこかに初期化って書いてあったか?
人を小馬鹿にしたつもりだろうがブーメラン刺さってるぞw
153 :
2017/01/17(火) 22:57:29.19 ID:FvzokP9y0
>>149
オセロくらいなら excel と vba で一週間くらい集中すればできんじゃないかね。
154 :
2017/01/18(水) 01:28:58.03 ID:9W34sy+b0
>>153
アスペ
155 :
2017/01/18(水) 01:54:34.51 ID:an9uI7uk0
>>151
定数が実行時に初期化されれば、それはROMじゃなくてRAMに配置されてるってことだろ?そりゃ組み込みなら気にならないほうがおかしい
156 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/18(水) 02:36:42.52 ID:n1DpjkbT0
>>155
int f(){static int v=5;return v;}

int f(){return 5;}
が最適化後は一緒になるって言ってんの。
そして
static constexpr int v=...;
にしたらそのvの初期化値はコンパイル時に求まるし変更出来ない。ここまで言えば最適化後にどうなるか解るよね?
まぁ、constexprの場合は最適化しなくてもなんだけどさ
157 :
2017/01/18(水) 03:40:09.16 ID:2vnfhfI50
>>156
>>150>>144の言った「仮に・・・」へのレスなんだから現実のコンパイラがどうなってるかは関係ないと思われ
158 :
2017/01/18(水) 07:14:44.33 ID:KfZHaLf7M
定数であることと ROM に置くかどうかは別の話だし
159 :
2017/01/18(水) 08:00:45.61 ID:+X3tak3t0
>>156
>最適化後は一緒になるって言ってんの
デバッグ中の挙動を無視されると困ります
160 :
デフォルトの名無しさん (ワッチョイ 677b-dqLr)
2017/01/18(水) 08:42:08.41 ID:n1DpjkbT0
>>157
ごもっとも。規格がどうかも関係なかったね。
>>159
なんで?
161 :
2017/01/18(水) 08:52:41.79 ID:ZS0nd/enM
>>158
定数であるからromにも置けるって話なんで関係ない訳がない。
162 :
2017/01/18(水) 18:41:42.82 ID:Abs9KEqJM
>>161
> 定数であるからromにも置ける
だからと言ってROMに置くとは限らない
って話なんだがお前には難しすぎたか?
163 :
2017/01/18(水) 21:27:37.78 ID:4GI0Tt+ca
このスレを見て、C++って永遠に喧嘩できて寂しくない言語だと判った
164 :
2017/01/18(水) 21:56:10.60 ID:qB5vepR/0
こういうやりとり見てるとやっぱリーナスの c++観は正しいなと思う。
165 :
2017/01/18(水) 23:18:53.09 ID:0GLHJE+5M
>>162
置けるってのは置くこともできるって意味だが、随分日本語不自由なやつだな
166 :
2017/01/19(木) 06:46:32.74 ID:JadLiFtgM
>>165
> 随分日本語不自由なやつだな
「置ける」と言う可能性の話と「置く」と言う実際の動作の区別がつかない奴に言われても...
でっかいブーメラン乙としか言いようがないわな w
167 :
デフォルトの名無しさん (ワッチョイ 037b-rTuY)
2017/01/19(木) 06:57:37.47 ID:bO+XZlhy0
何を言い争ってんのか解らん
直値でもROMに置けると言えるだけでなんの違いも無いんだが。
168 :
2017/01/19(木) 08:39:21.82 ID:4Gh/dudO0
>>152
初期化==評価と考えてなけりゃ >>145は出てこねーんだよ バーカ
169 :
デフォルトの名無しさん (スプッッ Sd1f-xrkK)
2017/01/19(木) 10:16:43.40 ID:CldDY8MLd
int a=100;
int&& b=std::move(static_cast<int>(a));
b=200;
aは100、bは200になるのですが
キャストすると必ず一時オブジェクトが生成されるのでしょうか
環境によってaもbも200になったりしますか。
170 :
2017/01/19(木) 10:39:40.20 ID:gPdsJo1i0
171 :
デフォルトの名無しさん (スプッッ Sd1f-xrkK)
2017/01/19(木) 10:50:03.86 ID:CldDY8MLd
わかりました
172 :
2017/01/19(木) 11:10:02.61 ID:ipEwSksA0
次に、「ボクのパソコンではaが200になるんてすけど」というレスが来るに違いない
173 :
2017/01/19(木) 12:54:31.63 ID:Ccs4bPhGM
>>167
わからないなら絡んでくるなよ w
174 :
2017/01/19(木) 14:28:16.75 ID:oLhGNghYr
>>169
>環境によってaもbも200になったりしますか

Yes
175 :
デフォルトの名無しさん (ワッチョイ bfcb-SmTw)
2017/01/19(木) 20:26:21.94 ID:+cE5RWPo0
どっちですか
176 :
デフォルトの名無しさん (ワッチョイ cf24-RK9q)
2017/01/19(木) 21:29:45.00 ID:x+icVyy10
>>173
わからないなら絡まれたフリをするなよw
おまえに教えを請うようなクズの中のクズはさすがにこのスレにもいないだろうから
177 :
2017/01/19(木) 21:35:22.14 ID:ylWIT8ZQM
>>176
わからんって言ってるのは俺じゃなくて >>167 なんだが...
色々お前には難しすぎたか? w
178 :
デフォルトの名無しさん (ワッチョイ 037b-rTuY)
2017/01/19(木) 21:54:21.33 ID:bO+XZlhy0
何を言い争ってんのかわからん。
179 :
2017/01/19(木) 21:55:13.80 ID:f8wSWc2J0
いいのよ
180 :
デフォルトの名無しさん (ワッチョイ 037b-rTuY)
2017/01/19(木) 21:56:39.26 ID:bO+XZlhy0
>>179
ありがとう
181 :
2017/01/20(金) 02:35:51.43 ID:WXRyG1p+a
最近この喧嘩は自演じゃないかと思ってる
182 :
2017/01/20(金) 08:56:02.47 ID:1CC8R4dK0
ここで出た話題のTips集を出したら売れるんじゃないかと思えてきたわ
183 :
2017/01/20(金) 18:53:55.75 ID:zIVGmPHgd
32bitのソフトを64bit対応させようかなって考えてるのだけど
printf, winapi, _t型変数以外気を付けることある?俺これやってはまったわみたいなのが知りたい
184 :
デフォルトの名無しさん (ワッチョイ cf24-RK9q)
2017/01/20(金) 23:36:02.52 ID:GZ99lyBK0
>>168
いーや、初期値==評価とは考えずに書いた
事実とおまえの考えは完全が食い違っているんだよ
せいぜい妄想の世界で自画自賛してろナルシスト
185 :
2017/01/21(土) 01:01:56.19 ID:v+i75+9D0
>>184
引っかかりやがった
初期化の話題で評価と言い出しのはテメーだ バーカ
186 :
2017/01/21(土) 01:52:25.87 ID:RmTA4cQd0
江添はなんて言ってる?
187 :
2017/01/21(土) 11:02:38.55 ID:Bf4L6OzOa
それワイのやつや!
188 :
デフォルトの名無しさん (ワッチョイ cf24-RK9q)
2017/01/22(日) 00:06:25.08 ID:LwmXYJhf0
>>185
だから初期化ってどこに書いてあるんだよ
幻視か? だからリスパダールちゃんと飲めとあれほど・・・
189 :
デフォルトの名無しさん (ワッチョイ cf7b-rTuY)
2017/01/22(日) 00:24:56.56 ID:77/TNfJH0
>>182
こんなのどうやってまとめるんだ…
190 :
デフォルトの名無しさん (ワッチョイ bfcb-xrkK)
2017/01/22(日) 02:31:51.43 ID:hchjfZjx0
江口はなんて?
191 :
2017/01/22(日) 02:40:24.62 ID:rrJzCAZR0
教えて下さい。
環境は VisualC++2015 x64 です。

与えられた文字列の引数について、1文字が1バイトなのか、2バイトなのかで呼び出す関数を切り分けたいと思い、SFINAE で以下のようなコードを書きました。
しかし、こののコードで「関数A」を呼んで欲しいのに、「関数B」が呼ばれてしまいます。

- なぜ関数Bが呼ばれるのか
- 1文字のバイト数で切り替える手段

この2点について、教えて下さい。よろしくお願いします。

extern void* enabler;

// 関数A (本当は1文字が1バイトの時用の関数)
template <typename STR, std::enable_if_t<sizeof(decltype(std::remove_all_extents<STR>::type()[0])) == 1> *& = enabler>
void hoge(const STR&)
{
}

// 関数B (本当は1文字が2バイトの時用の関数)
template <typename STR, std::enable_if_t<sizeof(decltype(std::remove_all_extents<STR>::type()[0])) != 1> *& = enabler>
void hoge(const STR&)
{
int tmp;
tmp = sizeof(decltype(std::remove_all_extents<STR>::type()[0])); // どういう訳か tmp == 1 となる
}

void main()
{
std::string s;
hoge(s); // 1バイト版である、関数Aを呼んで欲しい
}
192 :
2017/01/22(日) 03:05:41.88 ID:NkQzBql/K
>>191
1 charは常に2バイトではない。あなたはマルチバイト文字列の基礎を理解していないようだ。
マルチバイト文字列中の複数のcharが一文字になっているか否かは、
文字列の先頭から1charごとにcharの値の範囲を確認し、lead byteかtrail byteかを判定するしかない。
193 :
デフォルトの名無しさん (ワッチョイ bfcb-SmTw)
2017/01/22(日) 03:12:07.68 ID:hchjfZjx0
ビルド通らないからなんでかはわかんない

template <typename STR, std::enable_if_t< sizeof( typename STR::value_type ) == 1, std::nullptr_t > SFINAE = nullptr >
void hoge(const STR&)
{
}

template <typename STR, std::enable_if_t< sizeof( typename STR::value_type ) != 1, std::nullptr_t > SFINAE = nullptr >
void hoge(const STR&)
{
}

これでいけない?
194 :
2017/01/22(日) 03:12:21.28 ID:NkQzBql/K
型情報からはマルチバイト文字列のlead/trailに関する情報は得られない。よって、各charの値の範囲を実際に確認しないと、わからない。
195 :
2017/01/22(日) 07:14:06.66 ID:7mC+0LM10
>>192
日本語が理解できないボケ老人は去れ
196 :
2017/01/22(日) 08:04:55.45 ID:5o7PrILb0
>>191
例のコンパイラがぶっ壊れてるんだろうね
gccは期待通り
http://ideone.com/9pSqel
197 :
デフォルトの名無しさん (ワッチョイ 037b-rTuY)
2017/01/22(日) 08:28:45.75 ID:gigvK4EO0
オーバーロードでよくね
198 :
2017/01/22(日) 08:37:36.49 ID:rrJzCAZR0
>192-196
ありがとうございます。

>193
確かに期待通りの動作をします。
ただ、この先 MFC の CStringA, CStringW, 生配列などを仮引数として与えたいため、operator[] の戻り値で判定出来ないか考えていました。

>196
なるほど。コンパイラの問題くさいので代替案を考えてみます。
ありがとうございました。
199 :
2017/01/22(日) 08:50:18.71 ID:rrJzCAZR0
>192-197

下の様に、sizeof, decltype を移動させたら、あっさり動きました。失礼しました。

template <typename STR>
struct helper
{
enum {
item_size = sizeof(decltype(STR()[0])),
};
};

extern void* enabler;

// 1バイト版
template <typename STR, typename std::enable_if<helper<STR>::item_size == 1>::type *& = enabler>
void hoge(const STR&)
{
}

// 2バイト版
template <typename STR, typename std::enable_if<helper<STR>::item_size == 2>::type *& = enabler>
void hoge(const STR&)
{
}

void main() {
std::string a;
hoge(a); // 1バイト版
std::wstring w;
hoge(w); // 2バイト版
}
200 :
デフォルトの名無しさん (ワッチョイ 237b-rTuY)
2017/01/22(日) 09:58:50.62 ID:iEDujvJA0
201 :
2017/01/22(日) 13:37:19.35 ID:gnARoY8z0
CStringとかまだ存在してたのかよ
202 :
2017/01/22(日) 14:40:31.27 ID:hBhrTyQGM
203 :
2017/01/22(日) 15:06:13.66 ID:paMlvMvI0
>>199
sizeof(decltype(STR()[0])) って sizeof(STR()[0]) と何か違ったっけ?
204 :
2017/01/22(日) 15:53:04.56 ID:7mC+0LM10
mainがvoidなレベルの人にそんな突っ込みをしても…
205 :
デフォルトの名無しさん (ワッチョイ cf24-RK9q)
2017/01/22(日) 20:43:26.81 ID:LwmXYJhf0
戻らないmainについてもガタガタ言っちゃう人がねえ
206 :
デフォルトの名無しさん (ワッチョイ 037b-rTuY)
2017/01/22(日) 22:57:58.70 ID:gigvK4EO0
mainのreturnは省略したら0が返ることが保証されている
207 :
2017/01/22(日) 22:59:58.14 ID:7mC+0LM10
>>206
当たり前のことを言い出して、いきなりどうした
208 :
デフォルトの名無しさん (ワッチョイ 037b-rTuY)
2017/01/22(日) 23:01:08.57 ID:gigvK4EO0
>>207
戻らないmain(?)へ宛
209 :
2017/01/22(日) 23:14:20.58 ID:7mC+0LM10
>>208
なるほど理解した
『戻らないmain』は[[noreturn]]のことだと思ったので理解できずスルーしていた
人に『リスパダールちゃんと飲めとあれほど』と言って自分が飲み忘れたのかと
210 :
2017/01/22(日) 23:26:22.29 ID:7mC+0LM10
>>203
CStringは知らないが、stringは恐らく同じ
sizeof(STR()[0])
 →sizeof (char &型の左辺値)
 →sizeof (char)と同じ
sizeof(decltype(STR()[0]))
 →sizeof (decltype(char &型の左辺値))
 →sizeof (char &型)
 →sizeof (char)と同じ
211 :
2017/01/23(月) 09:48:36.48 ID:SwVOU3U8a
>203
vc++2015で deltype をぬくと、関数に[] は出来ません、みたいなエラーで通りませんでした。
STR()をコンストラクタではなく、関数と思ってるんだと思います。
212 :
2017/01/23(月) 17:40:29.94 ID:oJYEiyR6r
宣言に解釈できるときは宣言として解釈
みたいなルールだっけ
213 :
2017/01/23(月) 18:40:50.71 ID:FReCyx8S0
コンストラクタ ⊆ 関数
214 :
2017/01/23(月) 19:40:02.64 ID:Ij4EmhsFa
アンダーバー要らなくね?
215 :
2017/01/24(火) 03:03:03.61 ID:ch78KtiL0
MFCとか何処のバカが設計したんだろうな
とっくに絶滅しているもんだとおもっていたぜw
216 :
デフォルトの名無しさん (ワッチョイ 037b-rTuY)
2017/01/24(火) 03:50:21.48 ID:nvNd8iP10
それより優れたものを設計してから言えよな
217 :
2017/01/24(火) 03:56:08.97 ID:Af36V4kC0
>>216←今日のバカ
218 :
デフォルトの名無しさん (ワッチョイ 137b-Eksc)
2017/01/24(火) 11:11:02.03 ID:dVVoZ7Su0
MFCが作られた時代を考えられないやつのほうがバカなんだよなあ
あれはWin32APIの薄いラッパでしかないから
文句あるなら別のライブラリを使えばいいだけの話、それも出来ないならやっぱりお前が無能でバカ
219 :
デフォルトの名無しさん (スップ Sd1f-xrkK)
2017/01/24(火) 11:33:11.15 ID:9X3I9Jqtd
int (*func)(int) = &hoge;
func = nullptr;

funcへの代入をできないようにconst付けたいのですが
どう書けばいいですか。
usingやtypedefは使わない方法でお願いします。

あとメンバ関数への参照はどう記述すればいいですか
int (hage::*func)(int) = &hage::test;
の参照版です
220 :
2017/01/24(火) 11:41:16.20 ID:GCEfrzc1a
益のない煽りはよしなよ(・ิω・ิ)
221 :
2017/01/24(火) 12:11:20.65 ID:ekWjtoGq0
>>219
int (* const func)(int) = &hoge;

int (piyo::* mf0)(int) = &piyo::test;
int (piyo::* & mf1)(int) = mf0;

int (piyo::* const & mf2)(int) = &piyo::test;
222 :
2017/01/24(火) 12:13:02.49 ID:NfDXKGen0
>>211
そっか sizeof だと式と型の曖昧さが問題になるけど decltype なら式しか取らないから曖昧さを消せるのか。
223 :
2017/01/24(火) 12:13:28.46 ID:NfDXKGen0
>>219
[dcl.mptr]/3 (Note) "There is no "reference-to-member" type in C++."
224 :
デフォルトの名無しさん (スップ Sd1f-xrkK)
2017/01/24(火) 12:19:40.53 ID:9X3I9Jqtd
>>221
それだとメンバ関数のポインタの参照になってませんか
int (&func)(int) = hoge;
のメンバ関数版はできないでしょうか

constの件はうまくいきました
225 :
2017/01/24(火) 13:24:18.69 ID:kmpgWA440
>>224
thisが必要になるから無理なんじゃないの
それよりクラス内でメンバ関数へのポインタを書くとthisが必要になる
226 :
2017/01/24(火) 21:23:55.09 ID:GIi5sfFU0
一生こういう些末なところに引っかかって
中身を書けない人生を送るんだろうな〜
227 :
2017/01/25(水) 00:27:17.93 ID:I9ZrCxSQ0
uint8_tとbasic_ifstream組み合わせるといろいろ面倒なんだけど、みなバイナリファイル読み込むときどうしてんの?普通にchar使っ使う?
228 :
2017/01/25(水) 00:35:21.87 ID:KGxAJ6V6r
バイナリでchar使うのは30年前の老人の発想
229 :
2017/01/25(水) 00:51:14.53 ID:/+qbj4+Vp
fopenでおk
230 :
デフォルトの名無しさん (ワッチョイ 037b-rTuY)
2017/01/25(水) 01:30:42.64 ID:5KwEWhG70
他の型をバイト列として解釈するときは(unsigned )charしか許されてないから普通にchar使う
231 :
デフォルトの名無しさん (ワッチョイ ff17-SmTw)
2017/01/25(水) 02:33:17.29 ID:LUWqNFoa0
fgetc() の戻り値を直接 char 変数に代入して EOF(=-1)判定するヘマ。あるある
232 :
2017/01/25(水) 04:12:15.84 ID:nJO+CT7AM
ねぇよ
233 :
2017/01/25(水) 15:31:39.49 ID:uJriqNlza
fopen、fgets系は使わないな。処理をFILE*依存にしたくない

>>230
>>228が言ってるのはそういう意味のcharじゃないでしょ
234 :
デフォルトの名無しさん (ワッチョイ cf24-RK9q)
2017/01/25(水) 21:44:43.91 ID:gbQNFS3L0
FILE*に依存しないとしてじゃあ何を使うんだ?
intにも依存したくないのか?
235 :
2017/01/25(水) 22:01:41.63 ID:nJO+CT7AM
fileno して read/writeかな
236 :
2017/01/26(木) 00:52:19.97 ID:GN6UrdAH0
おまいら相変わらず抵レベルな話題しているな
237 :
2017/01/26(木) 02:07:00.45 ID:cRvsGxqc0
高レベルな人が2ch何か見てるわけないからな
238 :
2017/01/26(木) 06:24:12.10 ID:XBNxNxvo0
>>237
FILE * を使う人はどうして2chをみないのか?iostream な人はどうなるのか?
239 :
デフォルトの名無しさん (スップ Sdca-kwgD)
2017/01/26(木) 08:04:45.44 ID:fFyxUIyid
プログラミングにはCBDオイルというのが有効だそうです。アイデアが治療に有効するので安倍内閣総理大臣も持病に使っているそうです。
ビル・ゲイツもこれで億万長者になれました
240 :
2017/01/26(木) 13:11:34.03 ID:lD0mvySBH
低レイヤーな釣りですね
241 :
デフォルトの名無しさん (ワッチョイ 3e24-XYXB)
2017/01/26(木) 18:22:33.18 ID:A9/xu7Tb0
物理層?
242 :
2017/01/29(日) 15:48:31.23 ID:Hm/zwJzS0
この処理低レベルだねぇと言われてムキーっとなるヤツ→素人童貞
この処理低レベルだねぇと言われて得意げにほくそ笑むヤツ→玄人
243 :
2017/01/29(日) 16:07:03.50 ID:K+/fnyLa0
すみません 低レベルな処理がが好きなんで
244 :
2017/01/29(日) 16:12:04.90 ID:2ZaFXkbr0
環境・処理系固有の事情やバグに悩まされてばかりで
幸せな顔をして仕事をしている人を見たことがない
245 :
2017/01/29(日) 16:31:19.45 ID:sujTTxNda
低レイヤって言えばいいのよ
246 :
2017/01/29(日) 22:01:55.93 ID:F8NpKYaN0
コスプレイヤーの仲間かな
247 :
デフォルトの名無しさん (ワッチョイ 3e24-BAqL)
2017/01/30(月) 21:07:15.53 ID:P5tJpKPw0
>>228
std::fstream::readの引数が【なぜ】charなのか
理解できないアフォ?
248 :
2017/02/01(水) 22:16:18.72 ID:zf0e/zUB0
30年前の設計だからだ!
249 :
デフォルトの名無しさん (ワントンキン MM1a-9Rjx)
2017/02/01(水) 22:52:40.44 ID:mWAIN14mM
むしろバイナリでchar以外何使うんだ?
250 :
2017/02/02(木) 00:40:35.30 ID:kju30PyH0
いやバイナリならどう読もうが書こうがいいと思うが。
てか疑問の意味がわからん。
251 :
2017/02/02(木) 01:35:32.10 ID:FXYEZ0RW0
>>250 そんなんじゃ type based aliasing rule に殺されるよ
252 :
2017/02/02(木) 01:58:08.09 ID:hMTSyXzS0
何か動作がおかしいときになってから考えれば良いんだよ
標準的な環境では考える必要は無いこと
253 :
デフォルトの名無しさん (ワッチョイ cf24-1aN8)
2017/02/02(木) 22:10:32.43 ID:1pIxEkoa0
真性アフォが早くも三名か。嘆かわしい。
254 :
2017/02/03(金) 08:10:44.86 ID:HxuiJzZXr
真性のアフォの内の二人くらいは
たいてい片山の自演
255 :
2017/02/03(金) 13:51:28.33 ID:+x5EsLXNd
新卒一年目で過去のコードをバージョンアップさせる業務についてるんだけど
会社のコードってなんであんなにdefine切ったりtypedefしまくってるんだ?
可読性低くない?始めて作った人には良いだろうけど後のこと考えるとデメリットなんではって思うんだけど...
256 :
2017/02/03(金) 13:57:14.34 ID:Fv/X2f+d0
場合によるからなんとも
257 :
2017/02/03(金) 15:21:22.58 ID:cyynpkXi0
一年目か凄いね
258 :
2017/02/03(金) 16:26:23.88 ID:oWJS3iiDa
スマン、片山って誰ンゴ?
259 :
2017/02/03(金) 17:44:58.85 ID:+x5EsLXNd
>>256
それを言っちゃあおしまいだよ...と言いたいけどまさにそうか
windowsapiが絡んでくると本当にわけがわからなくなる
MSDNも読みにくいし
260 :
2017/02/03(金) 19:35:01.87 ID:8SRwU46KM
参考までに、どんなdefIneやtypedefなん?
261 :
2017/02/03(金) 21:14:55.23 ID:DgoKILm5M
>>255
情報が増えるtypedefは正義
たとえば、
typedef std::vector<int> personal_id_array_type;

減るtypedefはゴミ
たとえば、
typedef std::vector<int> array_type;
262 :
2017/02/03(金) 21:24:44.53 ID:2s9sq5BM0
>>261
情報の増減がどこにあると?
263 :
2017/02/03(金) 21:43:49.02 ID:flkT/o5k0
>>260
>>261の前者・後者両方ともある
あと色々な名前で__stdcallが切られてたりして読むのがきつい
264 :
デフォルトの名無しさん (ワッチョイ a37b-jpzQ)
2017/02/03(金) 22:05:00.81 ID:ubtIaYbs0
ちなみにお前らの思うきれいなソースって具体的にどれよ
265 :
デフォルトの名無しさん (スッップ Sd9f-oUAv)
2017/02/03(金) 22:11:40.27 ID:7t2mdctmd
glm
266 :
デフォルトの名無しさん (ワッチョイ cf24-1aN8)
2017/02/03(金) 22:55:16.36 ID:aXFSiqlm0
261が言ってるのは
システムハンガリアンとアプリケーションハンガリアンてことだ
ハンガリー記法に限らず意味づけと言うまでもないことを
どう位置づけるべきかってこと
267 :
2017/02/03(金) 23:39:20.39 ID:CYbB7nGp0
>>255
変更しやすくする為じゃないの?
一箇所でそれ関連を纏めて変更したいんでしょ。
今は偶々同じ std:vector<int> なだけで。
268 :
2017/02/04(土) 00:17:30.98 ID:DV7gEIN40
m_ulDataCntとか全く意味を持たない変数名が多用されてて辛いわ
コメントも無い
269 :
2017/02/04(土) 05:48:10.84 ID:/r5Uxr2+0
>>264
ソースは俺
270 :
2017/02/04(土) 06:49:15.89 ID:JWHU8o9P0
>>267
なんか小難しい
定義されたものをさらに定義して
さらにさらに定義してってのをやってるのも同じなんかな?
見たことない型を追うだけで何ヵ所も追わないといけなくて大変
コメントもないし
271 :
2017/02/04(土) 07:32:17.23 ID:uizo/+L30
>>268
字面だけで推測するなら m_ulDataCnt は
m_ クラスのメンバ変数である
ul unsigned long
DataCnt データの個数
てな感じに見えるね。

元のソースファイルが一貫した命名規則を使ってれば
それがどんな規則であれ、見てるうちに慣れてくると思うよ。
272 :
2017/02/04(土) 07:39:17.67 ID:6QMeFViK0
クソみてぇな命名規則
273 :
2017/02/04(土) 08:42:25.92 ID:UEIbCXwH0
>>270
基本的にはそうでしょ。
ある物をdoubleにするかfloatで済ますかという場合、系統毎にtypedefをしてそれを使うしかない。
クラスの継承も同じだと思うけど。

というか読み方間違ってるだろ。まずは縦に読まずに横に読めよ。
そしてそれ以前に上司に聞けよ。
どのみちソースは出せないのだろうから、ここでいくら聞いてもかなり憶測を含んだ回答しか得られない。

コメントが無いのを問題に思うのなら、コメントを付けるのもお前の仕事だろ。
ただ正直言って、m_ulDateCntは>>271の言うとおりだろうし、そんなところにコメントがあっても嬉しくない。
多分君とそのソースでコメント作成基準に大幅にずれがある。
それは上司と打ち合わせしないと駄目だ。
最近の傾向としては、「コード読めば分かることをコメントするな!」みたいなのがあるが、
君はまさにその類のコメントを付けようとしている。
ただ逆に、何事であってもコメントを付けて二重化し「間違っていない」事を示す文化の所もある。
いずれにしても合わせるしかないんだから上司に聞け。
274 :
デフォルトの名無しさん (ワッチョイ a37b-jpzQ)
2017/02/04(土) 08:49:53.56 ID:XS0fIkHD0
とりあえずシステムハンガリアンは糞
275 :
デフォルトの名無しさん (ワッチョイ cf24-1aN8)
2017/02/04(土) 10:35:39.62 ID:BOsvOfBI0
doubleかfloatかに迷いがあるときはtemplateだろjk
276 :
2017/02/04(土) 20:11:06.99 ID:tL9rMbFt0
>>271
こういうの読めるようになりたい
アンダーバーとかなんか特徴あるんかね?
277 :
2017/02/04(土) 20:13:21.29 ID:sK4bvJ1nK
>>276
MFCのソース見れば時代遅れのハンガリアンが見れる。
278 :
2017/02/04(土) 20:29:05.55 ID:6QMeFViK0
MSのバカ社員が勘違いしてシステムハンガリアンが出来た
279 :
2017/02/04(土) 20:32:51.09 ID:UEIbCXwH0
>>276
むしろどこが読めないんだ?
271以外の解釈はないだろ。
280 :
2017/02/04(土) 20:36:47.66 ID:pJMir97a0
>>276
パターン認識って言うか慣れでしょ
いろんなソース見てりゃだんだんなれてくるよ
281 :
2017/02/04(土) 20:37:44.99 ID:tL9rMbFt0
ハンガリアンってなんだ
ってレベルで初めて見るわ

>>279
それは規則とか法則とか知ってるから読めるんだろ
大まかに言えば経験が違いすぎる
なら読めよって話だけどさ
282 :
デフォルトの名無しさん (ワッチョイ 1341-qcXh)
2017/02/04(土) 20:41:51.99 ID:URlnQv8F0
場合によってはハンガリアン記法にすべきものもあるかもしれないけど
全ての変数に対してやるのはどうなんでしょ?
283 :
2017/02/04(土) 21:08:08.22 ID:DV7gEIN40
クラスの先頭にCを付けるのだけは全くの無駄だからやめて
284 :
デフォルトの名無しさん (ワッチョイ a37b-jpzQ)
2017/02/04(土) 21:13:17.38 ID:XS0fIkHD0
>>282
それでもulとか環境によってサイズが変わる名前付けるのイミフだけどな
285 :
2017/02/04(土) 21:14:27.75 ID:UEIbCXwH0
>>281
いや多分、そのソース見たらそんなんばっかだから大体分かると思うぞ。

一応説明しておくと、
m_: method_ の略。(member_かも?)
頭に付けたらインテリセンスでソートされて便利とか言っていた奴もどこかのスレにいたはず。
(メソッドなのかフィールドなのか一目瞭然ということらしい。既に出ているが頭のCもそういう理由)
他でもルール的に「頭に」何か付けるのはよくある話。
MSのVC++のローカル拡張なら __int64 とか、頭に __(二重アンダースコア) がついている。
googleだとprivateは頭に _ だったかな?
(なおgoogleはメソッドは動詞、フィールドは名詞を使えとか言っていたはず)
サフィックスはユーザーが勝手に使い、プリフィックスはシステム側でルールとして使う。

ulはそのまま unsigned long の略。Cなら元の型は数種しかないから想像はつくだろ。
DataCntはDataCountの略。短くする時には母音(aiueo)を抜く。(子音だけでも何となく分かるから)

そんなに経験の差って程の物でもないと思うが。
もっとも俺は無駄に頭に付けたり略したりしないので、このルールなら嫌いだが。
286 :
デフォルトの名無しさん (ワッチョイ a37b-jpzQ)
2017/02/04(土) 21:24:54.38 ID:XS0fIkHD0
補足
* グローバルスコープでアンダースコアで始まる
* アンダースコアで始まって大文字が続く
* 二重アンダースコアを含む
に合致する名前は規格で処理系によって予約されてるからコンパイラとそれに付属する標準ライブラリーを実装する人以外は使っちゃダメ
287 :
2017/02/04(土) 21:42:33.76 ID:pJMir97a0
>>285
> m_: method_ の略。
そんなわけないだろ...
288 :
2017/02/05(日) 00:12:45.37 ID:NucUcCyo0
グーグルはメンバ変数の最後に_
クソ過ぎわろた
289 :
2017/02/05(日) 00:14:15.03 ID:nBEZPMY50
>>288
結構あるくね?
インスタンスに付けるてのもよく見る
290 :
2017/02/05(日) 00:41:54.55 ID:mLcywPgQ0
>>288
え、なんで?
this->でもいいけど
291 :
2017/02/05(日) 00:56:14.90 ID:6qCMRDqV0
アンダーバーを変数に付けるのは慣れないと気持ち悪く見えるな
今は慣れたけどなんでついてるかなんて考えたことがない
292 :
2017/02/05(日) 00:58:41.61 ID:PGIZ+KFZ0
>>289
そこそこある
>>288 が井の中なだけ
293 :
2017/02/05(日) 00:59:09.67 ID:6qCMRDqV0
途中で投稿しちゃった
考えたことないなんて人も居るんじゃないの?と...俺が考えなさすぎてるだけか...

>>285
二重アンダーバーもよく見かけるけどなんでわざわざ二重つけてんだよ!!!っていつも思う

母音抜くルールわかりやすかった
変に短いやつ見付けたら母音考えたら良いんだね
294 :
デフォルトの名無しさん (スップ Sd9f-oUAv)
2017/02/05(日) 00:59:12.87 ID:rJZpHJC7d
m_xxxでもxxx_でもメンバである保証全くないからthis->派
295 :
2017/02/05(日) 01:01:31.92 ID:WpCJ+nTl0
メンバ変数は ぱっと見わかるように、
vector<string> _vstr;
前ハイフンつけてます
296 :
2017/02/05(日) 01:03:44.90 ID:mLcywPgQ0
前ハイフンはシステム予約とバッティングしやすいから後ハイフン派
297 :
2017/02/05(日) 01:04:30.83 ID:6qCMRDqV0
>>295
こんなルールのみだったらわかりやすいのに
298 :
デフォルトの名無しさん (スップ Sd9f-oUAv)
2017/02/05(日) 01:07:18.77 ID:rJZpHJC7d
変数はいいけどメンバ関数はどうすんの?
m_とか後ろ_とかつけるの?
299 :
2017/02/05(日) 01:27:23.42 ID:lu7sp4/h0
>>293
> 母音抜くルールわかりやすかった
まあここでも使われてるんだけどね。
kwskとか、ggrksとか。
300 :
2017/02/05(日) 01:29:06.53 ID:Yy4bNkpa0
バッティングしやすいと言われて避けてたけどかれこれ一回もしたことないから止めたわ
301 :
2017/02/05(日) 01:41:58.02 ID:nBEZPMY50
確率論かよ
プロのやることじゃないだろ
302 :
デフォルトの名無しさん (ワッチョイ a37b-jpzQ)
2017/02/05(日) 02:18:19.91 ID:cECtpBb50
避けてきたというのにバッティングしたこと無いから止めるって論理がちょっとおかしい。
お前サーバー管理者だけど今まで何も障害発生してないから要らないわ、解雇ね。
みたいな。
303 :
2017/02/05(日) 03:03:49.00 ID:uDzXyp1X0
using std;してるのに変数名にcount使ってるのはたまに見かける
そういう人は
int printf = 0;
とか書いてあっても気にならないんだろうか
304 :
2017/02/05(日) 04:04:57.35 ID:WpCJ+nTl0
いずれにしろわかると思うが
305 :
2017/02/05(日) 08:20:30.97 ID:sLo1ryYQ0
>>301
2chにプロが来ると思うのはおかしいでしょ
306 :
2017/02/05(日) 21:23:37.51 ID:QXihksJQ0
規格上、メンバ変数の先頭にアンダーバーつけてもシステム変数とバッティングしたりしないよ。
defineとか色々やってるとバッティングするのかもしれんけど、誰か例示してくれ
307 :
デフォルトの名無しさん (ワッチョイ cf24-1aN8)
2017/02/05(日) 21:50:38.91 ID:93yXMd2W0
マクロはスコープに従わない
これこそが諸悪の根源
308 :
デフォルトの名無しさん (ワッチョイ a37b-0yxR)
2017/02/05(日) 21:53:28.57 ID:cECtpBb50
先頭アンダースコアに大文字が続くとローカルスコープでも×
309 :
デフォルトの名無しさん (ワッチョイ cf24-1aN8)
2017/02/05(日) 22:00:58.46 ID:93yXMd2W0
operator "" がアンダースコアで始まらない
std::chronoの識別子までハネるコンパイラを
どう修正すべきか開発陣は詰んでるよね
310 :
2017/02/05(日) 22:11:51.14 ID:JZIpCKM70
cstddef無しでもdecltype(sizeof(int))が使えるぐらいだから別につんでない
311 :
2017/02/06(月) 01:33:36.44 ID:EE2HabAa0
初歩的な質問なんだけど
列挙体の列挙タグとかないやつってどういうときに使うの?
列挙タグないとどうしようもなくね?ってなってるんだけど
312 :
デフォルトの名無しさん (ワッチョイ a37b-0yxR)
2017/02/06(月) 02:14:43.60 ID:cswrm9tC0
>>311
単に定数値として使われてるだけだとともう
313 :
2017/02/06(月) 02:22:16.07 ID:EE2HabAa0
>>312
受けとる側を同じ型にしなくていいんかな?
基本的にint型らしいからint型で受けるものなの?
314 :
2017/02/06(月) 05:48:15.78 ID:GvVdGH4O0
enum {
 buf_size = 100;
 answer = 42;
};

みたいな感じで使うenumの話だよね。
大雑把に言って「数値リテラルと同じ場面で使える名前のついた整数」。
配列定義の要素数に使えるし、キャストなしに任意の整数型に入れられる。
315 :
2017/02/06(月) 09:45:50.45 ID:EE2HabAa0
>>314
まさにそれだ!!!
要素数か!!!そこ見落としてた

任意のやつに入れられるとしても
本来なら型は合わせるべきでってルールに反しててみたいな葛藤が繰り広げられてる
316 :
2017/02/06(月) 10:46:33.65 ID:eKJHyJFq0
>>315
Cならintの定数として使えばいいけど、C++ならテンプレートと組み合わせたときとかに型の違いが
出てきちゃうから、整数として使うならconstexpr intにしといたほうがいいよ。葛藤するぐらいならなおのこと。
317 :
2017/02/06(月) 16:13:16.68 ID:1+9LFiOi0
f(x,a)をx.f(a)と書くみたいな新しいC++の機能になる予定のがあったと思ったんですけど
この機能が何て言う名前か忘れたので教えてください。
318 :
2017/02/06(月) 17:15:37.05 ID:CRCNRbS80
統一関数呼び出しだったかな。
提案されてるだけで取り入れられるかどうかはまだ決まってない気がする。
C言語の既存APIに対応できないとかで揉めてるんじゃないっけ?
319 :
2017/02/06(月) 17:49:23.50 ID:1+9LFiOi0
ありがとうございました。
それが使いたいので気になってました。
320 :
デフォルトの名無しさん (ワッチョイ cf24-1aN8)
2017/02/06(月) 19:36:58.46 ID:8E+Xd5G50
>>310
それoperator ""と関係あるの?
321 :
デフォルトの名無しさん (ワントンキン MM1f-0yxR)
2017/02/06(月) 20:41:46.35 ID:XckUYI7fM
operator ""って何?
322 :
デフォルトの名無しさん (スプッッ Sd9f-PPsr)
2017/02/06(月) 20:42:45.84 ID:vzOme6YXd
ユーザ定義リテラル
323 :
2017/02/06(月) 20:49:53.47 ID:wweedNqsF
パイプラインでデータ送るってのはexeからexeってイメージで良いのかな?
324 :
デフォルトの名無しさん (ワントンキン MM1f-0yxR)
2017/02/06(月) 20:52:29.18 ID:XckUYI7fM
>>322
定義するときそんなの使うんだ。全く使わないし使いたいと思ったことがないからマジで知らんかった。
325 :
2017/02/06(月) 21:05:15.71 ID:R4XPB48C0
>>315
それ多分defineの代わり。
改善点は>>307くらいか?俺はあまり文法には詳しくないから分からんが。

てかお前、マジで上司に聞いた方がいいぞ。
そういうところ改善しろって話じゃないと思うのだが。
326 :
2017/02/06(月) 21:14:58.49 ID:VJg+IRhiM
>>323
パイプラインの定義による
普通はプロセス〜プロセスだけど自分で定義した関数に渡せる PowerShell みたいな奴もいるから
327 :
2017/02/07(火) 20:42:19.89 ID:cTLgA1N6M
>>293
古アラム語の記法で2000年以上の歴史があるよ
328 :
デフォルトの名無しさん (ワッチョイ cf24-1aN8)
2017/02/07(火) 20:54:19.60 ID:A56tKajQ0
>>326
pipeline burst SRAMってのがあったな
329 :
2017/02/07(火) 22:51:12.61 ID:LBkPe/Vnd
>>326
関数to関数ってdllと何がちがうんや
330 :
2017/02/08(水) 01:04:48.39 ID:6rskJv7R0
Linuxのコマンドでも、同一プロセス内のコマンドと、別プロセスを起動するコマンドの、2種類ある

10万行のシェルスクリプトの実行時間でも、大きな差がある。
for 9分
while 5秒
awk・perl 0.1秒
331 :
2017/02/09(木) 11:43:50.96 ID:18LIUJ/70
STLはどの程度使いこなせるのが一般的と思いますか?

書籍、簡単でいいのがなくて困ってます。
C++難しすぎ。
332 :
デフォルトの名無しさん (スップ Sd72-Q8BR)
2017/02/09(木) 11:44:59.53 ID:ABH38W/Id
↓STLというものは存在しない
333 :
2017/02/09(木) 12:39:20.71 ID:mjUCD5MK0
>>331
毎日cpprefjp眺めとけばそのうち結構覚えてる
334 :
2017/02/09(木) 13:03:54.52 ID:Wn84KVBK0
一般的なんてぼんやりした領域のことを聞かれても困るわ
まC++をC++として使うつもりならコンテナ単体とコンテナとアルゴリズムの組み合わせくらいは
なんとなくでも使えるようになっていて欲しいな
335 :
2017/02/09(木) 13:09:01.92 ID:4sYnDBFk0
入門書を何冊も試すより『プログラミング言語C++』第4版を手に入れて
先頭からのんびり読み進めながら、後半の標準ライブラリの部分も拾い読み、
という方が費用対効果は大きいかも。1万円近くするお高い本だけど。
336 :
2017/02/09(木) 13:22:05.49 ID:erARudvS0
バカは一気に覚えようとするから
そんなん受験くらいやろ
実践は身につけんと意味ない
337 :
2017/02/09(木) 13:31:32.51 ID:DP2Fqfwxa
必要になったとき調べながら使ってれば自然と覚える
338 :
2017/02/09(木) 14:05:14.86 ID:Ra4XvV1bp
STL覚えるのに金払うのは勿体無い気がする
cpprefjpをざっと眺めてどんなものがあるか何となくレベルで把握→実際に使ってみる ってのを繰り返すべし
339 :
2017/02/09(木) 15:54:11.28 ID:Ccc/L2ZJ0
VC++ なんですが typedef 絡み(スコープ?)で質問です。

typedef int macaddress_t[6];

void show(macaddress_t m) {}

int test() {
  macaddress_t m;
  show(m);
}

なのですが、
error: 'macaddress_t' was not declared in this scope
となってコンパイル通りません。

void show 〜の部分を

extern "C" {
  void show(macaddress_t m) {}
}

って括ると大丈夫になります。
これは何が起きているのでしょうか。
340 :
2017/02/09(木) 16:42:39.82 ID:Ccc/L2ZJ0
補足
extern "C" なし時にエラーが出るは void show の行です。

C++では引数は別スコープ?
341 :
2017/02/09(木) 17:01:06.12 ID:ljwNeD6M0
それだけだとエラー再現しないから
なんか他でやってるんじゃないの?
342 :
デフォルトの名無しさん (スップ Sd72-Q8BR)
2017/02/09(木) 17:13:47.07 ID:ABH38W/Id
test関数が.cにあるとか
343 :
2017/02/09(木) 21:17:24.37 ID:Ccc/L2ZJ0
あ、.cpp じゃなくて .c  です。
これが大きいんですか?
344 :
2017/02/09(木) 21:21:30.92 ID:2NLO6FImK
>>343
.cで定義した関数をC++で使うにはextern "C"で宣言しないといけない。
345 :
2017/02/09(木) 21:39:45.68 ID:H/sFxM1Na
>>331です。皆さんありがとうございます。

http://www5c.biglobe.ne.jp/~ecb/cpp/cpp00.html
でSTLを勉強中ですが投げ出しそうです。
独習C++は理解できましたが
プログラミング言語 C++は厳しいです。
vector for_each random_shuffle sort
の動作を確認中です。
random_shuffleが毎回同じ値を返すのですが
どうやったら毎回異なる結果を返せますか?
346 :
2017/02/09(木) 21:47:39.04 ID:0i4innvNM
>>345
3番目の引数に数字入れろ
random_shuffleじゃなくてshuffle使え
HackerRankのSTLのコーナーでやれ
以上
347 :
2017/02/09(木) 23:08:25.11 ID:mjUCD5MK0
>>345
random_shuffleは非推奨になったから別のを使え
for_eachは特別な理由が無ければ範囲forを使え
348 :
2017/02/09(木) 23:17:44.28 ID:Tzm2iYcD0
C++11とかC++14とかC++17とかあるけど、C++はまだ開発途上なの?
349 :
2017/02/09(木) 23:23:36.93 ID:lbPmSuZmp
はい
350 :
2017/02/09(木) 23:28:37.45 ID:Ra4XvV1bp
進化なきソフトウエアに未来はないのだ
351 :
2017/02/09(木) 23:50:09.48 ID:mjUCD5MK0
更新が止まるのは需要が無くなったときだ
352 :
2017/02/09(木) 23:55:51.94 ID:Tzm2iYcD0
ちょっと開発工程表出してくれる?
瑕疵期間は完成版リリース後1年ね。
もちろん予算は増やせないよ。
353 :
2017/02/10(金) 00:02:15.87 ID:X8zCTp9W0
クライアントはよりどりみどりだから
354 :
2017/02/10(金) 00:04:38.63 ID:DjvLDgGn0
唐突に始まる基地外顧客ごっこやめて
355 :
2017/02/10(金) 00:06:53.18 ID:Rg0hWeb00
型変換難しすぎます
すぐコンパイラ先生に怒られます
356 :
2017/02/10(金) 00:08:58.24 ID:DjvLDgGn0
すぐ怒ってくれるコンパイラ先生に感謝感激雨あられですね
357 :
2017/02/10(金) 00:10:01.98 ID:ynOefsL0a
サクラダファミリア
358 :
2017/02/10(金) 00:16:30.32 ID:Rg0hWeb00
普通の型からマイクロソフト定義の専用のきついわ
あんなん初めから使うなよマイクロソフトさん
359 :
2017/02/10(金) 00:19:08.11 ID:Yd/z+i5f0
そのうちどれが何をdefineしたものかは大体察しが付いてくる
360 :
2017/02/10(金) 16:18:59.44 ID:ovuuNq0I0
>>344

==ここから==
typedef int macaddress_t[6];

void show(macaddress_t m) {}

int test() {
  macaddress_t m;
  show(m);
}
==ここまで==

ひとつのソースファイルなのですが、
全体を extern "C" で括るらともかく、なんでvoid show〜の行だけ括らないといけないのか、そこが理解できないんです
361 :
2017/02/10(金) 18:37:08.04 ID:bnzKLGGx0
NDKでC++
でwregex使おうとしたら
コンパイルできないし。
wchar_tが4なんだな。
codecvtもないし

まだ早すぎたのか。
362 :
2017/02/10(金) 18:43:05.49 ID:HPN+NYiaK
>>361
NDKでBoost使えるか試してみてや。
363 :
デフォルトの名無しさん (ワッチョイ 277b-VpYz)
2017/02/10(金) 20:32:59.12 ID:MRcACxyw0
>>361
wchar_tはWindows以外だいたい4だぞ
364 :
2017/02/10(金) 20:59:06.21 ID:kKjy5FQnd
>>360
試してみたいからどっかにソリューション一式アップしてみ?
365 :
2017/02/10(金) 21:53:45.98 ID:m9Xytejo0
2だと合成文字どころかcodepointすら1つでは表現出来ない、半端仕様
それならもういっそutf-8でいいじゃないか
366 :
2017/02/10(金) 22:01:34.71 ID:YdIN6n2bM
>>360
釣果はどうだい?
367 :
2017/02/10(金) 22:09:36.57 ID:WMmjWeX+0
文字を「文字列の先頭」みたいな形でしか表せないのは用途によっては面倒くさい。
368 :
2017/02/11(土) 00:41:43.23 ID:yp4PwuMD0
そうだな
だから367はもうUnicode使わないようにしないと
369 :
デフォルトの名無しさん (ワッチョイ 367b-ZOaM)
2017/02/11(土) 13:11:50.51 ID:I0QTm/K50
>>360
ひとつの.cppの中?それならextern "C"は必要ないよ
.cと.cppをリンクするときは.cで定義した関数は.cpp側でextern "C"しなけりゃいけない
キーワード:マングリング
370 :
2017/02/11(土) 18:00:41.65 ID:mOx2IQFJ0
>>362
Boostビルドの前に
Android Studioでinclude pathの設定が
わからなくて
お手上げ状態。
371 :
2017/02/11(土) 19:33:50.14 ID:I2Nt/svY0
C++の最大の難関は環境構築
372 :
2017/02/11(土) 20:04:39.39 ID:2PZ2/Gs1a
VCぇ。。。
373 :
2017/02/11(土) 20:10:03.55 ID:7410wxb3d
vcってなんなんですか
374 :
2017/02/11(土) 20:24:54.87 ID:2PZ2/Gs1a
VisualC++の略。
ダイアログアプリ以外は全然Visualじゃ無いけどね。
でもそんなの他のC++処理系も一緒。
(むしろダイアログアプリすら別に入れないと出来ない。そこがライブラリ選べる自由度の代償)
VB的にC++使えたC++Builderは死んだのだ。。。
他の環境入れる辺り、GUIは関係無いだろうけど、GUI以外にもライブラリがインストール時に全部入るので環境構築は一番楽。

あ、VCでも.netならVB的に使える。
文法が独特になって、C#使った方がマシだが。
375 :
2017/02/11(土) 23:51:53.14 ID:I2Nt/svY0
MSVCとQtって組み合わせられるの?
376 :
2017/02/12(日) 03:21:26.71 ID:9ZkThf7dp
組み合わせるの意味がよくわからんけどコンパイラにmsvcは使える
377 :
2017/02/12(日) 15:27:47.18 ID:YlSn9Fu90
vcっていう人とvc++っていう人がいる
378 :
2017/02/12(日) 18:15:47.67 ID:2aJLYPTP0
build.gradleで

cmake {
cppFlags "-std=c++11 -frtti -fexceptions -I${project.buildDir}/../src/main/cpp/include"
}

としたらshared_ptrやらlexical_castは動いたわ。
Boostビルドやインテリセンスが動かない問題は解決できなかったけど
379 :
2017/02/12(日) 18:35:37.25 ID:ElZAn973a
>>377
VC6の時代は入門書には大体VCって書いてた。
あの頃がVC全盛期。
380 :
2017/02/12(日) 18:51:10.52 ID:YlSn9Fu90
>>379
実はVC6が仕事で使ったのが最後w
MSCもVer.6が良かったなぁみたいな。
381 :
2017/02/13(月) 08:28:15.44 ID:w9FuiKwSd
fopenと_sの違いを教えてクレメンス
382 :
2017/02/13(月) 10:32:02.37 ID:dreuS3Zka
_sはセキュリティのs
383 :
デフォルトの名無しさん (スプッッ Sd72-Q8BR)
2017/02/13(月) 13:50:40.30 ID:jR+QOQ4bd
コンストラクタの関数トライブロックのイニシャライザで発生した例外をキャッチしても
そのままコンストラクタの外へ例外が飛び出るのですがそういうものですか?
384 :
2017/02/13(月) 14:12:07.77 ID:CDuxjgvH0
>>381
そんなんがあんのかorz
385 :
2017/02/13(月) 14:22:10.35 ID:83glS84B0
>>383
そういうもの
386 :
デフォルトの名無しさん (スプッッ Sd72-Q8BR)
2017/02/13(月) 14:41:07.98 ID:jR+QOQ4bd
そういうものですか
387 :
2017/02/13(月) 22:21:47.14 ID:0ypMjrgpr
メンバーの初期化が失敗してる状態で続行されたら迷惑以外の何物でもない
388 :
2017/02/13(月) 22:30:08.50 ID:2WrcuwMzM
catchブロックは必ずthrowで終わらないといけなくて、省略すると自動でrethrowするみたいね
389 :
2017/02/13(月) 22:32:22.26 ID:riwEWnOT0
COM登録難しい
自動で作られる_p.cとか_i.cファイルってなんなんだ
IIDやCLSIDとか難しすぎる
390 :
2017/02/14(火) 00:03:42.00 ID:IGsQOpXK0
>>382
secure
391 :
2017/02/14(火) 09:38:53.47 ID:dFgeiJZpd
idlをビルドしたときに作られる _p.c _i.c .h はコンパイラによって中身に差は出てくるけど
内容までは気にしなくて良いもの??
392 :
デフォルトの名無しさん (スップ Sd72-RX11)
2017/02/14(火) 11:14:58.25 ID:T4QzsHFxd
void hoge
{
static string a;
}

void hage
{
thread_local string b;
}

int main()
{
hoge();
hage();
}
とした場合aとbのデストラクタが呼ばれる順番の規定はどうなってますか
393 :
2017/02/14(火) 12:12:14.85 ID:dFgeiJZpd
>>392
cプラスはデストラクタは定義しないとないんじゃなかったっけ
プログラム終了時は呼ばれるのだろうか
394 :
2017/02/14(火) 12:20:58.70 ID:mNVQx7P30
シングルスレッドなら構築の逆順
395 :
2017/02/14(火) 12:24:34.00 ID:cBGBFD/aM
マルチスレッドでも同じだで
396 :
デフォルトの名無しさん (スップ Sd72-RX11)
2017/02/14(火) 12:26:56.53 ID:T4QzsHFxd
gcc6.2でやってますが順番を変えてもaのデストラクタが先に呼ばれます
397 :
2017/02/14(火) 13:00:32.03 ID:he6YB8dMH
そいつら main と関係ないとこで呼ばれてるべ
しかし記述順にかかわらず b が先じゃないとまずいんじゃないの
398 :
デフォルトの名無しさん (スップ Sd72-RX11)
2017/02/14(火) 13:15:37.14 ID:T4QzsHFxd
ちゃんとmainのそれぞれの関数内で順番通りコンストラクタは呼ばれてます
デストラクタは逆順にならないです
399 :
2017/02/14(火) 13:39:07.66 ID:aNlWux3V0
>>392
3.6.3 Termination 段落1
『The completions
of the destructors for all initialized objects with thread storage duration within that thread are sequenced
before the initiation of the destructors of any object with static storage duration.』
400 :
デフォルトの名無しさん (スップ Sd72-RX11)
2017/02/14(火) 14:23:27.77 ID:T4QzsHFxd
そのスレッド内のスレッド記憶期間を有する全ての初期化されたオブジェクトに対するデストラクタの完了は、静的記憶期間を有するオブジェクトのデストラクタの開始前に順序付けられる。


thread localはstaticの前に順序付けられる?
401 :
2017/02/14(火) 14:33:18.78 ID:aNlWux3V0
thread_localのデストラクターの完了はstaticのデストラクター開始前となる
つまりthread_localのデストラクターが先
402 :
2017/02/14(火) 14:43:39.35 ID:DbhRLpyW0
英語読めねーザコにはC++は早い
403 :
デフォルトの名無しさん (スップ Sd72-RX11)
2017/02/14(火) 14:54:00.41 ID:T4QzsHFxd
でもthread localのデストラクタが後に呼ばれているようです
404 :
2017/02/14(火) 17:04:24.30 ID:NG72BBfs0
clangだとどう?
Wandbox等でも試せる
405 :
2017/02/14(火) 18:47:20.33 ID:KObDNYqgd
テストについて考えてるんだけど難しい
ソフトウェア開発難しくないか
一番ダメなのは俺が方向性を定めぬまま決めてしまっていることだろうが
406 :
2017/02/14(火) 20:35:30.08 ID:lntB2yLX0
仕事でやってるなら
(まさか会社で物事を決める立場にある人がこんな質問しているとは思えないので)
先輩に聞くか、会社の方針に合わせるしかないよ
今までどのようにやってきているかを見て、同じようにやるしかない

趣味でやっていて、オープンソースか何か、チームの一員として参加しているのなら
やはりチームの方針に合わせるしかないよ
今までどのようにやってきているかを見て、同じようにやるしかない

趣味でやっていて、個人で何か作っているっていうんなら、テストはする必要ないよ
個人開発はいつでも時間が圧倒的に足りてないから、テストなんか真面目にやってたら
いつまでたってもソフトが完成しない
一般的にメインのコードよりもテストコードのほうが量が多い
1万行のコードに対して10万行のテストコード・・・とかなったらもうソフトが完成しない
いろいろいう人もいるだろうけど、ここは現実問題を見たほうが良い
・・・お金取るなら別だけど
407 :
2017/02/14(火) 20:38:17.32 ID:aNlWux3V0
ふむふむ、つまり長文=低能
408 :
デフォルトの名無しさん (ワッチョイ e292-CIv3)
2017/02/14(火) 20:47:51.47 ID:kM+db1DC0
>>404
VC2017だと必ずthread_localが先にデストラクトされます
gcc5.4.0だとコンストラクタと逆順になります
clang3.8.1だとコンパイルできません
409 :
2017/02/14(火) 21:15:15.99 ID:KObDNYqgd
>>406
まさに大当たりなんだな
ソフトウェア開発こんな難しいとは思ってなかった
何が難しいって意見が違うところが多くて困る

結合テストどうすりゃええんやってマジ困ってるわ
単体やシステムはなんとなくわかるんだが
410 :
2017/02/14(火) 21:26:41.34 ID:5RYrxuibr
VC2017って来月9日に出るやつか
411 :
2017/02/14(火) 21:43:47.89 ID:w8MjV4wUH
大前提として、100%不具合が存在しないことを保証することは現実的には不可能
その前提の上で、如何に効率良く目的に合った不具合を検出して修正できるかがテストの肝

何か拠り所が欲しいならJSTQBの用語集でも読んでみたら良いんじゃね
412 :
2017/02/14(火) 22:01:03.71 ID:fgjpd/Zj0
バグを見つけるためのテスト
413 :
2017/02/15(水) 00:15:28.29 ID:urFAvqLFH
バグを追い出すためのテスト

隠れ家を重点的に叩く
414 :
2017/02/15(水) 06:47:06.21 ID:zgJtAmDRM
追い出されたバグは違うモジュールに...
デスマーチあるある
415 :
2017/02/15(水) 07:31:50.49 ID:PfwOrtkrd
>>411
以下に効率よくってのポイントっぽいね
結合テストシステムテストの差がいつも怪しい
416 :
2017/02/15(水) 07:41:57.48 ID:XaX5xvK80
>>415
システムテストはシステムレベルの仕様に基づいてテストすればいいんじゃないかな。その際、中身がどのようにモジュールに分割されてるかは意識しない。
結合テストでは、システムレベルの仕様では見えないモジュール同士のインターフェースを中心に行う。
417 :
2017/02/15(水) 07:48:01.33 ID:PfwOrtkrd
>>416
dllを差し換える作業を今してるんだけどその結合テストとなると
diiを呼び出す口を呼び出したときにどうなるか
それだけ見ればよいってことで良いかな?
418 :
2017/02/15(水) 10:29:03.40 ID:PfwOrtkrd
strcpy_sってなんかMSDNの記載と挙動違うくない?
第三引数ぬるのときにエラーになる
419 :
2017/02/15(水) 11:05:06.67 ID:t9yAVOgj0
strSourceがNULLだとEINVALを返すって書いてあるけど
420 :
2017/02/15(水) 11:10:10.21 ID:PfwOrtkrd
>>419
リリースビルド実行してもそんなことなく落ちてしまう
421 :
2017/02/15(水) 11:53:58.00 ID:LTs78uDW0
If strDestination or strSource is a null pointer, or if the destination string is too small,
the invalid parameter handler is invoked, as described in Parameter Validation.
422 :
2017/02/15(水) 12:06:28.33 ID:PfwOrtkrd
>>421
それ読んでるけど表ではコピー先には0で返り値でエラーコードが返ってくると記載がある
その文章の後半の実行の継続が〜って箇所がこれなんだと読んだんだが
423 :
2017/02/15(水) 12:14:45.33 ID:LTs78uDW0
パラメータバリデーションも読めばわかる
その中で実行継続が選択された場合はエラーコードが返る
424 :
2017/02/15(水) 12:16:06.93 ID:tDlcUFQu0
>>422
記載内容を確認したいのでURL張って
425 :
2017/02/15(水) 12:18:53.94 ID:LTs78uDW0
ググればトップに出てくるページも探せない奴は参加しなくて良い
426 :
2017/02/15(水) 12:25:15.30 ID:7fF4cQx4d
>>423
実行継続ってどうやってするんだ...
リリースビルドのやつだとそのまま落ちちゃうけどもそれとは違うの?
427 :
2017/02/15(水) 12:29:16.41 ID:LTs78uDW0
Invalid Parameter Handler Routineを差し替える
428 :
2017/02/15(水) 12:34:47.36 ID:7fF4cQx4d
なんか手のつけたことのないやつに深入りしそうだ
ぐぐりちゅう
これ普通にだと落ちるのが正常ってことなんかね...?

>>424
https://msdn.microsoft.com/ja-jp/library/td1esda9.aspx
429 :
2017/02/15(水) 12:35:51.87 ID:LTs78uDW0
レジストリ弄ってワトソン出さない方法もあるらしいけどやった事ない
430 :
2017/02/15(水) 12:45:49.37 ID:7fF4cQx4d
>>429
これって初期設定だと実行継続みたいなのをぽちっとしないといけない
それがデフォルトってことなんね
なんか思っていた動作と異なる
くそやろう...
431 :
2017/02/15(水) 14:54:33.30 ID:7fF4cQx4d
で....できない
http://srz-zumix.blogspot.jp/2012/08/strcpys.html?m=1
これ参考にしてるんだけどそのままコピペだとできない
助けてクレメンス
432 :
2017/02/15(水) 15:37:40.84 ID:LTs78uDW0
#include <string.h>
#include <errno.h>
void handler(
const wchar_t * expression,
const wchar_t * function,
const wchar_t * file,
unsigned int line,
uintptr_t pReserved)
{
}

int main()
{
char a[20];
_set_invalid_parameter_handler(handler);
strcpy_s(a, 20, NULL);
printf("%d\n", EINVAL == errno);
}
433 :
2017/02/15(水) 18:51:08.84 ID:rJwzLFnhr
>>418
スレ違いは去れよ
434 :
2017/02/15(水) 20:32:24.80 ID:tDlcUFQu0
>>431
何が起きてるのかわからないから助けようがない
ブレークポイント張って動作は追った?
435 :
2017/02/17(金) 16:55:38.65 ID:oBsnwbhT0
>>430
_s関数の設計思想がプログラマが想定してない状況で動作を継続しないだもの
NULLが来るのが想定内だってんならデバッグ用の_set_invalid_parameter_handler()なんか使わず最初からstrcpy_s()を呼ぶな
436 :
デフォルトの名無しさん (ワッチョイ 5f17-P9CU)
2017/02/18(土) 02:10:37.30 ID:BjwZuIbZ0
Electronic Artsの標準ライブラリEASTL
https://github.com/electronicarts/EASTL

3.05.02 release
ようやくunordered_set, unordered_map が追加された。
437 :
2017/02/18(土) 09:00:37.40 ID:GNecI7Ewr
『Electronic Artsの標準ライブラリEASTL』
俺ライブラリのくせに「標準」付けるところが馬鹿っぽい
標準って日本語の意味も理解しない低能
438 :
2017/02/18(土) 09:10:35.91 ID:IbdRLC160
「標準ライブラリ実装」なら満足?
439 :
2017/02/18(土) 11:10:10.00 ID:GNecI7Ewr
Electronic Artsによる標準ライブラリの一部分の実装 EASTL
440 :
2017/02/18(土) 14:17:54.25 ID:cCamoDUt0
STLのSはStandardだからな
英語出来ない馬鹿なのか
441 :
2017/02/18(土) 17:51:18.18 ID:DE0SU//Ra
Sugoi Tsuyoi Library
442 :
2017/02/18(土) 18:20:17.46 ID:oLH7rESg0
サブセットのなにがいけないのか
443 :
2017/02/18(土) 19:49:22.55 ID:fWF8oK3d0
処理系を作っているなら「STL実装」を名乗ってもいいの?
444 :
デフォルトの名無しさん (ワッチョイ 0f7b-qzUy)
2017/02/18(土) 20:29:26.58 ID:bU7vWvgF0
「Electronic Artsの標準」って言ってるだけで何の問題もないと思うが?
Standardという言葉を必要以上に狭く解釈するほうがバカみたい
445 :
2017/02/19(日) 09:55:36.66 ID:2DCCXMeS0
strstreamでwstringを使う方法はありますか?
446 :
2017/02/19(日) 09:59:54.67 ID:sJkQ60Iy0
はい。有ります
447 :
2017/02/19(日) 10:17:39.90 ID:sJkQ60Iy0
ちなみにこんな感じだろうたぶん
https://ideone.com/JpKEZ7
448 :
2017/02/19(日) 11:16:43.37 ID:2DCCXMeS0
それは(w)stringstreamではないですか?
strstreamのヘッダもいらない気がします。

strstreamでwstringを利用したいのですが
独習C++のサンプルでもchar配列しか扱って
ません。
449 :
2017/02/19(日) 11:50:16.48 ID:kiv7S6GK0
strstreamってdeprecatedでは
450 :
2017/02/19(日) 12:02:45.47 ID:2DCCXMeS0
>>449
visual studioのヘルプ見たらそんな気がしました。
おとなしくwstringstream使っとくべきですかね。
451 :
2017/02/19(日) 21:37:05.31 ID:XrGtgUCH0
Singletonでのthread終了時にjoinで固まる
http://suzukit14.hateblo.jp/entry/2015/06/24/111000

これとまったく同じ問題に突き当たりました。
最後に書かれているように、detach()で確かに無事終了できますが、
なんかマズかったりしますか?
452 :
2017/02/19(日) 22:04:43.50 ID:s/Z6tyYFr
良く読んでないけと
破棄されたm_endを参照してなんかうれしいの?
453 :
デフォルトの名無しさん (ワッチョイ eb9a-XQTV)
2017/02/19(日) 22:07:24.99 ID:qRKd/jmw0
スレッドの終了を待たずにプロセスが終了しても問題ないならOK
454 :
デフォルトの名無しさん (ワッチョイ fb7b-Mjmn)
2017/02/19(日) 22:15:23.67 ID:Av0JmT9x0
>>451
そのインスタンスのメンバーを使用するコードがdetachしたスレッド内にある場合はデストラクタが呼ばれた後にそのメンバーを参照して未定義動作になる可能性がある
455 :
2017/02/19(日) 22:22:05.77 ID:XrGtgUCH0
皆さん、ご回答、ありがとうございます。

>>454
まさにそれと思しきクラッシュが終了時にランダムで発生することに気付きました(汗)
detach()もjoin()もせずに終わろうとしたときに百発百中で出るのと同じ「R6010 -abort() has been called」というエラーです。

Sleep()でも呼んで十分に待てば、実用上は問題ないんでしょうけど、
こういう曖昧なコードは嫌いなので、なんとかキレイにスパッと終わりたいです・・・。

Singletonが適したクラスではあるのですが、
この問題をうまく裁けないようであれば、諦めて通常のクラスにすることを検討します。
456 :
デフォルトの名無しさん (ワッチョイ fb7b-Mjmn)
2017/02/19(日) 22:32:17.29 ID:Av0JmT9x0
>>455
コンパイラは?MSVC2015使っててそんな問題に当たったことないんだけど
どうしても回避できないなら(MSVC2012には無かったかもしれないけど)std::quick_exit使う事も検討してみたら?
457 :
デフォルトの名無しさん (ワッチョイ eb9a-XQTV)
2017/02/19(日) 22:45:35.14 ID:qRKd/jmw0
俺なら、pthread なり直接使って
クリーンアップハンドラ登録する
458 :
2017/02/19(日) 23:08:15.96 ID:XrGtgUCH0
>>456
Visual Studio Express 2013 for Windows Desktop Update5 です。

http://stackoverflow.com/questions/10915233/stdthreadjoin-hangs-if-called-after-main-exits-when-using-vs2012-rc

ここを見てると、どうも2015では直ってそうですね。

quick_exitのこと教えてくださってありがとうございます。
知りませんでした。
でも、VS2015に移行するのが一番キレイに解決するので、そうします。

これまで、特にVS2015に移行する理由がなかったので2013のままでしたが、
おかげさまで理由ができました。
ありがとうございました。
459 :
2017/02/20(月) 01:50:05.39 ID:1uwDjjWZ0
ところで、>>451のサイトのコードですが、
m_end変数の型がstd::atomic<bool>となっています。
わざわざatomicクラスを使わなくても、

m_end = true;

は通常のboolでもアトミック操作だからかまわないですよね?
何か意図があるのでしょうか?
460 :
2017/02/20(月) 02:43:42.07 ID:kFvPCPcM0
コンパイラが省略するかもしれないから
461 :
2017/02/20(月) 03:08:55.41 ID:n+W7/EeT0
volatile ではダメなん?
462 :
デフォルトの名無しさん (ワッチョイ fb7b-Mjmn)
2017/02/20(月) 04:17:03.74 ID:8FjaGYLq0
>>461
わざわざ保証されてないものを使用したあなら好きにしたらいいんじゃない?
タイミングが重要なものに使用したらすぐ破綻するけど。
463 :
2017/02/20(月) 06:33:50.28 ID:8HBU9+MH0
大きな整数だと読み書き操作のアトミック性が保証されないから
std::atomic を使わなきゃならん。
必要ないかも知れないけど、同じ書き方でboolでもlong longでも
正しく動くようにテンプレートを使った標準的な書式にしておく、
ってのがC++流と言えるのかな。

あと、std::atomic<bool>と書いてもboolを直に代入しても
実行時には同じ速度で動く(ようにatomicを実装する)から損はない、
というのもね。
464 :
2017/02/20(月) 19:43:56.16 ID:1uwDjjWZ0
ご回答、ありがとうございます。

>>463
>大きな整数だと読み書き操作のアトミック性が保証されない
そうだったんですか!
それはatomicが要りますね。

>実行時には同じ速度で動く(ようにatomicを実装する)から損はない
オーバーヘッドがないのは素晴らしいですね。

気を付けます。
ありがとうございました。
465 :
2017/02/21(火) 07:47:04.43 ID:t35fjyuz0
>459
>何か意図があるのでしょうか?

サイト書いた人間死んでるの?
それとも生きてるの?

生きてるならなんでわざわざ赤の他人に他人の意図を聞くんだろうこの人
本人に直接聞けば一番早いんじゃないの
そいつの意図なんてのは書かない限りそいつしか知らないし分からないじゃん
466 :
2017/02/21(火) 08:17:30.11 ID:y0kzTLQNM
終わった話になに頓珍漢な言いがかりつけてるんだよ w
467 :
2017/02/21(火) 09:41:12.86 ID:yRuALuONp
お受験の季節だし、国語の時間が辛かったんだと思います
許してあげてください
468 :
2017/02/22(水) 19:13:31.66 ID:M+n+vM/b0
以下のようなマルチスレッドプログラムを書いたのですが、もっとエレガントに書くことはできないでしょうか?
std::atomic<T>を使ったら可能でしょうか?

■メンバ変数

 std::mutex m_Mtx;
 std::string m_str;

■生産者スレッド

 while( true )
 {
  lock_guard<std::mutex> Lock( m_Mtx );
  
  m_str += "何らかの文字列";
 }

■消費者スレッド

 std::string str;
 
 {
  lock_guard<std::mutex> Lock( m_Mtx );

  str = m_str;
  
  m_str.clear();
 }
469 :
2017/02/22(水) 20:12:00.06 ID:OuXxGo6Bp
それで必要十分だと思うよ
stdがついたり付いてなかったり、変数が大文字始まりだったり小文字始まりだったりするのが気持ち悪いけど
470 :
デフォルトの名無しさん (ワッチョイ fb34-wIi3)
2017/02/22(水) 20:31:27.26 ID:3B67WX1e0
>>468
強いて言うなら
str.swap(m_str);
かな。
471 :
デフォルトの名無しさん (ワントンキン MM7f-Mjmn)
2017/02/22(水) 20:40:10.22 ID:W153DobNM
そんな動作が必要なプログラムを書いたことがないし、どんなケースで必用になるのか想像もつかないけど、その動作が正なのであるばそれでいいんじゃない?

m_ って付いてるってことはメンバー関数なんだろうけどデストラクタどうするんだろうとか、色々気になる所はあるけど。
472 :
2017/02/22(水) 21:09:30.45 ID:TTVI91Rf0
バックグラウンドで通信するならおおよそこんな感じになるんじゃないの
473 :
2017/02/22(水) 21:38:29.81 ID:M+n+vM/b0
>>470
ご回答、ありがとうございます。

>>472
その通りでございます。

>>470
なるほど!
ということは、atomic<T>を使って

■メンバ変数

 std::atomic<std::string> m_str;

■生産者スレッド

 while( true ) m_str += "何らかの文字列";

■消費者スレッド

 std::string str;
 str.swap( m_str );


と、超エレガントにできそうですが、この場合、swap()でのアトミック性ってどうなるんでしょう??
474 :
デフォルトの名無しさん (ワッチョイ fb34-wIi3)
2017/02/22(水) 21:46:47.39 ID:3B67WX1e0
>>473
心配なら
m_str.swap(str);
でいいんじゃね?
475 :
2017/02/22(水) 23:00:07.25 ID:M+n+vM/b0
>>474
あ、そうですね!
それならより安心ですね。
テストしてみて問題なかったら、それでいきます!
ありがとうございました。
476 :
2017/02/23(木) 00:46:03.89 ID:+OueSnEu0
ハンガリアンキンモー
477 :
2017/02/24(金) 08:16:42.09 ID:DyzPRDD50
見たことないのですがポインタ(の
入った変数)を参照することって可能
ですか?
int* &みたいなことです。
478 :
2017/02/24(金) 09:58:19.90 ID:bBhQmgr7M
>>477
出来ます。テンプレートで使われるのが一番多いかな?
func(T& dst)に対してint*を渡すみたいなパターン
479 :
2017/02/24(金) 10:28:09.00 ID:e/BP7pNwa
それは初心者用質問スレで訊くのが合っていますよ
480 :
2017/02/24(金) 11:40:07.36 ID:9xRtAprE0
auto&&とint&&は機能的に別物と考えていいのかな。
int&&は右辺値参照を実現する記法で、auto&&は参照の参照を実現するための仕組みという認識なんだけど。
481 :
2017/02/24(金) 12:43:18.76 ID:quEFnRbB0
人に聞く前になぜ自分でやってみようとは思わないの?
482 :
デフォルトの名無しさん (スップ Sd4a-36q6)
2017/02/24(金) 13:15:08.70 ID:u1ntmSSgd
試してもその環境では動くということしか確かめられないから
483 :
2017/02/24(金) 22:09:09.79 ID:OddQnmIq0
実現するのが目的ではないだろうけど
auto &&のauto部分がX &に解決されるのはどうも気持ち悪い
484 :
2017/02/24(金) 22:22:18.18 ID:4ewDjGBZ0
>>477
できる,二重ポインタより分かりやすい
485 :
2017/02/25(土) 00:02:24.64 ID:5D288ePc0
>>480
テンプレートの型パラメータと普通の型の関係と同じようなもの
機能的に完全に別物というより一段上に追加機能のレイヤーがあるかないかの違い
486 :
2017/02/25(土) 00:13:15.17 ID:Bto43eGs0
まあautoの部分はXにもX*にもX&にも解釈可能だからトーシローは錯覚する罠
487 :
2017/02/25(土) 12:29:14.82 ID:xXEZYycv0
auto&&はreference collapsingっていう仕組みらしいけど江添氏はこの機能の解説してないんだよね。
だから右辺値参照の仕組みと透過性があるものなのだと思ってた。
右辺値参照の仕組みを理解すればおのずと理解できるもんだと思ってた。
488 :
2017/02/25(土) 13:33:16.56 ID:THbYlaQi0
489 :
2017/02/25(土) 18:59:53.13 ID:A0aZ5Z9Sa
江添はそう言ってる?
490 :
2017/02/25(土) 21:48:53.39 ID:r3+UW6Ch0
江添の説明はこれだな
『テンプレート実引数推定のルールで型推定が行われる』
『できるだけ普通のプログラマーの常識に合わせるために、とても複雑になっている』
以上
491 :
2017/02/27(月) 14:18:25.09 ID:XaQXd7Ck0
libc++ の挙動にバグっぽいものを見付けたんで cfe-dev に投げたんですが
ttp://lists.llvm.org/pipermail/cfe-dev/2017-February/052807.html
応答がありません…もっとふさわしい場所ってあるんですかね?

っていうか std::is_abstract が純粋仮想関数入りのクラステンプレートに対して
false 返すのって規格に照らしてどうなんでしょう?
492 :
2017/02/27(月) 18:50:50.34 ID:mrZfm/tmr
テンプレートクラスならともかくクラステンプレートならコンパイルエラーにならないとおかしい
ちなみにただのバグにしか見えない
493 :
2017/02/27(月) 20:02:23.96 ID:XaQXd7Ck0
なるほど、テンプレートクラスと言えばいいんですね。
適切な言葉をちゃんと知りませんでした。
494 :
デフォルトの名無しさん (ワッチョイ a37b-mxZJ)
2017/02/27(月) 20:55:00.96 ID:Of/Kbntx0
https://bugs.llvm.org//
バグ報告はここじゃね?
495 :
2017/02/27(月) 21:11:47.21 ID:4UiY0/x/0
libc++ではなくてclangが腐ってるようにも見える
http://melpon.org/wandbox/permlink/GCDP7CU2HzUOMMML
496 :
2017/02/27(月) 21:22:12.75 ID:XaQXd7Ck0
>>494
New user self-registration is currently disabled
らしいのでどうせメールするならメーリスでいいか、
というのと規格的にどうなのかよくわからなかったので…
497 :
2017/02/27(月) 21:25:24.26 ID:XaQXd7Ck0
>>495
g++ で libc++ を使わせても同じ挙動だったのですが
どうなってるんでしょうね?
498 :
2017/02/28(火) 09:18:02.99 ID:cUxO9p4sd
long→short 警告でない
size_t→int 警告出る

警告出たり出なかったりの違いってなんなんだ?
上記二つとも出ると思っていたのだが
499 :
デフォルトの名無しさん (スップ Sd4a-36q6)
2017/02/28(火) 09:25:14.27 ID:+UqvplX+d
unsignedでは
500 :
2017/02/28(火) 09:41:23.40 ID:Mx4bsJ8G0
警告を出すか出さないかはコンパイラのオプションで自由に選べる
501 :
2017/02/28(火) 11:50:09.20 ID:cUxO9p4sd
>>499
それだと思ったのだけどsize_tでも出ないところと出るところがある
なんなんだこれ
502 :
2017/02/28(火) 13:37:18.52 ID:XuG6C30R0
template<typename T> T f(const T& x){return x;}
template <int N> struct S{ int a[N];}
template<>template<int N> S<N> f(const S<N>& x){S<N> r; r.a[0] = x.a[0]; return r;}
こんな感じのコードで
Extraneous template parameter list in template specialization
って警告されるんですけど何が問題でどう書くのが正解なんですかね?
503 :
2017/02/28(火) 13:40:56.38 ID:Mx4bsJ8G0
>>502
特化テンプレートを使う場合は型や値を明記しなけりゃならない
この場合はNの数値を明記しなけりゃいけない
504 :
2017/02/28(火) 13:45:44.39 ID:XuG6C30R0
ああなるほど・・・
Nが多いからテンプレートしてるのに手間ですな・・・
505 :
2017/02/28(火) 14:36:02.06 ID:t3AtpORvM
出先だから書いてないけどvaliadic templateと再帰で全部インスタンス化できそうだけど
506 :
2017/02/28(火) 18:49:47.90 ID:jvds/XNw0
最初のfの特化じゃなくて別のテンプレートのfでオーバーロードするだけ
template<typename T> T f(const T& x){return x;}

template<int N> struct S{ int a[N];};

template<int N> S<N> f(const S<N>& x)
{ S<N> r; r.a[0] = x.a[0]; return r; }
507 :
2017/03/01(水) 12:26:23.09 ID:2EZ/mUsgr
>>501
もしかして定数の値が欠損していない場合では
constexpr size_t v1 = 32767;
int32_t v2 {v1}; //たぶん警告は出ない
508 :
2017/03/02(木) 19:18:35.64 ID:x/1yO3Ie0
++演算子で延々とループできるリングバッファみたいなコンテナってあると便利だと思うんですが
STLに入っていないのはなんでですか?
509 :
2017/03/02(木) 19:23:17.02 ID:6rzvDmku0
提案されていたけどまだ入ってない
510 :
2017/03/02(木) 20:02:04.86 ID:6rzvDmku0
ごめん違う奴だった勘違いしてた
511 :
2017/03/03(金) 00:07:16.62 ID:TsTyuoGu0
class Fooに対して演算子(例えば「|=」)のオーバーロードを使って
 Foo& operator|=(const Foo& rhs) { (*thisとrhsの演算結果を*thisに入れる) ; return *this; }
とか定義する例を見る気がしますが、
こういうパターン(演算結果を返すと共に*thisの値が破壊される)なメソッドを演算子のオーバーロードでなく名前で実装するとしたら
get〜とすべき?それともset〜が普通?
512 :
2017/03/03(金) 00:10:55.24 ID:MwnP4WDg0
普通setじゃない?
513 :
2017/03/03(金) 00:15:24.61 ID:/S0wuqbS0
setの戻り値にsetされた値が返ってきても違和感ないけど、getで中身変わったらキレる
質問からはズレるけど、演算処理が入るならupdateとかその辺のどちらでもない名前にしとくのが良いと思うなあ
514 :
2017/03/03(金) 01:57:52.71 ID:gLymaIrQ0
無いものは自分で作ればいいのよ
パンがなければお菓子を食べればいいのよ
515 :
2017/03/03(金) 02:12:38.68 ID:ApTpm6Xd0
先輩 お金がないならATMに行けばいいじゃないですかぁ
516 :
2017/03/03(金) 05:32:35.45 ID:v1le7QT40
その|=の演算を意味する名前だろ。
517 :
デフォルトの名無しさん (ワッチョイ 0f24-T7IB)
2017/03/03(金) 09:23:46.53 ID:EiwPmmlf0
ビットORでsetというと「ビットを立てる」という意味か?
だとしたらビットANDでreset、ビットXORでflipか
518 :
2017/03/03(金) 09:35:11.95 ID:CN7XccVQp
ビット演算はただの例でしょ
519 :
デフォルトの名無しさん (ワッチョイ 0f24-T7IB)
2017/03/03(金) 09:53:32.07 ID:EiwPmmlf0
副作用のある演算子なら+=や--もあるわけだが
それもひっくるめて一概にsetかgetかと問うのに例が|=なのか
520 :
2017/03/03(金) 11:08:49.61 ID:mnS2IoUK0
>>513
カウンタとかオートインクリメントする奴があるだろ
もっとカルシウム取った方が良いぞ
521 :
デフォルトの名無しさん (ワッチョイ 8b7b-ERAc)
2017/03/03(金) 11:52:47.71 ID:8SEA7Mtt0
カウンターのインクリメントにgetなんて名前付けないでしょ
522 :
デフォルトの名無しさん (スプッッ Sdef-cA0b)
2017/03/03(金) 11:56:49.79 ID:LaI4btVTd
GetNextFrameなのに内部で動画のデコードが行われるミドルウェアがあった
523 :
2017/03/03(金) 12:46:37.01 ID:hxiWJWmXM
>>520
それカウンタのインクリメントがメインじゃないだろ
(メインの機能なら単なるバカ)
他にも取得したデータをキャッシュしとくとかでオブジェクトの状態を変える奴はある

>>522
デコードしたフレームが取得できるとかじゃなくて?
524 :
2017/03/03(金) 13:00:47.12 ID:qCQIHM4i0
>>522
PopNextFrameにしろって文句つけたら
525 :
デフォルトの名無しさん (スプッッ Sdef-cA0b)
2017/03/03(金) 13:15:03.93 ID:LaI4btVTd
>>523
フレーム番号を取得する機能とデコードの機能が一つになってる
526 :
デフォルトの名無しさん (ワッチョイ 1f7d-M3Ci)
2017/03/03(金) 13:33:04.16 ID:UcAC+2mM0
>>514
マリー・アントワネットのこの言葉は、事実ではなくて、
『マリー・アントワネット』を書いたシュテファン・ツバイクの創作
だという説もあるね
527 :
デフォルトの名無しさん (ワッチョイ cb3c-m4jB)
2017/03/03(金) 14:59:24.75 ID:BCfaURI80
ロベールのC++入門講座持っている人に質問
p.537一番下のテンポラリオブジェクトの寿命と
p.543のテンポラリオブジェクトの寿命の違いがいまいちよくわからないんだけど
もう少し詳しく解説してくれませんか?
528 :
2017/03/03(金) 19:06:53.97 ID:hxiWJWmXM
>>525
そのまとめかたがいいかどうかは知らんけど名前は特に違和感ないけどな
529 :
2017/03/03(金) 20:51:41.34 ID:TsTyuoGu0
レスdクス

>>512
なるほど言われてみればそんな気がする

>>513
確かに言われてみればそうかもしれない

>>516
ごもっとも言われてみればその通りに思える

もとの「|=」は和集合を求める演算のつもりだったので
setUnionという名前にした、
530 :
2017/03/03(金) 22:11:43.72 ID:CN7XccVQp
ちなみにJavaでよく使われるByteStreamのgetシリーズは値を読み出しつつ参照位置を進めるメソッドになっている
個人的にはreadあたりに改名しろやと思わなくもないけど、getでしれっと中身が変わるのは稀によくある

つまりC++のconstメンバ関数は素晴らしい
531 :
2017/03/03(金) 22:13:19.97 ID:CN7XccVQp
ByteBufferだわ
532 :
2017/03/04(土) 00:38:16.02 ID:gb3ZxOZZ0
それは設計の視点・方向性の違い
コンテナ/ホルダーとみるならgetで状態が変わらない方が自然だけど
ジェネレータとみるならgetで値を返しつつ状態が変わる(次の値の用意をする)のも自然だ
533 :
デフォルトの名無しさん (ワッチョイ 0f24-T7IB)
2017/03/04(土) 08:01:38.91 ID:NPMNhlmj0
読み取り動作と進行動作は本来別な話だが
I/Oを進行なしで読み取らせようとすると
キャッシュせにゃあかんのでそこは副作用となる
C++にはそのためにmutableがあるので問題にはならん

ただしポートを叩くのとアクセス管理は別な問題なので
1つのクラスに一緒くたに突っ込む設計に俺は反対
534 :
2017/03/04(土) 08:40:11.52 ID:sD1+OZIDr
珍妙な持論だ
だがiostreamの>>やstdioのfreadやソケットのrecvも
読み取り命令と進行命令を別にすべきという考えなら一貫性はある
535 :
2017/03/04(土) 08:45:52.42 ID:IfQ9fk2A0
>>532
> コンテナ/ホルダーとみるならgetで状態が変わらない方が自然だけど
そう言うのは Peek でいいかと
536 :
2017/03/04(土) 09:59:29.30 ID:JHoGQxOg0
I/Oに近い低水準レイヤ────で読み取りと進行が不可分なケースは
物理法則からくる制約と処理効率の兼ね合いからそうしているはずで
読み取り+進行、という操作に業界固有の用語が存在はずだから
その用語を使えば良いんじゃないの

いったんメモリに乗ってしまったデータは使われ方が1種類で決まりきっているとかいった
特殊なケースを除き、取得と変更わ分けるのが正義
この領域において不必要なオブジェクトの変更を放置するのは
チューリングマシンの計算モデルで物事を初期化しないプログラマーレベル
537 :
2017/03/04(土) 10:39:59.31 ID:IfQ9fk2A0
ちゅーりんぐましんしってるおれすげーくん w
538 :
2017/03/04(土) 11:12:56.99 ID:+pEijc2g0
読みにくい日本語から漂うアスペ感
539 :
2017/03/04(土) 12:55:27.75 ID:r8uNi5/x0
getc
540 :
2017/03/04(土) 22:54:48.79 ID:zKraxpcF0
デフォルトコンストラクタを持たないメンバーの初期化をしたいのだけど、
初期化が複雑だから初期化リストに含めたくない場合ってみんなどうしてるの?unique_ptrに変更する?
541 :
2017/03/05(日) 00:17:33.91 ID:n48qZSY3M
>>540
builder patternを使う
542 :
デフォルトの名無しさん (ワッチョイ 8b7b-ERAc)
2017/03/05(日) 00:27:52.82 ID:qOQ2PN1U0
>>540
複雑ってのがよくわからんのだけど、例えばどんな?
単に引数を求める形に変換する必要があるとかならヘルパ関数作るだけ
543 :
2017/03/05(日) 01:30:40.03 ID:gIuIuvFQ0
>>541
まぁこれ
544 :
2017/03/05(日) 09:53:23.05 ID:Ur8kOvvv0
説明不足でした。すみません。
class Car {
. Engine e; //<デフォルトコンストラクタをもたない
};
みたいなクラスでeを初期化するのに
. 適切なトルクの計算;
. 適切な燃費の計算;
. e = Engine(トルク, 燃費);
とかしないといけなかったら、
Car : e(トルク, 燃費) {}みたいに初期化するのは難しいよね?
みなはどうしてるの?
545 :
2017/03/05(日) 10:36:02.63 ID:2RIrBifF0
適切なトルクの計算や、適切な燃費の計算なんて処理はそのクラスのコンストラクタ以外じゃ使わないような特殊なものなの?
それはCarが計算すべきものなの?
別の関数でも用意して、Carのコンストラクタにエンジンの初期化情報を渡させるような作り方をするのが普通じゃね。
546 :
2017/03/05(日) 10:38:36.22 ID:X9OstEVD0
Engineクラスに別途Initialize()メソッドを持たせるだけ
無理にコンストラクタで全部やろうとする設計がバカっぽい
547 :
2017/03/05(日) 10:58:54.48 ID:w6jz+T9vr
>>544が説明不足なんじゃなくて
ビルダーパターンと言う言葉を覚えて
レスも良く読まずに単語レベルで反応したアホがいるだけ
548 :
2017/03/05(日) 11:13:35.88 ID:gIuIuvFQ0
Engineにコピーコンストラクタかムーブコンストラクタ作って、CarにEngineを受け取るコンストラクタを作る

Initializeメソッド付けるのは「オブジェクトを作ったら必ずInitializeを呼ぶ」ってルールを守らなきゃ使えないクラスになるから好み分かれると思う
549 :
2017/03/05(日) 11:45:46.07 ID:w6jz+T9vr
デフォルトコンストラクターを作ることがはばかられる質問者は
ムーブコンストラクターを作ることができない可能性がある
という発想には至らなかったようだ
550 :
デフォルトの名無しさん (ワッチョイ 1f59-NqFr)
2017/03/05(日) 11:55:22.78 ID:69Hgyfek0
ラムダ式でやろう
class Car{
t toruku{ 100 };
n nenpi{ 200 };
Engine e{ [](auto&& toruku, auto&& nenpi){ return { toruku * 2, nenpi * 3 }; }( this->toruku, this->nenpi ) };
};
551 :
2017/03/05(日) 11:55:25.99 ID:uSZUgTTE0
>>546
その設計はEngineの宣言(Engiine e;)からe.Initialize()呼び出しまでの間を持たせるために、
Engineに無理矢理デフォルトコンストラクタを付ける設計変更を要す、

仮にInitialize()をeではなくファクトリメソッドとするなら
>>540にてすでに
>unique_ptrに変更する?
としてすでに言及されているパターンと実質同じなのでは…
552 :
2017/03/05(日) 11:58:09.92 ID:uSZUgTTE0
>>548
横だがおk
553 :
2017/03/05(日) 12:18:26.47 ID:gIuIuvFQ0
>>549
デフォルトコンストラクタが作れないケースとムーブ(コピー)コンストラクタが作れないケースは全く違うと思うけど、どうしてそんな可能性があるって発想に至ったの?
554 :
2017/03/05(日) 12:23:52.28 ID:h33ckUPTM
俺はいつもコンストラクタは
デフォルトコンストラクタ(必要に応じて)
コピコン、ムブコン
メンバをすべて受け取るコンストラクタ
しか作らんけどなぁ

メンバを作るのが少しでもややこしければstaticなcreateみたいなの作ってそこでメンバ作る
555 :
2017/03/05(日) 12:26:06.75 ID:h33ckUPTM
あと、ポインタで持つのはポリモーフィズムを期待するときだけだわ
C++でnullにしておきたいからポインタにするってなんかへんじゃね?
使うとき毎回nullチェックするポリシーも一緒に維持しないといけなさそう
556 :
2017/03/05(日) 12:49:35.40 ID:f7+gl1ia0
>>553
違うから可能性がない
とでも言うのか?
そのクラスは触れないだろうな
って考えるのが普通だと思うが
557 :
2017/03/05(日) 13:05:22.78 ID:uSZUgTTE0
>>544
>eを初期化するのに
>. 適切なトルクの計算;
>. 適切な燃費の計算;
>. e = Engine(トルク, 燃費);
>とかしないといけなかった
がデフォルトコンストラクタの追加が困難な理由を表してゐる、

次は>>566がコピーコンストラクタやムーブコンストラクタの追加が困難な理由を説明する番なのでは…
558 :
2017/03/05(日) 13:18:33.58 ID:gIuIuvFQ0
どこの世界の普通だそれ…
Engineが仕事上触れないなら諦めてポインタで持つしか無いんじゃね
Carの初期化時点(コンストラクタ呼び出し時点)ではEngineは初期化するための情報が無いんだから、コンストラクタの中かInitialize関数かで後から初期化するしか無いでしょ
>>550のラムダ式が使えればそれでも出来そうに見えるけど、initializer_listってこんな使い方できたっけ?
559 :
デフォルトの名無しさん (ワッチョイ 8b7b-ERAc)
2017/03/05(日) 13:39:08.47 ID:qOQ2PN1U0
class Car{
static double 燃費計算();
static double トルク計算();
Engine e;
public:
Car():e(トルク計算(),燃費計算()){}
};

これだけの話じゃねえの?
560 :
2017/03/05(日) 13:41:57.26 ID:uSZUgTTE0
>>559はCarクラスにエンジンの詳細(燃費計算()とかトルク計算())を含める設計に何の疑問も抱かないのか…
561 :
2017/03/05(日) 13:44:52.75 ID:rDGU9DZ0p
>>559
Engineクラスを触らない前提ならこれでいいな
562 :
デフォルトの名無しさん (ワッチョイ 8b7b-ERAc)
2017/03/05(日) 13:44:54.60 ID:qOQ2PN1U0
>>560
例えでしかないんだから細かいところにつっこみ入れてもしょうがないだろ?
563 :
2017/03/05(日) 13:47:42.42 ID:uSZUgTTE0
Carクラスにstaticメソッドでエンジンの詳細を持たせる結果、
>>561が指摘するようにCarクラスのエンジン換装を不可能にしておいて
「細かいところ」とのたまう神経の図太さは
そのうち大成するやつかもわからんね…
564 :
デフォルトの名無しさん (スププ Sd3f-OGW1)
2017/03/05(日) 14:06:10.31 ID:HN9/KcX+d
CD-R
565 :
2017/03/05(日) 14:16:16.25 ID:f7+gl1ia0
>>557
頭大丈夫?
初期値が与えられていない状態にするって言うディフォルトコンストラクタなんていくらでもあるぞ
そんなのはディフォルトコンストラクタが作れない理由になんてなってない
566 :
2017/03/05(日) 14:25:52.76 ID:rDGU9DZ0p
設計上の理由とか仕事の分担上の理由とか工数的な理由とか、その時々で選択される結果は違うから色んな案が出るのは良いと思うんだけどさ
全く案出さないでひたすら回答にケチ付けてるだけの奴は何なのよ
567 :
2017/03/05(日) 16:05:02.59 ID:35hcvBBa0
このスレッドでいいのかどうかわからないのですが、
皆さんのお知恵を拝借させてください。

当方自作PCにてWindows10 Pro 64bit環境を使用しておりますが、
PCゲームでWorld of Warshipsというゲームをやっています。
ところが、先月半ばからCPUに過度の負荷がかかるようになり、
原因をいろいろと調べていたところ、起動中のCPUプロセスを詳細に調べることになり、
Process Explorerというソフトでゲーム起動中のプロセスを詳しく見てみたんですが、
動作中に「MSVCR110.dll」というファイルへのアクセスが集中し、同じプロセスが5つ以上、
それも1つにつきCPU占有率5%以上使う状態なんです。

正常稼働時↓
http://www.dotup.org/uploda/www.dotup.org1176183.jpg

以上稼働時↓
http://www.dotup.org/uploda/www.dotup.org1176184.jpg
http://www.dotup.org/uploda/www.dotup.org1176185.jpg

同じゲームをプレイしているWin7使用中の友人のPCには、
そもそもこの「MSVCR110.dll」というファイル自体が出てきませんでした。
これはOS標準搭載以外のMS製アプリが一つも入ってないからだと考えられ、
尚且つ、名前からしてVisual C++関連のファイルだと思われます。

なぜこれだけ負荷がかかるようになってしまうのか、
どなたかこの状況をご理解頂ける方いらっしゃるでしょうか?
ご意見をお伺いできれば幸いです。
よろしくお願いします。
568 :
2017/03/05(日) 16:28:50.51 ID:gIuIuvFQ0
C++ってキーワードでここに来たんだと思うけど、残念ながらスレ違い、ゲームの本スレとかで聞くのが良いんじゃないか
一応エスパーで回答するなら、セキュリティソフトに邪魔されて負荷上がってるってのが考えられるから、一旦セキュリティソフトを止めるなり例外設定するなりして試してみては
569 :
2017/03/05(日) 18:38:44.74 ID:35hcvBBa0
>>568

スンマセン、ゲーム本スレと質問スレで書き込んだら
「スレ違い。自作板のWindowsスレかC++スレ行け」と言われたとです(´・ω・`)
570 :
2017/03/05(日) 19:42:29.47 ID:hQyyoOdR0
>>569
ローカルルールくらい読みなさい
ここはプログラムを作る人のための板
プログラムを作る人になりたいのなら、まず本屋に行って入門書かって自習してから出直しなさい
571 :
2017/03/05(日) 20:40:15.08 ID:N295BQKw0
>>567
visual c++を動かすためのランタイムだからそれ自体が原因ではないと思う
572 :
デフォルトの名無しさん (ワッチョイ 6bf2-Guy/)
2017/03/05(日) 21:59:02.84 ID:89WGHivw0
署名んとこ見る限り自分ところでカスタマイズしたRuntimeDLL使ってるのか?
公式フォーラムで聞くか直接開発に問い合わせた方がいいんじゃね?普通に考えて
573 :
2017/03/05(日) 22:58:25.66 ID:9n7ykkeL0
>自分ところでカスタマイズしたRuntimeDLL

普通に考えるとACCSに通報ではないのか
574 :
2017/03/06(月) 02:22:12.19 ID:sc7bChPJ0
ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0352r1.pdf
に "An implementation using Clang is being worked on." ってあるけど
どこにおいてあるのん?使いたくて震える
575 :
2017/03/06(月) 02:42:26.15 ID:sc7bChPJ0
ttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0352r0.pdf
の方に書いてあったのね……スミマセソ
576 :
デフォルトの名無しさん (スップ Sd3f-cA0b)
2017/03/06(月) 17:42:12.10 ID:/kAc8Ta7d
std::mt19937 r(?);
std::uniform_int_distribution<> d(0, 100);
for(int i=0;i<100;++i){
d(r);
}
としないと正しく分布しないですか?

std::mt19937 r(?);
for(int i=0;i<100;++i){
std::uniform_int_distribution<> d(0, 100);
d(r);
}
これでは駄目ですか?
577 :
2017/03/06(月) 19:02:57.23 ID:qCc5lDaQ0
どっちでもいいんじゃね
578 :
2017/03/06(月) 20:41:36.90 ID:l2uOsbFVM
仕様読んでないけど擬似乱数列じゃ毎回同じ値がかえるんじゃないの?
579 :
2017/03/06(月) 20:43:46.97 ID:l2uOsbFVM
おおっと、乱数生成器自体を渡してるのか。失礼しました
580 :
デフォルトの名無しさん (ワッチョイ 0f24-T7IB)
2017/03/06(月) 21:06:44.06 ID:DwMqYVii0
あふぉ
581 :
2017/03/06(月) 22:21:57.67 ID:CDqSwP280
>>576
distribution自体も値を返すごとに変化する内部状態を持ち
同じパラメータで構築されたものは同じ内部状態から始まるという規格の意味を考えると
一般論としては下の方はダメだろう
582 :
2017/03/06(月) 22:35:23.34 ID:AKQMS70er
>同じパラメータで構築されたものは同じ内部状態から始まる

distributionがそんな仕様なら
むしろ後者の方が望ましくね?
583 :
デフォルトの名無しさん (ワッチョイ 8b7b-ERAc)
2017/03/06(月) 22:46:29.85 ID:k6KUwGnB0
コンストラクタで渡した範囲を使わず引数に渡した範囲を使うオーバーロードもあるし、distributionに使わなかったランダムビット値とかの値を残してたら引数で毎回random_engine渡す意義が薄れてきちゃう気がするよね
584 :
デフォルトの名無しさん (ワッチョイ cb3c-m4jB)
2017/03/07(火) 15:47:09.58 ID:3Q65RUMW0
typedef int* intPtr;
const intPtr hoge;
としたとき
const int* hogeではなくint* const hogeになるのがピンと来ません
585 :
2017/03/07(火) 16:11:26.13 ID:q3Kp0vdwM
>>584
int*
int const*
は別の型だから

int*
int* const
は同じ型だけどconst性の違いがある
586 :
デフォルトの名無しさん (ワッチョイ 0f24-T7IB)
2017/03/07(火) 18:02:33.74 ID:O/JMqbZP0
>>584
そのconstはintPtrを修飾するだけで、
intPtrの内容は変更できないからだ

intPtrは「非constのintへのポインタ」となっていて
当たり前だがhogeは非constしか指せないポインタになる

おまえさんが付けたconstは*hogeではなくhoge自身を修飾するということだ
587 :
デフォルトの名無しさん (ワッチョイ cb3c-m4jB)
2017/03/07(火) 19:43:03.39 ID:3Q65RUMW0
>>585-586
マクロみたいにただキーワードを置き換えるんじゃなくて
あくまでも型の定義ってことか
なんとなくわかったようなわからないようなって感じだが
参考になったありがとう
588 :
デフォルトの名無しさん (ワッチョイ 6bf2-Guy/)
2017/03/07(火) 20:00:54.12 ID:JY4xO0gD0
std::allocatorなんかでもconst_pointerの定義があるし、別途typedefしてくださいって感じなんだろうね
589 :
2017/03/07(火) 21:59:10.88 ID:GF7WqcJ3a
>>587
構文上の結合の優先順位を理解すれば、複雑な型宣言の意味も理解できるようになるよ。
590 :
2017/03/08(水) 00:23:57.60 ID:bj8U/UPWr
typedefがただのキーワード置換でないことに気づいた>>587に対して
>>589は未だにただのキーワード置換と考えているように思えてならない
591 :
デフォルトの名無しさん (ワッチョイ 0f24-T7IB)
2017/03/08(水) 09:15:55.94 ID:DNe+Lf9O0
確かにw
592 :
2017/03/08(水) 09:58:21.79 ID:pkIkDwj+M
あれ、const int*とconst intPtrって同じにならなかったっけ?
593 :
デフォルトの名無しさん (ワッチョイ 0f24-T7IB)
2017/03/08(水) 10:24:26.87 ID:DNe+Lf9O0
おまえもしかして intPtr a, b; が int* a, b; になるとでも思ってる?
594 :
2017/03/08(水) 10:35:12.10 ID:qFksyWqq0
それとはまた別の話じゃ?
595 :
2017/03/08(水) 10:45:04.43 ID:EeDAfYl90
>>592
ポインタに対してのconstだからint const*
596 :
2017/03/08(水) 11:04:02.79 ID:pkIkDwj+M
おっと勘違いして覚えてた
これは恥ずかしい、間違えて使ってたかも

でも間違えてたらコンパイルエラーが出そうなもんだけど
なんで今まで気がつかなかったんだろう…
597 :
2017/03/08(水) 11:14:36.06 ID:VyuA3yza0
なわけで
int* a, b; じゃなくて int *a,b; だよなぁ
とここ30年w
598 :
2017/03/08(水) 13:43:48.82 ID:SntjmOAop
constは後ろに付けるのが本来なんだよ。
自信が無いなら先頭につけるのをやめれば間違わない。

>>595
int *const
じゃねーの?
599 :
デフォルトの名無しさん (ワッチョイ 0f24-T7IB)
2017/03/08(水) 14:57:04.07 ID:DNe+Lf9O0
あのなあ。。。
ずっこけた状態からもっとずっこけるのは苦痛を伴うんだぞ
600 :
2017/03/08(水) 17:54:01.46 ID:xABa9dNGM
int const * constでおk
601 :
2017/03/08(水) 18:00:06.17 ID:VyuA3yza0
* の前につけるか後につけるかですな
602 :
2017/03/08(水) 18:08:42.38 ID:/EX97NIO0
int * const p
int const *p
int const * const p
のどれかは使うが
const int *p
はやらない、これっていったい上の三つのうちのどれになるの?なんでそうなるの?
603 :
2017/03/08(水) 18:22:24.19 ID:dlE+7VUyM
604 :
2017/03/08(水) 18:43:43.95 ID:zA3nyedyM
>>603
これは分かり易いw
605 :
2017/03/08(水) 18:44:03.44 ID:vi7wbAYy0
>>602
3番目は使わんな
参照先変えないならもう参照でいいじゃない
606 :
2017/03/08(水) 21:11:05.22 ID:EeDAfYl90
>>598
うむ、少し間違えた
607 :
2017/03/08(水) 21:28:15.23 ID:LYwYML6D0
>>602
C の syntax を↓で済ませた結果、各 specifier, qualifier は順不同となった。
declaration:
 declaration-specifiers init-declarator-list(opt);
declaration-specifiers:
 storage-class-specifier declaration-specifiers(opt)
 type-specifier declaration-specifiers(opt)
 type-qualifier declaration-specifiers(opt)
608 :
2017/03/09(木) 08:16:39.62 ID:P4eVvEWq0
「cv修飾は左を修飾し、一番左に書いたときだけ例外的に右を修飾する」
という認識で10年以上問題なかった、仕様書でどうなってるかは知らんけど
609 :
2017/03/09(木) 08:46:08.19 ID:nspN5S3gr
そんなはずもなし
unsigned volatile const inline int static long *f();
610 :
2017/03/10(金) 02:51:41.08 ID:DVnkldFi0
>>602
>const int *p
>はやらない、これっていったい上の三つのうちのどれになるの?なんでそうなるの?

マジか const char * なんて毎日数え切れないほど使ってるわ
611 :
デフォルトの名無しさん (ワッチョイ cff2-j8zu)
2017/03/10(金) 08:56:27.34 ID:B+GguKA+0
const v(^・^)v const
612 :
2017/03/10(金) 17:04:19.46 ID:Pyfb9YNwp
久々にC弄ったから何となく覗いてみたらconstの話しかしてなくて草
613 :
2017/03/10(金) 18:09:34.58 ID:wy5WfeUq0
const仙人のお出ましだぞ
彼がconstの全てを知ってるらしい
614 :
2017/03/10(金) 18:35:53.93 ID:9izzFXDGr
>>585
>同じ型だけどconst性の違いがある

どこでそんなデタラメを覚えた?
615 :
2017/03/10(金) 18:47:49.20 ID:OJfHMNpa0
君達、物事はコンスタントに解決することが重要だよ?わかてる?
616 :
2017/03/10(金) 19:03:11.58 ID:9izzFXDGr
>>598
>constは後ろに付けるのが本来なんだよ

ソースは?
617 :
2017/03/10(金) 19:23:12.52 ID:ZjsFj1+i0
>>614
後者では型が修飾されているんじゃなくて変数が const 修飾されている
ということを言いたかったんじゃない?実際

int * a;
int * const b = hoge();
a = b;

はちゃんと通るし。
まあたしかに「同じ型」だと言っていいのかはよくわかんないけど。
618 :
2017/03/10(金) 20:18:18.69 ID:HUvVedpnM
>>603のClockwise/Spiral Ruleに異論のある人、居る?
619 :
2017/03/10(金) 20:38:11.10 ID:K2NxcqGZM
>>618
1つ目の回答のほうが2つ目の回答(スパイラル)より12倍投票数が多いぞ
620 :
2017/03/10(金) 20:56:02.79 ID:9izzFXDGr
>>617
>型が修飾されているんじゃなくて変数が const 修飾されている

などという空想がどこから湧いてきたのか疑問なのだが
http://ideone.com/dWfpAT
621 :
2017/03/10(金) 20:59:13.64 ID:9izzFXDGr
>>618
まず「clockwise」と言うあたりでオツムが論理的思考に弱いことは明らか
622 :
2017/03/10(金) 21:00:42.90 ID:6ypCkPMo0
>>617の理屈だと、
char c;
int i;

これらは同じ型で変数が修飾されてるだけだよ。
実際、

int i;
char c = 3;
i = c;

はちゃんと通るし。
などとも言える。
623 :
2017/03/10(金) 22:22:44.73 ID:PT1UnLZa0
>>620
int const *p
int * const p
の違いもわからんアホは ROM っとけ
624 :
2017/03/11(土) 00:12:59.12 ID:XUJAp/M10
ROMはconst
625 :
2017/03/11(土) 06:32:47.43 ID:JvHBeRgs0
ちょっおまwwwwwwww
C++のBNFにtype-qualifierというのはあっても
variable-qualifierとかobject-qualifierとかは無いはず…
>>622のは単に変数のdeclaration
(文脈によっては変数の定義にもなる
626 :
2017/03/11(土) 06:50:46.51 ID:2/ZkR35y0
ちょっおま
って久しぶりに聞いたわ
627 :
2017/03/11(土) 09:06:46.34 ID:h5T3JHpB0
>>616
二度漬け禁止
628 :
2017/03/12(日) 07:41:49.43 ID:nkYFQTVc0
Visual studio express 2013において、if文以外(変数にデータを代入するとき)に==と書いた時にエラーを返すようにしたいのですが、出来ますか?
(a == 1;と書いた時にコンパイルするとエラーを返すようにするといった感じです)
if文の判定式をコピーした結果、この==を1つにし忘れたため、しばらく困ったのと
現状において、整数への代入で==を使うことが無いので、エラーを出すようにしたいのです
629 :
2017/03/12(日) 08:58:04.75 ID:nkYFQTVc0
すみません、スレ違いでした
630 :
2017/03/12(日) 09:50:45.60 ID:6iMHIBm50
>>628
プロジェクトのプロパティ
>構成プロパティ >C/C++ >詳細設定
特定の警告をエラーとして扱う に 4553 を設定すればいい
(もしくは、コンパイルオプションの /we"4553" を指定)

そうすると
warning C4553: '==': 演算子にプログラム上の作用がありません。'=' を意図しましたか?
のエラーになる。
631 :
2017/03/12(日) 12:13:57.19 ID:OaInj5Km0
「警告レベル」を「Level4 (/W4)」、「警告をエラーとして扱う」を「はい (/WX)」にしたらもっと広範にやってくれてスゲー便利
632 :
2017/03/12(日) 17:42:24.65 ID:nkYFQTVc0
>>630,631
本当に有難う御座いました!!
c++に明るくなく、これに気づかなかったせいで丸三日潰れて困り果てていたのですが、c++系の専門用語が分からないのと
「c++ ==」といったワードで検索しても記号系のワードが省かれるからか、ヒットせずとても困っていました
633 :
2017/03/13(月) 07:13:56.93 ID:Butu4pJYd
MultiByteToWideCharの1つ目の引数のコード表と二つ目の引数のフラグセットの意味を教えてくれませんか
コード表の意味はなんとなくわかるんだけどそれが使用してたコード表についてなのか、それとも変換先なのかがわからない...
634 :
2017/03/13(月) 13:07:11.48 ID:VNPYsRzKd
>>633
WindowsのUnicodeには、UTF-16が使われている。コードページは、UTF-16以外のマルチバイト文字列の符号化の種類を表している。第2引数についてはUnicodeの基本を勉強してから用語を確認せよ(英語のMSDNページを参照)。
635 :
2017/03/13(月) 16:29:57.33 ID:Kr7xjXLG0
Unicode 9.0のCore Specification D63ではprecomposedとcompositeが同義と読めるがMSDNは異なる使い方をしているな
combining(結合)と間違えたように思える
これでは>>633は理解不能
636 :
2017/03/13(月) 21:12:59.84 ID:Kr7xjXLG0
>>633
WindowsのMultiByteToWideCharは「何らかの文字コード」をwchar_t(UTF-16)文字列に変換するもの
変換元の文字コードが何であるかを指定するのが第一引数
例えば932(シフトJIS)、65001(UTF-8)
変換の動作を指定するのが第二引数
例えばMB_ERR_INVALID_CHARSは少しでも不正なバイトシーケンスがあれば全体をエラーとする
637 :
2017/03/15(水) 02:37:25.64 ID:8rrA/zgU0
>>620
ってどういう意図のレスだったの?理解がまったくできないんだけど
638 :
2017/03/15(水) 17:59:26.07 ID:wfaQCMr9d
>>634-636
たすかりもうした
おかげでコード上手くかけたので助かりました
639 :
デフォルトの名無しさん (ワッチョイ 133c-v8EU)
2017/03/16(木) 18:08:57.23 ID:KOsUwnSu0
テンプレートの特殊化を勉強しているんだけど
https://ideone.com/Z7enCI
これがなんでエラーになるのか教えてください
640 :
2017/03/16(木) 18:18:50.30 ID:ZMIdRLMQ0
>>639
intのHogeのFoo関数のtemplate<>が余計
Hoge<int>が特殊化されていることはクラス側でわかっているため
641 :
デフォルトの名無しさん (ワッチョイ 133c-v8EU)
2017/03/16(木) 19:00:18.20 ID:KOsUwnSu0
>>640
なるほど、サンクス
642 :
2017/03/17(金) 09:32:55.95 ID:OqtFMBfF0
関数のアドレスを取得するときに
クラスのメンバじゃない普通の関数は&をつける必要がないのに
メンバ関数は&をつけないといけなくなる理由を教えて
643 :
2017/03/17(金) 09:40:10.52 ID:Wd4E8hAa0
ideoneで書いてると急に初期化されて初めの状態のコードに戻ってしまうのですが
わたくしだけでしょうか?
644 :
2017/03/17(金) 11:36:52.60 ID:c9xwv7oqd
>>642
言ってる意味がよくわからん
645 :
デフォルトの名無しさん (ワッチョイ 3fdf-8FG5)
2017/03/17(金) 13:16:36.04 ID:AO+9LJwo0
>>642
ドライに言うと、規格でそう決まっているから

なんでそう決まっているかというと、
メンバポインタ(関数に限らない)取得は特殊な行為で、
インスタンス内のメンバの絶対アドレスを取得するが一般的な行為*1なので、
特殊な行為は明示的*2に書こうということになっている

struct asshole
{
void sonofabitch(int) { }
void dipshit()
{
auto jerk = sonofabitch;
}
};
↑は現実にはコンパイルエラーだが、もし通すとしたら
おまえ的にはjerkには何が入るべきだと思う?
ちなみに俺はbind(&asshole::sonofabitch, this, _1)に見えちまう

*1 俺じゃなく禿がそう思っている
*2 アドレス演算子とスコープ演算子が必須
646 :
2017/03/17(金) 13:48:45.02 ID:l8NCqXAU0
どこをどうひねるとそういう煌びやかな単語が出てくるのかが謎
647 :
2017/03/17(金) 16:09:10.13 ID:Wd4E8hAa0
ダブルヂスパッチってwikipediaだと2つのオブジェによってヂスパッチ
する意味ってかいてあるけれどwikipedia以外のホムペには2回ヂスパッチすること
って書いてあるばあいもありますね。
648 :
2017/03/17(金) 18:32:57.86 ID:dpI1G6OFM
>>645
日本語がまともに書けるようになってからレスしなよ
649 :
デフォルトの名無しさん (ワッチョイ bfda-8FG5)
2017/03/17(金) 19:46:28.78 ID:sgxnbWig0
>>648
おまえは批判がまともに書けるようになるまでROMってろ
650 :
2017/03/17(金) 19:54:05.38 ID:+s8GChIVd
批判
651 :
2017/03/17(金) 19:59:12.76 ID:KNcySIzq0
>>648
俺は普通に理解できたんだが、逆になにが悪いのか教えて欲しい。
652 :
2017/03/17(金) 21:49:19.82 ID:YstDK/amM
メンバー関数のアドレス取得も絶対アドレスだと思うんだけど
653 :
2017/03/17(金) 22:10:36.61 ID:Kkd83n1s0
>>646
○○がマイブームな年頃

うんち:3さい
カンチョー:6さい
サノバビッチ:14歳←英語使ってる俺カッコイイ

とかじゃね?


ところで脱線するが、>>645でbindがC++にあることを初めて知ったのだが、
thisをバインド出来ているがこれって意味あるのか?
JavaScriptみたいな動的ダックタイピングなら継承関係なくbind出来るので意味があるのだが、
C++なら継承してないとbind出来ないよな?
だったら最初からインスタンスのポインタを管理して普通にメンバ呼んだ方が楽だと思うが。
(継承してないとbind出来ないのなら管理対象のポインタが
関数ポインタになるかインスタンスになるかだけ。
実質的なプログラミングコストは変わらない)
654 :
デフォルトの名無しさん (ワッチョイ 133c-v8EU)
2017/03/17(金) 22:24:44.25 ID:OqtFMBfF0
>>645
ごめん、bind関数の理解があいまいなんだが
要するにインスタンス先のsonofabitchメンバ関数になるように見えるって言いたいんだよね
俺は(も?)そう思った
でも規格で決まってるって一言で言ってもらえてなんとなく割り切れた

ひとつだけ
「インスタンス内のメンバの絶対アドレスを取得する」のが特殊な行為って部分をkwsk
他のポインタは相対アドレスなの?
655 :
2017/03/17(金) 22:41:33.75 ID:pMlN+j4d0
いやでも、原文には
>インスタンス内のメンバの絶対アドレスを取得するが「一般的」な行為
って書いてあるし
656 :
2017/03/17(金) 23:23:01.06 ID:p3X8pgmur
>auto jerk = sonofabitch;

ここは話の流れでは
auto jerk = asshole::sonofabitch;
とすべき所を、勝手に「asshole::」を取って話をすり替えるとは
657 :
2017/03/17(金) 23:23:58.39 ID:lHYxcE7d0
>>653
transformみたいなアルゴリズム系の関数に渡すときにバインドするしかないだろ
658 :
2017/03/17(金) 23:46:36.67 ID:KqZX+Igl0
継承してなくてもbindできるでしょ
659 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/17(金) 23:48:26.71 ID:RKn5d9hw0
継承とbindがどう関係すんのか解らんわ
660 :
2017/03/18(土) 09:12:06.02 ID:QtoorQPlr
>>653
>C++なら継承してないとbind出来ないよな?

継承の意味もわからないレベルはすっこんでた方がいい
http://ideone.com/Wl7A59
661 :
2017/03/18(土) 09:44:46.57 ID:g4V8rpJk0
ふえーん。VC++でW系のこーどがわからないよ〜。
662 :
2017/03/18(土) 09:54:09.70 ID:g4V8rpJk0
C++のバグかと思ったら、いじってるHTMLのバグだった。悲しい。
663 :
2017/03/18(土) 11:02:56.09 ID:waR+gchT0
>>657
std::transformならbindいらんだろ。イテレータを渡してる。
> https://cpprefjp.github.io/reference/algorithm/transform.html
そしてこの場合、(someClass->*someMethod) と書けるしそれで十分だろ。

>>660
ここでbindも継承もないソースを上げてくることにびっくりだわ

>>658-659
関数内でのthis.someFieldへのアクセスは継承してないと無理でしょ。
静的型ではポインタを生成出来ない。(動的ダックタイピングなら可能)
http://www7b.biglobe.ne.jp/~robe/cpphtml/html03/cpp03057.html
http://www.ibm.com/support/knowledgecenter/ja/SSGH3R_12.1.0/com.ibm.xlcpp121.aix.doc/language_ref/cplr034.html

継承してない物をbindして、その関数内からthis.someFieldにアクセス出来る例があるか?
あればよろしく。
664 :
2017/03/18(土) 11:43:31.57 ID:YXP7lJmh0
ていうか仮想関数(による多態性)とテンプレート(によるfunctor)がどっちも使える状況で
どうしてもメンバ関数のアドレスをとる必要があるというシチューエーションとは一体、
ちなメンバ関数のアドレスをとる構文は覚えていない
主記憶にございません
665 :
2017/03/18(土) 11:45:58.26 ID:YXP7lJmh0
誤:テンプレート(によるfunctor)
正:テンプレート(へのfunctorとかクロージャ渡し)
666 :
2017/03/18(土) 12:01:44.38 ID:TmvAgLdoM
>>663
もういいから死ね
https://ideone.com/jZNd95
667 :
2017/03/18(土) 12:41:56.92 ID:YXP7lJmh0
f.calc(x, 2)をfunc(x)として呼びたいためだけにstd::bind()を使うのはメリット感に欠ける…
668 :
2017/03/18(土) 12:43:09.53 ID:TmvAgLdoM
>>667
できるできないの議論だから
669 :
2017/03/18(土) 12:48:15.84 ID:waR+gchT0
>>666
> std::vector<int> invoke(const std::vector<int>& v, const F& f) const
> std::bind(&F::calc, f, _1, 2));
bindしている対象は F& f つまり自分自身のクラスだろ。
それは継承してるのと意味は同じだよ。(今回の問いにおいては)
俺はそこに全く無関係のクラス class G{} を突っ込めるのかと問うている。
C++では出来ないだろ。(JavaScriptでは出来る)

自分自身、または継承関係のあるクラスなら、
> std::bind(&F::calc, f, _1, 2));
のところを代わりに f->*calc と書けるんだよ。それでいいだろ、という話。
今回は引数が複数個で、第2引数を確定させたいみたいだから、
C++にその文法が無く、部分適用関数をあらかじめ用意するしかないようだけど、
それは文法が足りてないから。(ただしそこまで使わないのでbindでもいいが)

ただそもそもカリー化して一個ずつ食えって話だろ、本来は。
その場合なら第2引数を確定させた関数を作る為に、
class H: F{
int k;
int calc(const int x);
}
だろ。それで h->*calcで良いんだよ。(継承関係が有ればbind無しで書ける)
というか内部的には同じ事をやっていると思っているんだが。
670 :
2017/03/18(土) 12:48:34.92 ID:waR+gchT0
それで話を戻すと、
「継承関係無しで、自分自身でもないクラス G をbind出来るか?」
というのが俺の問いね。
お前は日本語にもこだわるタイプのようだから、「自分自身でもない」と明記しておく。
(これは普通に分かると思いたかったが)

要するに俺は、
「静的型であるC++に於いてthisのバインドって意味あるのか?」
と問うている。
動的型ならバインド後にメンバ追加して実行時に揃っていればダックタイピング可能だから意味がある。
静的型はバインドする時点でメンバが揃っていることを確定出来ないといけない。
それって要するに継承関係がないと無理だよね?という話。
671 :
2017/03/18(土) 12:51:40.31 ID:waR+gchT0
× 静的型はバインドする時点で
○ 静的型はバインドが使われているソースをコンパイルする時点で

一応訂正しとくわ。分かる範囲だとは思うが。
672 :
2017/03/18(土) 13:01:24.39 ID:TmvAgLdoM
何が言いたいのか全然わからん
とりあえず、そのJavaScriptでできると主張しているコードを晒せ

第一引数にthisをバインドする意味って、内部的にはメンバメソッドはオーバーロード(+マングリング)で解決されるんだから、バインドしとかないと動かねーだろがよ
673 :
2017/03/18(土) 13:17:03.94 ID:WJ1Bgcsq0
std::list<std::function<void<void>>> funcs;

A a;
B b;

callbacks.push_back(std::bind(&A::func, &a));
callbacks.push_back(std::bind(&B::f, &b));

for(auto func : ...) func();

こういう使い方のbindの場合継承は関係ないと思う
674 :
2017/03/18(土) 13:31:02.22 ID:waR+gchT0
>>672
> バインドしとかないと動かねーだろがよ
その通りだ。
多分君はC++しか知らないから、それ前提で話をしているからそう思えるのだと思う。
これ自体は不思議ではない。

JavaScriptなら以下みたいなことが出来る。

var a = {
a: 1,
k: 2,
calc: function(x){return this.k*x+this.a;}
};
var b = {}; // bはaと継承関係なし

var b_calc = a.calc.bind(b); // aのcalcにbをバインド ---(A)
b_calc(3); // 実行可能、結果は NaN ---(B)
b.a = 4;
b.k = 5;
b_calc(6); // 実行可能、結果は 34 ---(C)
675 :
2017/03/18(土) 13:31:20.02 ID:waR+gchT0
C++から見ればデタラメだが、JavaScriptはこれでも動く。
C++は(A)の時点でバインド対象(今回はb)がcalcを動かしても問題ないことが必要で、
コンパイル時に確定させる為には通常は継承関係がないと無理だろ。
JavaScriptはそういうの関係無しにとりあえずbind出来る。
ただし中身が揃っていない時に実行したらNaNが返ってくる。(B)
そして中身を揃えたあとには正しく実行される。(C)

だからJavaScriptみたいな言語ならthisをバインドする意味があるのだが、
C++のように継承関係がないとメンバ関数を呼べないのなら、
常に f->*calc の形で記述することが可能であり、bind時にthisを確定させる意味がない。
(やってもいいのだが、冗長=糖衣構文)

JavaScriptでは(B)の時点で b はメンバを何も持っておらず、
(C)の時点でもメンバは a, k のみで、calcはメンバではないことに注意。
(当たり前だが a を継承していれば calc もメンバになる)
676 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/18(土) 13:32:09.09 ID:ux+WuUO90
>>670
thisに限らずbindするメリットは呼び出し側が(bindで引数を合わせることにより)実際に呼び出される物がどんな関数のか気にせずに呼び出せることっていうのは解るよね?
それで、thisのbindだけ疑問視する理由は?
677 :
2017/03/18(土) 13:38:41.49 ID:waR+gchT0
>>673
> callbacks.push_back(std::bind(&A::func, &a));
これを、this側が関係ない奴、例えばBにして、

callbacks.push_back(std::bind(&A::func, &b)); // (D)

だとコンパイル通らないだろ?(俺の予想だが)
だったら、常にその場合は、

callbacks.push_back(a->*func));

と書けるよね?という話。
(もちろん糖衣構文ならそれでいいんだが)

JavaScriptは(D)でもコンパイル通るんだよ。(まあコンパイル自体がないんだが)
そして実行も出来る。(ただし実行時にメンバが揃ってない時にはお察しで)
678 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/18(土) 13:48:07.93 ID:ux+WuUO90
>>677
つまり
>callbacks.push_back(a->*func))
と書けるようにしたらbindでthis使う必要ないって話?
そうなのであれば
callbacks.push_back([&]{a.func();});
と書けるから別に要らない
679 :
2017/03/18(土) 13:53:42.63 ID:waR+gchT0
>>676
見やすさの為に、というのはいい。

> thisのbindだけ疑問視する理由は?
プログラミングコストが減ってないから。
auto a_func = std::bind(&A::func, &a) なら、
a を管理するか a_func を管理するかで、何も隠蔽出来てないし減ってない。

ただ>>673みたいな使い方だと、
型を揃えた結果、同じ記述で実行出来るから、この点は確かにメリットはある。
これを言いたかったのか?
680 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/18(土) 13:59:12.74 ID:ux+WuUO90
>>679
bindを使う利点なんてそれしか無いと思うんだけど…
681 :
2017/03/18(土) 14:02:09.89 ID:TmvAgLdoM
>>674
C++では、お前があとからやってるインスタンス構築を先にやっとけよってだけの話
682 :
2017/03/18(土) 14:03:34.16 ID:TmvAgLdoM
>>679
type_erasureの話がしたかっただけ?
C++のこと知らねーなら議論の余地がなさすぎ
JavaScriptスレいけよ
683 :
2017/03/18(土) 14:04:04.03 ID:waR+gchT0
>>678
ちょっと輻輳してて申し訳ないが、

> >callbacks.push_back(a->*func))
> と書けるようにしたらbindでthis使う必要ないって話?
そう。というか継承関係ある状態でしかメンバ関数使えないのなら、
thisをbindする意味がないと思った。
(引数はbindしていいが、これもbindなしで継承でも書ける>>669

ただし、>>673みたいに、「戻り値と引数が同じなら同じ関数型」として扱えるのなら、
継承関係なしのA::funcとB::funcを同じに扱えるからやっぱbindしてないと駄目だな。


ところで、ここでクロージャを使うことに意味はあるのか?
> callbacks.push_back([&]{a.func();});
もちろん使ってもいいが、a.funcがクロージャ内の変数を捕捉しているはずもないし、直接
> callbacks.push_back(a->*func));
で全く問題なくね?
684 :
2017/03/18(土) 14:06:49.68 ID:WJ1Bgcsq0
正直
std::function<...> f[] = a.func;
で書けるなら書きたい
書けないからbind使ってる
685 :
2017/03/18(土) 14:07:07.58 ID:WJ1Bgcsq0
[]いらない
686 :
2017/03/18(土) 14:10:17.22 ID:JpaAP8SC0
今時bind使わずlambdaで済ますよね
687 :
2017/03/18(土) 14:10:36.75 ID:TmvAgLdoM
>>683
aをキャプチャする必要が有るだろうが
まじでclassとインスタンスの違いをもう少し学んでくれ
688 :
2017/03/18(土) 14:11:31.23 ID:2lr6MuOgr
なんだ、継承の意味を知らないんじゃなくて
std::bindを見てECMAScriptのbindingと同じものだと勘違いしていただけか。
これでは話が噛み合うはずがない
689 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/18(土) 14:14:40.36 ID:ux+WuUO90
>>687
新しい文法追加してa->
*func って書いたらaを参照キャプチャしてfuncを呼び出す関数オブジェクトを返すようにしてほしいらしいよ。
690 :
2017/03/18(土) 14:17:30.12 ID:TmvAgLdoM
>>689
関数を一級オブジェクトにしろという主張??
別の言語でやれとしかいいようがないな…
691 :
2017/03/18(土) 14:20:22.86 ID:waR+gchT0
>>681-682
> インスタンス構築
それはインスタンス構築ではなく、使う物だけとりあえず入れてるんだよ。
a を構築しているのではなく、 a.func の数式 k*x+a を使いたいから、
とりあえず a と k に値を入れて使っているだけ。
数式を間借りしているだけなんだ。

もっと a が複雑で、100個くらいメンバを持っているベクトル値だったとして、
calcも calc_0 〜 'calc_100 とかあったとして、そのうち1個だけ丁度いい数式があったら、それを借りる感じ。
このデタラメっぷりはC++にいると理解不能だが、JavaScriptに慣れるとC++が色々面倒で仕方ない。
そもそもテンプレートも型消去も最初からvarだとやらなくていいんだよ。
(その分デバッグが辛いが)
692 :
2017/03/18(土) 14:24:47.73 ID:waR+gchT0
>>689
いやその文法はすでにC++0xにあるとの理解だが、これが間違いか?
既に>>663にURL上げたが。
> メンバーを指すポインター演算子 .* および ->* は、特定のクラス・オブジェクトのメンバーを指すポインターをバインドする際に用いられます。
693 :
2017/03/18(土) 14:26:29.15 ID:TmvAgLdoM
>>691
> それはインスタンス構築ではなく、使う物だけとりあえず入れてるんだよ。
>とりあえず a と k に値を入れて使っているだけ。
>数式を間借りしているだけなんだ。
それをインスタンス構築っていうんだよ、覚えとけばか

>もっと a が複雑で、100個くらいメンバを持っているベクトル値だったとして、
>calcも calc_0 〜 'calc_100 とかあったとして、そのうち1個だけ丁度いい数式があったら、それを借りる感じ。
そういう場合はお前の言うとりあえずだけを入れられるコンストラクタ作るんだよ
まぁ普通の感性ならその部分はサブクラスとして切り出すけどね

>このデタラメっぷりはC++にいると理解不能だが、JavaScriptに慣れるとC++が色々面倒で仕方ない。
>そもそもテンプレートも型消去も最初からvarだとやらなくていいんだよ。
面倒ならjsで書いとけばいいんじゃないですかね
694 :
2017/03/18(土) 14:27:43.20 ID:TmvAgLdoM
>>692
間違い
695 :
2017/03/18(土) 14:43:08.69 ID:waR+gchT0
>>684
ちなみに何でそれ書けないんだ?

std::function<...> f_bound = a.func; // (E) バインド済み
std::function<...> f_not_bound = A::func; // (F) 未バインド、第1引数はthis

で文法的に問題ないし、普通にこうだと思っていた。

ただし俺はC++でメンバポインタを使ったことはないから、
現在駄目なのなら何か理由があるのだろうけど、
逆にそうだと信じ切っており、
JavaScriptはこれができない=常にbindが必要なのでウザくて仕方なかった。例えば、

var func = someInstance.someMethod.bind(someInstance);

と常に2回 someInstance と書く必要があり、これがウザイ。
ただC++も同じく糞なのか?
696 :
2017/03/18(土) 14:55:00.20 ID:TmvAgLdoM
>>695
classとインスタンスの違いがわかってないうちはマジで理解できないだろうからもう諦めろ

JavaScriptのbind一通り調べたよ
jsは関数型に依っててインスタンスって考え方がないんだな
697 :
2017/03/18(土) 15:03:41.03 ID:JpaAP8SC0
最悪一部menberの参照だけ取られる表記と同じで、それがメンバ関数だとインスタンス全部が人質になるとか怖すぎ。
698 :
2017/03/18(土) 15:44:12.23 ID:waR+gchT0
>>696
インスタンスとクラスの違いが分かってないのはお前だろ。
>>695をJavaScriptで再記すると、

var a = new A();
var func_0 = a.func; // bindされない ← 直感的にはbind済みであって欲しい
var func_1 = A.prototype.func; // bindされない ← これはOK

で、JavaScriptは両方ともbindされないんだよ。
だから他言語から来た連中はbindを忘れてここでバグると言われている。
その「他言語」ってのは俺はてっきりC++だと思っていたから、695の理解になる。

ところがC++も同様に糞ならまあそれでよし。
改めて見ると、代入出来ないってことか?つまり、以下が出来ない。

std::function<...> f = a->*func; // bind済み
std::function<...> f = a.*func; // bind済み

なるほどC++も糞だな。ただ、実装自体は>>669で出来るのだから、
何故これを出来ないようにしたのかは謎だが。
699 :
2017/03/18(土) 15:49:31.59 ID:YXP7lJmh0
JavaScript…
あれはインスタンスしかないみたいな似非^2オブジェクト指向じゃん?
あまりの酷さに批判が高まったのか、エッセンス6とかでprototypeキーワードが導入されたが
それぐらいのもん

ちなC++の話として、クロージャはあんま継承関係無い
f.calc(x, 2)をfunc(x)の如く扱いたければfの所有でおk
700 :
2017/03/18(土) 15:55:28.34 ID:YXP7lJmh0
個人的にはstd::bind(&F::calc, f, _1, 2)ですらF::calcの直接callに最適化されずに、
間接メモリアドレッシング後のcall止まりになるんではないかと危惧してゐる
テンプレートを使える環境にありながら
関数へのポインタなど使うのは教育上によろしくない
701 :
2017/03/18(土) 16:02:10.31 ID:waR+gchT0
なおC#ではあっさり書けることが判明した。
> class DelegateTest
> {
> static void Main()
> {
> Person p1 = new Person("鬼丸美輝");
> Person p2 = new Person("神無月めぐみ");
>
> ShowMessage show = new ShowMessage(p1.ShowName);
> show += new ShowMessage(p2.ShowName);
> show += new ShowMessage(A);
> show += new ShowMessage(B);
>
> show();
> }
>
> // 結果
> // 名前: 鬼丸美輝
> // 名前: 神無月めぐみ
> // A が呼ばれました。
> // B が呼ばれました。
> http://ufcpp.net/study/csharp/sp_delegate.html
702 :
2017/03/18(土) 16:02:29.43 ID:waR+gchT0
そしてC++でも出来そうなんだが、、、
> Human alice;
> printf("Alice");
> (alice.*pf5)();
>
> // おまけ
> int Human::*x = &Human::age;
> alice.age++;
> printf("age = %d (%d)", alice.*x, &(alice.*x));
> http://qiita.com/Ted-HM/items/282785fcdcd06fb59642
703 :
2017/03/18(土) 16:27:36.88 ID:waR+gchT0
>>699
> 似非^2オブジェクト指向じゃん?
あれはクラスベースではなくプロトタイプベースだから。
それを無理矢理クラスベースとして使おうとするからおかしな事になる。
最初からプロトタイプベースとして使えば何も問題なく、
実際に表現出来る範囲もクラスベースよりも広いので、なかなか面白い。

> ちなC++の話として、クロージャはあんま継承関係無い
JavaScriptでも継承とクロージャは全く関係ない。

> f.calc(x, 2)をfunc(x)の如く扱いたければfの所有でおk
これはそうだと思う。
fがf_boundに変わっても手間は同じで、意味ねーというのが最初の主張。

>>700
> 個人的にはstd::bind(&F::calc, f, _1, 2)ですらF::calcの直接callに最適化されずに、
というかこれを期待するのがC++なのか?
それはさすがに厳しいとは思うが、確かに無理ではないが。

> テンプレートを使える環境にありながら
> 関数へのポインタなど使うのは教育上によろしくない
これはどういう意味?さすがに今回の上記
> std::bind(&F::calc, f, _1, 2)
をテンプレートで常に直接callするようには出来ないだろ。
というかテンプレートと関数ポインタの使う範囲は被らないと思うが。(代替出来ない)
704 :
2017/03/18(土) 16:35:15.55 ID:YXP7lJmh0
>> 個人的にはstd::bind(&F::calc, f, _1, 2)ですらF::calcの直接callに最適化されずに、
>というかこれを期待するのがC++なのか?
>それはさすがに厳しいとは思うが、確かに無理ではないが。
できる
F:calc()は仮想関数では無いし、
表記の例では&F:calc自体が(F::calc()と同じシグネチャを持つ別名の関数とかに)差し替えられはしないので
本質的には直接callとなるべきもの
705 :
2017/03/18(土) 16:38:53.29 ID:waR+gchT0
ああ分かった。
>>702はこちらの解釈間違い、これは出来ているわけではないね。
.* と ->* はあくまでその場で呼んでいるだけであって、
bind済みの関数を返してくれるわけではないのね。
706 :
2017/03/18(土) 16:42:00.60 ID:TmvAgLdoM
もういいよ
jsスレでやれよ
707 :
2017/03/18(土) 17:00:49.05 ID:waR+gchT0
>>704
> 本質的には直接callとなるべきもの
それを言いだしたら全部だろ。そうなってないから色々問題なわけで。
ただこれに関してはスタックイメージを揃えればいいだけだから、やる気だけだね。

最初からスタックイメージを揃える呼び出しを用意してもいいし、
一旦>>669の形式で2段階呼び出しにして、インラインにしてもいい。
(ただしインライン展開対象は外側関数なので従来最適化ルーチンは使えない)
いずれにしても難しくはないよ。やる気だけの問題だね。
708 :
2017/03/18(土) 17:01:39.49 ID:U4KC6daQ0
知識がないのに何故語ろうとする
709 :
2017/03/18(土) 17:59:03.48 ID:YXP7lJmh0
>それを言いだしたら全部だろ。そうなってないから色々問題なわけで。
std::bind(&F::calc, f, _1, 2)という記述を見たコンパイラはポインタが関係するのでF::calc()を直接呼出しして良いものか迷うかもしれないが、
std::bind(<F::calcを表す関数オブジェクト>, f, _1, 2)なら
std::bind()自体の書き方や関数オブジェクトの書き方がよほどアレでない限りはF::calc()直接呼出し相当のコードになる
全部一緒というなら一緒なんだろう藻前の中では(ry
710 :
2017/03/18(土) 20:18:06.83 ID:waR+gchT0
>>709
いや結局何が言いたいんだ?

君:700「std::bind(&F::calc, f, _1, 2)は最適化されないかも…」
俺:703「それを期待するのは厳しいだろ」
君:704「いやできるし、そうなるべきだ」
俺:707「そりゃそうだが」

人間が見れば簡単に分かることが出来ないなんて!なんてのは全部だよ。
一般的にはポインタになった時点で最適化が難しくなる。

f->calc(x,k); // 直接呼び出し
std::bind(&F::calc, f, _1, 2)(x); // 直接呼び出し
std::function<...> f; // (G)
f = std::bind(&F::calc, f, _1, 2); // (H)
f(x); // 2段呼び出し // (I)
f = std::bind(&F::calc, f, 2, _1); // (J)
f(k); // 2段呼び出し // (K)

C++では「戻り値と引数」が合ってたら良いんだろ?
だったら(G)はいけるよな?
この場合、fには(H),(J)とも可能なんだよ。
バインドされているのは第1引数でも第2引数でもいい。
ところがこれを実行する際、直接呼び出しに展開する為には、
(I)と(K)で呼び出し方法を変えなければならない。
スタック上の引数の位置が異なるからね。
そして一般的には(H)(J)はどこか遠いところで代入されており、
通常はその関数外から与えられる。
だから最適化は難しいんだよ。
711 :
2017/03/18(土) 20:18:41.61 ID:waR+gchT0
ローカル関数内でfが分かりやすく代入されている場合は完全に最適化出来る。
同様の方法で外部から与えられた場合でも常に最適化する為には、
fに代入される可能性のあるポインタを全て精査する事が必要だが、一般的にこれは無理。
(書いた本人には何が入る可能性があるか簡単に列挙出来るが、
ソースコードから抽出するのはかなり無理)
したがって、次案としては、
f自体に「第○引数を第△引数に入れ替え、第●引き数は▲で固定」という情報を持たせ、
対応することになる。(なおこの操作を別関数として行うのが「2段呼び出し」になる。)
もっとも、C++のメンバポインタはintサイズでなくてもいいみたいなので、
この方法でも出来なくもないが、VC++ではやってないね。
> VC++で試したところ、普通は4、多重継承していれば8、仮想継承していれば12となりましたが、
> http://www7b.biglobe.ne.jp/~robe/cpphtml/html03/cpp03058.html
これをやっていれば通常でも4では済まない。
多重で増えているのはポインタのずれを補正する分だね。
> https://www.microsoft.com/japan/msdn/vs_previous/visualc/techmat/feature/jangrayhood/
712 :
2017/03/18(土) 20:19:09.95 ID:waR+gchT0
分かるか?
完全に「直接呼び出し」にするには動的データとして「メンバ関数オブジェクト」みたいな物を作り、
それの展開ルーチンをインラインで埋め込まないといけないんだよ。
(サブルーチンで呼び出すと結局2段呼び出しになるだけ無駄)
だったらそのままその「展開ルーチン」→「ターゲットメンバ関数」の2段呼び出しでもいいや、ってことになるだろ。
それがVC++でこの部分の直接呼び出し最適化をしていない理由だと思うよ。
多分さほど効果がないんだよ。(やる事自体は難しくない)

表面的な原因は、「第1引数がbindされた関数ポインタ」「第2引数がbindされた関数ポインタ」が
同じ型になってしまうことだよ。だからといって、これらが別型なのは言語として糞だろ。
明示的に分かりやすくその場で代入されている場合は、
これらを別扱いすればいいだけだから比較的楽に対応出来る。
だけど一旦ポインタとして受けられた場合、どれになるかは分からなくなるので無理になる。
それで、ポインタ自体にその情報を与えて動的モドキで対応するよりも、
単純に2段呼び出ししたほうがマシ、という判断が為された、ということだよ。VCでは。
ただ、2段呼び出しは「継承したクラス」を自分で書いた場合で、
std::bindってevalするわけではなくて、静的なライブラリ(=データしか作成出来ない)だよな?
だったら内部的に上記「メンバ関数オブジェクト」方式になっている可能性が高く、
2段呼び出しで汎用ルーチンで展開=一番遅いパターンだと思うけどね。
まあここら辺はそっちの方が詳しい気がするが。

で、改めて聞くが、何が言いたいんだ?
俺はCコンパイラを作っているわけではないし、俺に文句言われても知らんがな。

結論としては、
> std::bind()自体の書き方や関数オブジェクトの書き方がよほどアレでない限りはF::calc()直接呼出し相当のコードになる
は間違いだね。理由は上記、完全精査はかなり難しいからだ。
(もし出来てるのならスゲーとは思うけど)
713 :
2017/03/18(土) 20:25:58.81 ID:vEAnzxNk0
std::hashのconstexpr版って標準に入る予定とかないの?
714 :
2017/03/19(日) 00:13:07.69 ID:F98WB86R0
>>710-712
長文乙だがstd::bind()が(テンプレート関数なので)インライン展開されるということが何を含意し、
関数オブジェクトと組み合わせたときどういう効果があるかあんまお分かりではなさげ

std::bind()内の第1引数への操作がインライン展開されるならば(そのようにstd::bind()自体が書かれているならば
第1引数の操作に関して
>人間が見れば簡単に分かること
は、
>コンパイラが見れば簡単に分かること
と一致する(>>709の「std::bind()自体の書き方(中略)がよほどアレでない限りは」がソレを指してゐる

で、第1引数が関数オブジェクトでありかつF::calc()が仮想関数で無い限りは、F::calc()というシンボルのアドレスが
コンパイル時に決まるから、直接呼出しのコードにできる
第1引数がポインタの場合はそうとは限らず、std::bind()の呼び出しの外もみてポインタが指すシンボルが一意であることまで
確認しないとコンパイラはF::calc(this, x, 2)というcallで済むところを(*p)(this, x, 2)的なコードにしかできない
715 :
2017/03/19(日) 00:17:51.96 ID:UQylyHTkd
お前らのおすすめのデザインパターんおしてて
716 :
2017/03/19(日) 00:18:40.25 ID:F98WB86R0
訂正
誤: F::calc()というシンボルのアドレスがコンパイル時に決まるから、直接呼出しのコードにできる
正: F::calc()というシンボルの呼び出しであることがコンパイル時に確定するから、直接呼出しのコードにできる
717 :
2017/03/19(日) 00:38:21.66 ID:rBaNXWYpr
>>715
とりあえずRAIIは使っとけ
ナマポをnewする奴は殺害されても犯人に情状酌量の余地が残る
718 :
2017/03/19(日) 00:38:32.17 ID:Sogj9z7eM
>>715
expression template
719 :
2017/03/19(日) 01:10:03.99 ID:7dJ8iAqk0
>>714
日本語で説明しようとしたのはまずかった。C++で書き直すと、以下。
ただしC++文法には詳しくないので、syntaxErrorは適宜脳内修正よろしく。
意味だけ見てくれ。ソースは>>666から流用してる。

class F {
int _a;
public:
F(const int a):_a(a) {}
int calc(const int x, const int k) const { return k * x + _a; }
};

int main()
{
const F f0(1);
const F f1(2);
std::function<...> f0_1 = std::bind(&F::calc, f0, _1, 3); // 第2引数を固定
std::function<...> f0_2 = std::bind(&F::calc, f1, 4, _1); // 第1引数を固定
std::function<...> f1_1 = std::bind(&F::calc, f1, _1, 5); // 第2引数を固定

call_sub(F0, f0_1, f0_2);
call_sub(F1, f1_1, f0_1);
}

void call_sub(F& f, std::function<...> f1, std::function<...> f2){
f->func(1,2); // (L) 直接呼び出し
f1(3); // (M) コンパイラによっては直接呼び出し、一般的には2段階呼び出し
f2(4); // (N) 2段階呼び出し
}
720 :
2017/03/19(日) 01:10:33.50 ID:7dJ8iAqk0
(L)は必ず直接呼び出しになる。アセンブラなら push, push, push, call
(M)はソース上を精査すれば同型呼び出ししかないことが分かるので
技術的には(L)と同程度まで最適化可能ではあるが、一般的には無理だと思う。
2段階呼び出し時は push, push, push, call, mov, jmp
(N)は異なる形の呼び出しが与えられているので、
技術的に(L)と同じコスト(アセンブラ4命令程度)の直接呼び出しは不可能。
無理にcmpとかやるより普通に2段階呼び出しの方がいいと思う。
だからVCもそうしていると見ている。

それで、std::bindについては詳しい奴が以下見れば実装の見当が付くはずだが、
俺はC++用語に詳しくないので分からん。
http://ja.cppreference.com/w/cpp/utility/functional/bind
俺が実装するなら、ありがちなのをテンプレートで実装するが、
その場合はポインタサイズはsizeof(int)*2になる。
(メンバ関数へのポインタと、bind済みの値をstructで持つ=内部的な匿名クラスにするから)
VCがなぜ4に出来るのかは分からん、というか計測間違いじゃないかと思う。
(バインド済みの値の分を入れてない)
721 :
2017/03/19(日) 01:11:05.58 ID:7dJ8iAqk0
俺が言いたかったのは、上記(L),(M),(N)ということ。
君の主張は、すべてbind時で確定して、上記(M)(N)も(L)と同じコストで呼べるという主張だと読める。
それは無理。
確かにアドレス自体は確定はするが、
引数をbindしているのだからスタックをその形にしてやらないといけない。
上記(N)の呼び出し、アセンブラ4命令ではどうやっても書けないだろ。
cmp使って書くくらいなら2段階呼び出しで6命令(2分岐)の方がマシ。

cmp使って無理に直接呼びにしたら、
そこに来る可能性のある呼び出し型を全部そこに書かなければならなくなる。
そしてx86はプレディケートを持ってないので、cmpで分岐しないといけない。(ARMは持っている)
それって完全に本末転倒だろ。

それで、std::bindと関数オブジェクトをどう組み合わせたら、
(L),(M),(N)について上記通りアセンブラ4命令程度で呼び出せるのかよろしく。
722 :
2017/03/19(日) 01:17:42.85 ID:7dJ8iAqk0
すまん、重要なところを間違えていたので訂正。
>>719
> std::function<...> f0_1 = std::bind(&F::calc, f0, _1, 3); // 第2引数を固定
> std::function<...> f0_2 = std::bind(&F::calc, f1, 4, _1); // 第1引数を固定
> std::function<...> f1_1 = std::bind(&F::calc, f1, _1, 5); // 第2引数を固定
の2つ目、インスタンスは f0 ね。

std::function<...> f0_2 = std::bind(&F::calc, f0, 4, _1); // 第1引数を固定, f0

ただ結局、変な引っかけみたいになっているだけで意味は同じかな?
まあ訂正しとくけど。
723 :
2017/03/19(日) 01:31:51.96 ID:i6MRGbY60
まだJAVAガイジ張り付いているのか…
724 :
2017/03/19(日) 01:41:06.04 ID:I9SbzQA70
あんだけ無能な醜態をさらしておいて
ボクはレベルが高いけどちょっと知らなかっただけちょっと間違えただけで済んで
まだ自分のいうことに説得力がある聞いてくれる人がいると思ってるところがもうね…
725 :
2017/03/19(日) 01:44:23.31 ID:7dJ8iAqk0
bindの説明読む限り、やっぱこれかなり汎用に作っていて遅いと思うぞ。
ただ一般的にはそこが見えるほど使うことはないと思うが。
アセンブラ的には、

f->func(): 4命令程度(分岐1回)
std::bind経由での呼び出し: 10-50命令程度か?(分岐2回以上)
内部オブジェクト作成方式: 6命令程度(分岐2回)

じゃないかな。
726 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/19(日) 01:49:16.54 ID:jcDR9uoj0
まぁ、別にスレ違いというわけでもないからいてもいいんじゃない?付き合いたい人が付き合えば。
俺はレスしないけど。
727 :
2017/03/19(日) 01:59:32.09 ID:jcDR9uoj0
と、言ったものの、我慢しきれないので撤回します。

>>725
https://godbolt.org/g/SFtHQt

こうなる意味を考えて。
もう一つヒントあげるとstd::function<int()>で受けるとどうなるか見てみたらいいよ。
728 :
2017/03/19(日) 02:14:29.60 ID:7dJ8iAqk0
誰かと思えば>>678か。
じゃあついでに言っておくと、以下だね。

callbacks.push_back([&]{a.func();}); // (O) クロージャ作成が無駄
callbacks.push_back(a->func)); // (P) この書き方は現在出来ないが、こっちの方がいい

JavaScriptでは(O)は無駄だとされる。クロージャが余分にメモリを食うから。
クロージャ無しで書けるならその方がいい。コード領域も無駄だし。
これはC++も同じだし、C++の方が厳しいはずだが。
とはいえstd::bindの仕様が重すぎるのでこちらもイマイチだ。
C++ならどっちが重いかは微妙だね。

なおJavaScriptのbindは「前から順に固定される」だけの仕様なので、
固定した引数分のデータ領域しか各bindインスタンスには必要ない。
というかC++のbindが妙にリッチな仕様なのが謎だが。C++っぽくない。
729 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/19(日) 02:17:00.87 ID:jcDR9uoj0
>>728
C++なら無駄ではない
終了
730 :
2017/03/19(日) 02:19:33.17 ID:7dJ8iAqk0
>>727
俺には計算済みとしか見えないが、何か操作必要?
-O3外せとかか?

> fn(int):
> lea eax, [rdi+rdi]
> ret
> bind():
> mov eax, 4
> ret
> direct():
> mov eax, 4
> ret
731 :
2017/03/19(日) 02:28:44.92 ID:7dJ8iAqk0
>>727
というかな、根本的に間違ってると思うぞ。

一般的に関数ポインタを使う場合、それは外部から与えられるんだよ。
自分の内部で作って使うって事はない。
(ここでは単純なソースで議論するからそうなるだけで、一般的にはそうではない。
つか、それじゃ関数ポインタの意味がないし)

典型的にはcallbackだよ。外部から与えないと全く意味無いだろ。
で、その場合は当然この手の事前計算とかでの最適化は出来ないんだよ。
732 :
2017/03/19(日) 02:33:33.53 ID:jcDR9uoj0
>>731
一時一句同じじゃないと理解できない人だったか。

https://godbolt.org/g/o73pz4

これで理解できますか?
733 :
2017/03/19(日) 02:51:38.54 ID:7dJ8iAqk0
>>732
あーお前がアホだということはよく分かったわ。

まともに議論する気なら、お互いが見ているものが同一であることを確認しないといけない。
>>727を見たらアホかと思うのは道理だろ。

そして>>732もアホかと思うよ。関数内部で何を作ってもそれは最適化されるよ。
それは一時変数を除去すればいいだけなのだから。
そうではなくて、例えば以下にしないといけない。

int main(){
auto f = std::bind(&something::func,ptr);
bind(f);
}

int bind(std::function<...> f){
return f(); // bind済みのfを呼ぶコストをここで計測する
}

再度言うが、関数ポインタは外部から与えないと意味無いんだよ。
てかお前ら実は全く関数ポインタ使ってないだろ。
だから使い方自体を知らないんだよ。

これで、bind/関数オブジェクト/クロージャで呼び出しコストを比べてみなよ。
当たり前だが上記だとbind呼んで終わりになるけど、
もちろんその先のターゲット(something::func)が呼ばれるまで見るんだよ。
つまりstd::bind内部のコードもね。それが呼び出しコストなんだから。
それで、あらかじめ計算済みとかいうアホなオチはマジで止めてくれ。
一般的にポインタを与えた場合、それが無理なことくらい分かるだろ。
734 :
デフォルトの名無しさん (ワッチョイ 537b-v8EU)
2017/03/19(日) 03:14:07.27 ID:jcDR9uoj0
>>733
注文の多いやつだなぁ。

https://godbolt.org/g/R1ljMl

関数ポインタを外から渡すようにかえてやったぞ。
自分で言ってることをC++で書く能力ぐらいあるよね?
次から自分で書けよ。


std::bindに余分なコストなんてない。std::functionの方にある。
ヒントあげたのに全く考えようとしなかったのかな?
735 :
2017/03/19(日) 03:24:22.16 ID:jcDR9uoj0
>>733
なぜか一時変数だから最適化できると信じてるみたいだけど、そう思うなら

int std_function(something* ptr,fn_ptr_type fptr){
std::function<int()> f = std::bind(fptr,ptr);
return f();
}

と書いてみればいい。

>そして>>732もアホかと思うよ。関数内部で何を作ってもそれは最適化されるよ。
>それは一時変数を除去すればいいだけなのだから。
がバカな発言だったと理解できると思うから。
736 :
2017/03/19(日) 03:38:13.98 ID:xwQyhAst0
ああ、Javaだと〜とか言ってた人か
737 :
2017/03/19(日) 08:10:18.88 ID:oCYtEhVi0
>>717
調べても出てこない....
コンストラクタとデストラクタでNewとかするやつだっけ??

>>718
数式を渡して分かりやすくするってのはなんとなくわかったんだけど
逆にごちゃごちゃしすぎてる気がするって印象を受けた
738 :
2017/03/19(日) 08:15:20.51 ID:gWCLtiPs0
>>737
デストラクタでdeleteやで

expression templateは効果がどうなの?って思い始めてる
普通にコンパイラの最適化に任せた場合とそんなに変わるんかな
739 :
2017/03/19(日) 08:18:02.91 ID:oCYtEhVi0
>>738
すまん
とかにまとめた
scope抜けたときに必ず処理させるってやつよね
確かに必要なやつだな

コード見やすくってやって逆に色々と設定があると逆に見にくくなるんじゃないか?って疑問が残った
今はあとシングルトンパターンぐらいしかわかんないや
740 :
2017/03/19(日) 08:46:03.88 ID:7dJ8iAqk0
訂正ね。
>>733
× std::bind内部のコードもね。
○ std::functionのoperater()の内部のコードもね。

処理系の実行コードも、という意味で書いたが、
std::bindはstd::functionを返すので今回についてはoperator()のコードになるのだよな?
まあ間違っていたら適宜訂正してくれ。分かる範囲だと思う。

>>734
> std::bindに余分なコストなんてない。std::functionの方にある。
これが上記について言っているのならその通り。
ただそれは揚げ足取りだと分かるだろ。それがやりたかったのならどうぞ、おめでとう。
それが分からないのなら君にはこの話は無理だね。
というわけでいずれにしてもこの話は終わりでいい。
741 :
2017/03/19(日) 08:47:04.27 ID:7dJ8iAqk0
一応中身は確認した。
>>734については呼び出し側は全部同じコードが出るという事ね。ここまではいい。
問題はその先だ。それは君も分かってるんだろ?だったら何故それをしない?

>>735
> なぜか一時変数だから最適化できると信じてるみたいだけど、そう思うなら
これについては相変わらずそちらが間違いだね。
事前計算済みのコードをドヤ顔で出してきたのはそちらだろ。
それはコンパイル時に「事前計算が出来る」ということがコンパイラにも分かったから。
とはいえ、君みたいな奴も沢山いるのも事実だよ。

> と書いてみればいい。
書いてみたらstd::functionのコードが出た。
中身は今の俺にぱっと分かるようなものではないね。
が、まあ、100命令弱増えているからその分遅いと言える。
だから結論は、直接=ファンクタ<<<<bindになるのかな?
ファンクタは正直ピンとこない。
あとは>>729で無駄がないとドヤ顔のラムダがどこまで速いかだね。
まあ頑張って。

いずれにしても、この話は終わりでいい。
俺が確認したい範囲はもう分かった。
742 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/19(日) 08:51:40.65 ID:jcDR9uoj0
>std::bindはstd::functionを返すので今回についてはoperator()のコードになるのだよな?

ここまで書いても理解出来ないのかよ…
743 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/19(日) 09:00:02.50 ID:jcDR9uoj0
>>741
俺はただ知識がないやつをバカとは思わないが、お前みたいな自分が理解出来ないのを相手のせいにしてアホなんて言う奴は本当にバカだと思うよ。

書いておかないと理解しなさそう(=出来なさそう)だから一応書いておいてあげるよ。

std::bindの返りの型はstd::functionでは”ない”
744 :
2017/03/19(日) 09:08:50.00 ID:EshC/yEQr
>ID:7dJ8iAqk0
コストは 直接=ラムダ=bind <<< std::function
bindとstd::functionは関係無い
functionにbindを重ねればfunctionのコストがそのまま残る
745 :
2017/03/19(日) 09:17:50.63 ID:7dJ8iAqk0
>>743
だから俺はそこら辺までは詳しくないのさ。
繰り返しているとおり、std::bindの説明を読んでも全てを今すぐ理解する知識はないんだよ。
俺はC+JavaScriptだからね。C++はbetterCとして使ってきてるが、
VC++(=CLI)だからSTLを使ったことはなく、.NETだし。

C++特有のテンプレートとか型消去については
「動的型なら何も考える必要ないのに」で飛ばしてきたし、
RAII+スマポについても「そこまで言うならGC言語使えよ」としか思ってない。

だから今、型消去とかも読んでるけど、これを理解するには時間がかかるし、
上記の通りSTLについてもほぼ知らないから、これまたインストールに時間がかかるんだよ。


> std::bindの返りの型はstd::functionでは”ない”
まあそれはさておき、std::bindは何が返るんだこれは?
型消去で無理矢理格納出来るだけなのか?
ただ、実行時はstd::functionのoperator()が呼ばれると思うが、これも違うのか?
746 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/19(日) 09:26:27.21 ID:jcDR9uoj0
>>745
知らないなら想像で実行時コストとか決めつけるなよ

auto f=std::bind(func);
f();

std::function<int()> f=std::bind(func);
f();

で出力されるコードが違うんだから違うと解るもんだとおもってstd::function版を書かせたんだけど、何が解らなかったのかな?
747 :
2017/03/19(日) 09:41:13.37 ID:7dJ8iAqk0
>>744
あー何となく分かってきた。以下ページ、
http://ja.cppreference.com/w/cpp/utility/functional/bind
の「メンバ関数 operator()」ってとこが呼ばれるのか。つか英語版見るべきだったかも。
じゃあ当初の「std::bind内部のコードもね」でも十分通じる気もするが、まあこれはいい。

いずれにしても俺はこの通り、cppreferenceの見方もよく分かってない。
だから君らに追いつくのは時間がかかる。

> コストは 直接=ラムダ=bind <<< std::function
ラムダは最高に最適化された状態でbindと同じ。
bindもoperator()の内部でプレースホルダ引数の配置をするのなら、
同様に最高に最適化された状態で直接と同じ。
結果、直接=<bind=<ラムダ じゃないか?
まあこれについてはそちらの方が詳しいだろうし、こちらも引き続き詳細確認中だが。
748 :
2017/03/19(日) 09:49:17.20 ID:7dJ8iAqk0
ちなみに誰かと確認してみたが、
> std::bindを見てECMAScriptのbindingと同じものだと勘違いしていただけか。(>>688)
なるほど、その通りだ。俺が思っていたbindとはだいぶ違う。
749 :
2017/03/19(日) 09:52:16.04 ID:/fHKNSq50
直接<間接=関数ポインター<λ<バインド
なぜならバインドは内部で関数ポインターを使うしかないから
ラムダは言語で実装されてるから。
750 :
2017/03/19(日) 17:47:12.05 ID:SFAOW7ATp
関数呼び出しのコストでここまで議論できるって凄いな
普段C++で何作ってんだろ
751 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/19(日) 18:17:17.48 ID:jcDR9uoj0
>>750
議論ではなく出来の悪い生徒の補習してただけだから。
752 :
2017/03/19(日) 18:21:02.30 ID:V1EWIlT/0
ギリギリ迫るのも楽しいものです
753 :
2017/03/19(日) 18:49:00.48 ID:6JgBGVv40
>>750
え、Hello worldだよ?
754 :
2017/03/19(日) 20:26:30.60 ID:fEuC6OUR0
ある時系列データにフィルタを通した任意の範囲のデータを扱うクラスを作るんだが
今だとイテレータよりRangeの方が良いのか?
755 :
2017/03/19(日) 22:20:21.59 ID:V1EWIlT/0
もう少し具体的に と思います
756 :
2017/03/20(月) 00:26:19.05 ID:V0m6X4Gc0
基本的にレンジはイテレータのペアのラッパでしかなく
イテレータが無くなるわけでもないからとりあえずはイテレータを前提に作っておけばよかろ
757 :
2017/03/20(月) 12:05:47.42 ID:OlwkB3mR0
>>737
expression templateは遅延評価による高速化のために使うんやで
速度が必要無いなら要らんのやで

>>738
実測してみた?
二項演算子(または結果を戻り値で返す関数)を多用する場合、
x, y, zを持つベクトルなんかだと明らかに効果ある
組み込み型だと全く効果ない
758 :
2017/03/20(月) 13:05:30.60 ID:ZNh1GxS+0
>>757
いつか実装して確かめてみようとは思うんだけど
・数学的に簡略化が可能な場合は当然事前にできるだけ簡略化する
・計算途中の値もよく使うので=が出てきて評価が頻繁
な場合、あんまり効果なさそうだなあというところで二の足
759 :
2017/03/20(月) 13:17:35.04 ID:hOjZeIpo0
expression templateってコンビネーターのことじゃね?
760 :
2017/03/20(月) 13:29:36.59 ID:o1Hy6TV3M
>>758
計算途中の値もよく使うって、それ途中と違うがな
函数という考え方について、もう少し勉強した方がいい
761 :
2017/03/20(月) 14:06:32.00 ID:OlwkB3mR0
>>758
あーまだ実装してないのね
自分の実用するコード(4次元までのベクトル、4x4までの行列)だと5〜30%くらいの向上なんで、実装する労力考えると最後のダメ押しでもよかったなとは思うけど

>・計算途中の値もよく使うので=が出てきて評価が頻繁
一応、a = b + c;程度の式でも効果あるにはある
多分インライン展開されても、レジスタの使用効率がちょっと良くなるんだと思う
a = b + c;
みたいな式で
for (int i = 0; i < 3; i++)
  a.f[i] = b.f[i] + c.f[i];
という計算に展開された方が、レジスタを使い切らないからじゃないかなと
(ちなみにループはアンロールされる前提だけど、ヒープに確保するような長いベクトルでもETの方が効率良いはず
あとこの例だと、SSEとかのSIMDのイントリンシック使うと4次元まで組み込み型になるので、全くETの意味が無くなるw)

複数の組み込み型を含む演算で、SIMDとか他の高速化を使った上でさらに速くしたいなら、ETはおすすめしたい
ただし計算過程でxがy, zに干渉するような計算(内積、外積とか)にはET使えないので注意
762 :
2017/03/20(月) 14:14:14.02 ID:OlwkB3mR0
訂正
Xxがy, zに干渉するような計算
○各要素を複数回評価するような計算
a = cross(b, c);
なら大丈夫だけど
a = cross(b, c) * d;
とかやると乗算の回数が増えるし計算結果が狂ったりする
763 :
2017/03/20(月) 14:25:46.95 ID:o1Hy6TV3M
>>762
横から補足
ublasなんかは複数回評価を前提としてて、そのまま使うと遅い
なので、noaliasというものが用意されてる
764 :
2017/03/20(月) 16:40:52.42 ID:d0t0+ba+0
なるほど
よくわからん
765 :
2017/03/20(月) 17:28:44.64 ID:lZKrgjvb0
結論
expression templateは科学系数値計算にしか効果はない
そういうのは既にライブラリーが存在する
よって自分でexpression templateを実装する必要に駆られる場面はほぼない
766 :
2017/03/20(月) 18:08:39.79 ID:OlwkB3mR0
>>765
>科学系数値計算にしか効果はない
ではなくて、「速度が必要な場面でも、実装する優先度は低い」ならわかる

自分が以前調べた限りでは、ETとSIMDを同時に使ってるものは無かった
はっきり言って、速度が重要な局面かつSIMDが使えるマシンなのにまずSIMDを使わないというのは有り得ない
けなすわけではないが、SIMD命令がある一般的なマシンにおける数値計算には、今あるETのライブラリはまともに使えんのじゃないか
ていうか科学計算ならETより、SIMDやGPGPUを使う方が先

自分の場合はゲームでの計算なんで、CPUかつヒープじゃなくスタックを使う必要があるので
その時点でuBlasやBlitzは選択肢から外れるんだわ
767 :
2017/03/20(月) 18:31:45.48 ID:E6+3UOyx0
あらゆる面で最適化したオープンソースな数値計算ライブラリを作るような人なんて世界でもほぼ居ないだろ
数学と物理や化学とC++での数値計算に関する造詣が深くて、処理系やユースケースを想定して形にできなければいけない
金にならないし趣味にするには地味すぎる
論文が書ければいいけどライブラリ開発自体をメインにすることはできるのかどうかよくわからんし
768 :
2017/03/20(月) 19:35:01.25 ID:OlwkB3mR0
そういうライブラリはかなり難しいだろうね・・・
だから結局自分で作る必要があるんだわ(ETは労力やバグ回避がアレだけど、効果が無いわけではない)
769 :
2017/03/20(月) 19:39:51.74 ID:d0t0+ba+0
お前らの作成したライブラリを配布したらさいつよじゃね?
770 :
デフォルトの名無しさん (ワッチョイ 537b-gO1F)
2017/03/20(月) 19:44:06.12 ID:+YHRRlIg0
Eigenがexpression templateもSIMDも実装してたと思うけど
771 :
2017/03/20(月) 19:47:48.92 ID:d0t0+ba+0
お前らってコード書くとき明示的にスコープ使う??
772 :
2017/03/20(月) 20:52:21.66 ID:OlwkB3mR0
>>770
あーー、そういえばあった・・・・w
すまん大嘘こいてた

https://ja.wikipedia.org/wiki/C%2B%2B_AMP
ちなみにマイナーながらこんなんもある

>>771
stdならstd::つけて、それ以外ならusing宣言でよく使うやつだけ取り込むかなぁ
773 :
デフォルトの名無しさん (ワッチョイ ef8c-h49x)
2017/03/21(火) 00:17:02.18 ID:ooaEszBV0
Expression templateって右辺値参照ある今でも必要なの?
774 :
2017/03/21(火) 00:34:26.33 ID:WRmS2jUL0
式テンプレートって遅延評価やそれを利用した最適化が主な目的だとおもうのだけど、それがなんで右辺値参照があるからいらなくなるの?
775 :
デフォルトの名無しさん (ワッチョイ ef8c-h49x)
2017/03/21(火) 00:42:40.72 ID:ooaEszBV0
a = b + c + d の形式の時のコピー数減らすのが式テンプレートの主な功績だとしたら右辺値参照で同じように減らせると思ったんだけど、実際それ以上の最適化ってされてるの?
776 :
2017/03/21(火) 00:59:40.31 ID:/NjqKBkb0
アセンブラで書くのが一番速い
777 :
2017/03/21(火) 01:12:11.02 ID:3hTmI8gX0
KoDaIJiN
778 :
2017/03/21(火) 01:44:12.85 ID:2crVP7Yr0
石を焼いてしまうのが、一番早い気がする
779 :
2017/03/21(火) 02:23:03.72 ID:wE8b83TD0
>>775
ヒープに確保するようなクラスの演算なら、コピーのコストはそうだね(推測だけど
ただし>>761に書いたようなレジスタ効率(a.f[0]の代入が終わったらストアして以降f[0]を無視できる)もある
780 :
デフォルトの名無しさん (ワッチョイ 33e6-8FG5)
2017/03/21(火) 03:29:49.89 ID:+DL1LwCN0
>>778
それ速いけど早くない
781 :
2017/03/21(火) 11:41:46.69 ID:Ub2NtCH4p
>>775
たとえばeigenなんかは必要な要素だけ計算されるような工夫があるようだけど
782 :
2017/03/21(火) 12:20:28.06 ID:ovrpZx5v0
全く理解してないし、今日初めて知ったんだけど

遅延評価といっても所詮静的なものだから
こんなものはコンパイラが最適化を超がんばれ、って思う
たぶん事の本質は演算の順番を変えることで
(縦に計算するか、横に計算するか、みたいな?)
最適化がかかりやすくなったり速く動いたりできるかもね
って事なんじゃないかと俺は勝手に思った
ただ愚直に演算の順番を変えると記述性に問題が出てくるから
それを防ぐテクニックなのかなーと
よくわからないけど
783 :
2017/03/21(火) 12:35:09.71 ID:bH1u/9cj0
Expression templateの一時変数問題は
ムーブコンストラクターで解決された問題だよね。
784 :
2017/03/21(火) 12:36:27.24 ID:/NjqKBkb0
プログラムが扱いやすいように初期値を設定してやるのは人間の仕事
785 :
2017/03/21(火) 12:54:01.22 ID:ovrpZx5v0
全く理解していない俺が言うのもなんだけど
ムーブコンストラクタは関係ないと思う
演算順序を変えないことには何処かに一時的に計算結果を保存しておかないと
ダメなことには変わりないのでは?

tmp[0] = a[0] + b[0];
tmp[1] = a[1] + b[1];
r[0] = tmp[0] + c[0];
r[1] = tmp[1] + c[1];



r[0] = a[0] + b[0] + c[0];
r[1] = a[1] + b[1] + c[1];

の違いじゃないかなー

これで配列のサイズが1000とかだったらかなり差が出るんだろう
ただ、普通にforループ書けば?って気もするが
そこを演算子のオーバーロードでどうしても記述したいってのが
例の技術なのかと

俺には必要ないかなー
要素数の少ないベクトルはSIMD使うし、要素数の多い配列はループ回すし
786 :
2017/03/21(火) 13:04:15.57 ID:bH1u/9cj0
a[0] += b[0];
a[0] += b[1];
c[0] += a[0];
c[1] += a[1];
r[0]=c[0]
r[1]=c[1]
ムーブコンストラクターを使うとこうなる
787 :
2017/03/21(火) 13:13:33.00 ID:ovrpZx5v0
やだー
それ、aとcが破壊されているじゃないですかーー
r=a+b+c; と同等のコードになりませんよ?
あなたのは a+=b; c+=a; r=c;ですが
そもそも「+=」で破壊していく方針なら、何にも新しくコンストラクトしないんだから
これまたムーブコンストラクタ関係ないじゃないですかーー
どこからムーブコンストラクタが出てくるんですか?
もっとC++勉強してくださいよー
788 :
2017/03/21(火) 13:23:51.34 ID:ovrpZx5v0
r = a + b + c を計算しようと思うと、これはr = (a + b) + c に分解されるだろうから
根本的に(a + b)の結果を保存しておく一時変数がいる
レジスタに配置されるかもしれないとかそういうことはおいておいて
とりあえず一時変数がいる
で、a,b,c,rがベクトルだった場合、一時変数もベクトルになる
これはあまり美味しくない場合がある、ということで
各要素にばらして要素ごとにr = (a + b) + cを実行する
そうすると一時変数はスカラーになる
しかし記述性に難が出るので、それを何とかしようとした

↑これが基本的な要点かと
789 :
2017/03/21(火) 13:29:00.21 ID:bH1u/9cj0
間違えた
tmp[0]=a[0] + b[0];
tmp[0]=a[1] + b[1];
tep[0]+=c[0];
tep[1]+=c[1];
r[0]=temp[0]
r[1]=temp[1]
一時変数が一個で良いってことだな
aかbが右辺値なら1個だ
790 :
2017/03/21(火) 13:30:57.12 ID:bH1u/9cj0
また間違えた、aかbが右辺値なら0個だ
791 :
2017/03/21(火) 13:32:10.85 ID:wE8b83TD0
>全く理解していない俺が言うのもなんだけど
どこが全く理解していないのかと小一時間w

ただムーブ代入演算子やコンストラクタがあれば、”ヒープに要素を確保するクラス”限定で
ヒープ確保や代入命令のコストがポインタのすげ替えだけで済むのはある(>>779

でもスタックに確保するような固定長のベクトルとかだと、>>785の通り代入命令の回数が
バカにならないので結構差が出てくる
「C++の演算子オーバーロードは遅い」なんて言われることがあるけど、その理由がこれだと思う
演算子オーバーロードが遅いんではなく、計算結果を戻り値で返す関数が遅い
(これは計算結果を保証するためなのかどうしようもないんだろうけど)

なのでそれを回避するために算術代入使おう、という論もある

ただし遅いと言ってもFortranとC/C++の差のレベルなんでアレだけど・・・・
多分愚直な演算子で書いても、全てインライン展開されれば最適化でベストなコードになると思うんだけど・・・(誰か知ってる人頼む
792 :
2017/03/21(火) 13:32:18.98 ID:bH1u/9cj0
もう一個訂正tmp =temp,tem,tmp
793 :
2017/03/21(火) 13:37:29.55 ID:wE8b83TD0
>>789
右辺値についてだいぶ誤解してないか?
ムーブコンストラクタ/代入演算子は引数が右辺値である場合の実装を分けられるだけやで
794 :
2017/03/21(火) 13:41:08.81 ID:bH1u/9cj0
実際に
tmp[0]=a[0] + b[0];
tmp[0]=a[1] + b[1];
tep[0]+=c[0];
tep[1]+=c[1];
r[0]=temp[0]
r[1]=temp[1]
上のと同等の演算が
r[0] = a[0] + b[0] + c[0];
r[1] = a[1] + b[1] + c[1];
で出来るというわけで実際に
3回に計算するわけじゃないよ
795 :
2017/03/21(火) 13:41:36.76 ID:wE8b83TD0
訂正
Xヒープ確保や代入命令のコストがポインタのすげ替えだけで済む
○最後の代入演算子で発生するヒープ確保や代入命令のコストがポインタのすげ替えだけで済む
a, b, cの演算結果は依然としてコストあるね
796 :
2017/03/21(火) 15:17:50.73 ID:ovrpZx5v0
そーゆーことでしょうな
むしろ内部でstd::vectorとか使ってベクトル表現している方が
要素ごとにバラして計算するメリットが出るだろうね
計算途中の一時変数がstd::vectorになるのとスカラになるのとでは
全然違うというか話にならないからね

あと
> ○最後の代入演算子で発生するヒープ確保や代入命令のコストがポインタのすげ替えだけで済む
だけど、たぶんだけどstruct vec{ int x,y,z; };みたいなやつだと
最後の代入はコンパイラの最適化で消えてなくなるだろうから気にしなくてもよいはず
C++にmoveホゲホゲが出来る以前からあった古来からの基本的な最適化だったはず
まぁoperator=を定義して余計なことしてたらその限りじゃないかもしれんが
797 :
2017/03/21(火) 16:21:56.57 ID:rDA5FTfNd
umdhの結果でleak検索して出てこなかったらメモリリークしていないって判断して問題ない??
798 :
2017/03/21(火) 18:56:32.83 ID:wE8b83TD0
>>796
RVOのことかな?そういえば完全に忘れてた・・・
確かoperator =を定義していようが副作用があろうが、コンパイラは勝手に
コンストラクタや代入演算子の呼び出しを減らしていい、って感じだったと思うんだけど
もしかして同じ機能のコンストラクタがあるならoperator =は無駄??
799 :
2017/03/21(火) 22:33:32.67 ID:QxtkUNUp0
map<T,U> map;
とか
for (auto pair : map)
というのをつい手癖でやってしまうのですが
こういう名前の付け方はやめたほうがいいですか?
800 :
2017/03/21(火) 22:47:54.58 ID:ovrpZx5v0
大前提としてチームで開発しているならチームのリーダーに質問してください

自分一人で書いてるなら変数名なんかなんでもよいよ
自分で書いたコードでも一年たったら他人が書いたコードのように読めない
っていう人もいるけど、実際には普通に読めるから変数名は思い付きのテキトーでよい
型名をもじってそのまま変数名にするってのは俺もよくやる

実際変数名は本当に何でもよくて
なぜならスコープが狭かったり、クラスのプライベートメンバだったりして
ごちゃごちゃになったりしないから
問題はクラス名と関数名で、こちらはいつも悩む
801 :
2017/03/21(火) 22:53:34.07 ID:BqDV4BtF0
やめたほうがいい
あとあと混乱するから
802 :
2017/03/21(火) 22:53:51.11 ID:chOyeLILd
あとはインタフェースの一部としての引数名かな。
総じて.cppファイルにだけ書かれる名前はテキトー
803 :
2017/03/21(火) 23:38:01.75 ID:XhVovTkQM
>>799
mapはデータ構造だろ
変数名はそれが何を格納してるかを表してなきゃダメだと思うけど
804 :
2017/03/21(火) 23:45:02.12 ID:5oluTi0x0
>>803は健常者
805 :
2017/03/21(火) 23:57:16.03 ID:QxtkUNUp0
>>800-804
ありがとうございます。くだらぬ質問でしたね、すみません
とりあえず狭いスコープの一時変数用途では
map<T,U> m;
for (auto p : m)
みたいにしておきます
806 :
2017/03/21(火) 23:59:23.77 ID:eniBTwk40
やめた方がいいですか?なんて聞いてる時点で本人の中でも既に答えは出ているのでは
807 :
2017/03/22(水) 00:10:41.47 ID:kq8u5G9J0
使い捨てならアンダーバー付けろ
808 :
2017/03/22(水) 06:47:53.98 ID:svIchgSfM
>>799
どちらもスコープが狭ければいいと思う
特に pair の方は for 文でよく使われる i みたいなもんだから俺もよくやる
map の方はたいていスコープも広いし中身を表す名前にした方が分かりやすいと思う
型名と同じ名前はどうよ?
って話なら俺個人的には問題ないでしょって思うけどそう思わない人の方が多いような気がする
809 :
2017/03/22(水) 07:01:10.32 ID:2VeNeFOl0
for(auto&o : c)て感じでやってるなぁ。
oはobjectのo。
810 :
デフォルトの名無しさん (スップ Sddf-rwfr)
2017/03/22(水) 07:36:14.20 ID:BzP+Rc7Ad
変数名に型情報をのせるなマイクロソフトじゃあるまいし
811 :
2017/03/22(水) 07:43:37.16 ID:l4RQ+gMQr
別にのせてもいいけど、型でしかその概念を捉えられない人にマトモな設計は難しい
int intTypeVar=-1;
812 :
2017/03/22(水) 08:29:35.78 ID:IQHE94uk0
変数名に型を載せないほうがカッコいいと思ってるの?
それって逆にカッコ悪いと思う。
813 :
2017/03/22(水) 08:42:36.10 ID:rgAwiSmKd
変数名に型情報いるか?って話だな
そんな情報載せようとするぐらいなら変数名や関数名に拘れ
814 :
デフォルトの名無しさん (スプッッ Sddf-rwfr)
2017/03/22(水) 08:52:48.82 ID:gPjbW80sd
メンバのm_
と同じくらい無意味というか害悪
815 :
デフォルトの名無しさん (ワッチョイ 53bf-tW1y)
2017/03/22(水) 08:59:06.14 ID:iUoKjy2X0
>>814
m_ は好きだけどな。
手で握られてる感じが。
816 :
2017/03/22(水) 09:01:02.66 ID:IQHE94uk0
違いの分かる男 (スプッッ Sddf-rwfr)
817 :
2017/03/22(水) 12:11:09.58 ID:rgAwiSmKd
フルページヒープしようとしてるがうまくつかえんぞなんだこれ
gflag設定して対象ファイル実行するだけでなんとかなるんちゃうのか
818 :
2017/03/22(水) 18:09:01.13 ID:dqBQr4XV0
メモリ管理ってどうやってしてる?
テスト設計で必要なのだが調べても情報が少なくて使い方もあやふやで困ってる
自分のコードならまだしも人のコードだから品質保証するために必要なので困ってる助けて
819 :
2017/03/22(水) 19:28:52.80 ID:6SOT+CpTM
c++の場合、設計段階できっちりメモリ管理しないと死ぬ。
テスト段階だとどうだろ?どんなツールがおすすめかね?
820 :
2017/03/22(水) 19:40:51.16 ID:dqBQr4XV0
>>819
昔からのコードだから俺にはなんとも言えないんだなぁ...
タスクマネージャー開いて無限ループさせてたら地味にメモリ増えていくからたぶんリークなりメモリ破壊なりなんかしてそうなんだ
821 :
2017/03/22(水) 19:50:51.39 ID:E1Td5RgZ0
>>820
どこでリークが発生していて、どこでfreeするべきかをツールで発見したいって事?
そりゃ無理だろ。

それが出来ないからGC言語に逃げているわけだし、
それが出来ればRAIIすらゴミになるでしょ。
822 :
デフォルトの名無しさん (ワッチョイ cf1f-9jmm)
2017/03/22(水) 19:54:38.25 ID:0C1B3gPp0
メモリ管理はPHPとかのほうがムズい。
設計時でもコード書くときでも実動時でもメモリ消費を制御するのはムズい。正常動作でも想定外が起こる。
消費量が判ったところで実働時に減らすことはムズい。
"php  メモリ 画面 真っ白 メモリ"とか定番ネタ
823 :
2017/03/22(水) 20:09:07.97 ID:dqBQr4XV0
>>821
いやそこまでは出来なくても良い
ただ品質として確保したいだけ
リークがあるかないかを判断できればおけおけ
824 :
2017/03/22(水) 20:13:28.89 ID:svIchgSfM
>>818
環境がわからんからアドバイスのしょうがないんだが
ソースがあってビルドできるならとりあえず valgrind とかで調べたら?
http://valgrind.org/
825 :
2017/03/22(水) 20:15:04.43 ID:i8R0t7KQ0
それならプログラム終了時にすべてのメモリが解放されたかチェックすればOK
826 :
2017/03/22(水) 20:15:57.49 ID:dqBQr4XV0
>>824
ふぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉぉまた英語か...

環境と言えるのはなんだろ
visualstudio2008
Windows7
テストしたいのはdll
827 :
2017/03/22(水) 20:25:44.20 ID:rzLKjPpj0
>>826
昔だったら、ぴゅりふぁい っていうツールがあったけど。
828 :
2017/03/22(水) 20:26:09.25 ID:kq8u5G9J0
まともな開発環境なら名前以外から変数のスコープと型情報くらい分かるはずだよね
829 :
2017/03/22(水) 20:26:35.66 ID:E1Td5RgZ0
>>826
> テストしたいのはdll
それって単にdllの呼び方間違えているだけじゃね?
dll呼んだ直後で片っ端からfreeしてみたら直るんじゃね?

なおVS2008にはプロファイラが付いてないが、最新VSには付いていたはず。
(俺は使ったこと無いけど)
だからとりあえず最新VSでコンパイル通るか試して、そっちでデバッグするのも手だよ。
830 :
デフォルトの名無しさん (ワッチョイ cf1f-9jmm)
2017/03/22(水) 20:31:15.79 ID:0C1B3gPp0
メモリ確保をすべて乗っ取って動作させてログ吐き出すやつでいいのでは?
831 :
2017/03/22(水) 20:35:57.13 ID:i8R0t7KQ0
お前ら意地悪だな
VisualStudioならプログラム終了時にすべてのメモリが解放されたか
チェックしてくれるDebug版お便利mallocがあるだろ
_CrtSetDbgFlag
で検索してみるとよい
あと、ヒープ破壊を心配しているようだが
Debug版mallocにはヒープ破壊検出機能もついてる
もしオーバーランしていたりしたらfree時に怒られる
832 :
デフォルトの名無しさん (ワッチョイ cf1f-9jmm)
2017/03/22(水) 20:36:51.91 ID:0C1B3gPp0
これとか

LinuxC | GC
メモリ周りの基本的操作とテクニック
Boehm GC
問題のあるプログラム

#include <stdio.h>
#include <stdlib.h>
void memory_test(void){
char *p;
p = malloc(1024);
}

int main(void){
memory_test();
return 0;
}

実行するとエラーも出ず問題なく実行できます。
これは当然で、プログラム終了時にはOSがすべての資源(メモリやファイルディスクリプタ等)はすべて回収してくれるからです。
しかしこれは問題です。
Boehm GCの基本的な使い方
ではこのプログラムでBoehm GCを使います。
Boehm GCはmalloc(3)、realloc(3)の代わりにGC_malloc(),GC_malloc_atomic(),GC_realloc()を使います。
malloc(3)、reallc(3)、free(3)をそれぞれ置き換える作業だけです。
http://linuxc.info/memory/gc/
833 :
2017/03/22(水) 20:37:32.91 ID:dqBQr4XV0
>>827
可愛らしいな聞いたことない

>>829
dllの呼び方間違えてるとは?
呼び出すドライバについては片っ端からのfreeはちゃんとしてあるぜ
新しい環境については会社での統一環境だから移行できんな...
834 :
2017/03/22(水) 20:41:03.02 ID:dqBQr4XV0
>>831
ちょっと調べてみる
一応確認だけどもdll呼び出すドライバの最後にちょろっとやればええんかな

>>832
なんぞこれ
835 :
2017/03/22(水) 20:41:15.04 ID:rzLKjPpj0
dllのソースもってるのかな?
836 :
2017/03/22(水) 20:45:10.10 ID:i8R0t7KQ0
ああ、dllのソースがないとだめだよ
dllのソースがないのにメモリリークが有るか無いかしらべるのは
さすがにムリゲーだよ
837 :
2017/03/22(水) 20:45:12.77 ID:dqBQr4XV0
>>835
持ってる
むしろそのdllを今書き換えてるところかな
んでテストする段階で悩んでるところです
838 :
2017/03/22(水) 21:00:54.62 ID:E1Td5RgZ0
>>837
とりあえず仮定を確認しよう。
1. dll以外の部分では今のところリークしていない
2. dllと組み合わせるとリークする
んだよな?
そして書き換えているのは本体ではなく、dllなのか?
(これは俺の想定と逆だった)

だったらお前がバグ入れただけじゃん。
839 :
2017/03/22(水) 21:06:53.51 ID:dqBQr4XV0
>>838
1 2 両方とも正しい
んでもって俺が加えたのは型を修正しただけだからたぶん関係ない
と言うか関係ない
おそらく以前からある現象で以前のdllを利用しても同じ感じになる
2については組み合わせるとと言うよりテストのための実行ファイルを適当に作っただけかな

今回触れてない部分が大半なんだけどバージョンアップするから
メモリ破壊なりも調べる観点が必用で
umdhやらcrtデバッグやらページヒープやら調べてるんだけど...ってところ
840 :
デフォルトの名無しさん (ワッチョイ cf1f-9jmm)
2017/03/22(水) 21:34:34.94 ID:0C1B3gPp0
Boehm GCはオールCのはずでwindowsでもその他でも動作するし昔から定番だったはず。
だれもこれだしてないが・・
841 :
デフォルトの名無しさん (ワッチョイ 5375-gO1F)
2017/03/22(水) 21:38:38.83 ID:sj71GTBZ0
Linux上でWine+valgrindやろ
やったこと無いけど。
842 :
2017/03/22(水) 22:27:39.33 ID:E1Td5RgZ0
>>839
それは業務でやってるんだろ?
だったらまず、「以前の本体と以前のdllの組み合わせで、今のテスト」を行って、
リークしているようなら上司にどうするか聞いた方がいい。
このリークを直せというのは確実に手こずる。
そして逆に言えば、今それで出荷出来ているんならそれでも使い物になるんだよ。
だからリークがある状態で新機能付けて出荷も出来るはず。

ちなみに64bitアプリか?だったらリークはとりあえず無視する手もあるぞ。
843 :
2017/03/22(水) 23:03:40.64 ID:rzLKjPpj0
期末のこの時期に、メモリリーク。。こわい。。
UMDH調べてるなら、方向はいいとおもうけど。
上に、あげといた方がいいだろな。
時間食うかもしれん。
メモリ壊してると、動作不定になるからな。
844 :
2017/03/23(木) 00:17:11.61 ID:oAoB0YCS0
ttps://vld.codeplex.com
なんかで調べてたときはこれ使ってたな。
めちゃくちゃ遅くなるけど。
845 :
2017/03/23(木) 03:06:19.64 ID:52JJY4k+M
>>839
バグ修正は「おそらく」「たぶん」とかいう自信のない根拠を持たずに
チマチマ地道に調べて積み重ねると早く解決するよ
846 :
デフォルトの名無しさん (ワッチョイ 9375-iMo4)
2017/03/23(木) 03:37:19.31 ID:mYb1ScGd0
Linuxでも動かせるならvalgrindが最も簡単かつ実効速度以外最強なんだけどね。
Windowsのメモリエラー検出ツールはコレっていうのがない。
847 :
2017/03/23(木) 06:43:06.01 ID:HovpjxiMM
valgrind なんてオープンソースだから誰かが Windows にポーティングしてるかと思ったら
Windows is not under consideration because porting to it would require so many changes it would almost be a separate project. (However, Valgrind + Wine can be made to work with some effort.)
ということなのね、残念
848 :
2017/03/23(木) 07:14:51.92 ID:ne+fmuh4d
>>842
後だしばかりですまんが32→64bitアプリへの移行中
64bitにしたさいにメモリ破壊なりがないかを確認するためにumdhやらを使おうってなってる
あくまでリークしてるかも?ってのは俺がタスクマネージャー見ただけでの予測である
849 :
2017/03/23(木) 07:19:49.58 ID:ne+fmuh4d
おお...途中で送ってしまった

>>845
それはわかってるんだけどどうにしろ
移行した影響があるかないかも含めて確認するために必要なこととしてツールで保証したいってのがある
んで調査中でオススメのないかな?←今ここ

ページヒープってのを見付けたんだがあからさまにメモリ破壊してるやつでも検出できないしこれ使ってる人居たら何に対応できるか教えてくれんか....
850 :
デフォルトの名無しさん (ワッチョイ fe1f-sIi0)
2017/03/23(木) 08:52:11.56 ID:UkDqG0iw0
ソースコードがあるなら汎用的なBoehm GCでいいだろうと
851 :
デフォルトの名無しさん (ワッチョイ 9375-iMo4)
2017/03/23(木) 09:19:11.19 ID:mYb1ScGd0
俺はつかったことないけど
http://dynamorio.org
とか
金出せるなら
Insure++ってやつとか


>>850
メモリリークしか検出出来ないでしょ
852 :
2017/03/23(木) 09:23:00.74 ID:63eMbsST0
>>849
ツールで保証したい
っていうなら、>>850が正しいかと。。
853 :
2017/03/23(木) 13:57:08.14 ID:FwJwtm3q0
ツールでメモリリークがないことを保証したいってだけなら
VC++のランタイム付属のやつで十分だろ
メモリ破壊が有ったかどうかも調べてくれるし
こういったものが標準でついていて
みんな空気のように標準的に使っているから
実際問題メモリリークはめったに起きないんだよ
もしあったらプログラム終了時に教えてくれるからね
だからメモリリークに対してはそんなに騒がれない
付属のやつで十分な品質を保証できるから
たまーにしか通らないパスでメモリリークが発生していた場合など
メモリリークの発見が遅れることはあるけど
まぁ通ってないパスがある時点でテストが十分でないということだし
一か月に一回ほどの頻度でメモリリークするぐらいは別に問題ないという考え方もある
・・・っていうのもあって、まぁ付属の検出ツールで大体の品質は出る

それよりはハンドルやGDIなどのOSリソースのリークが怖くて
こちらは如何なるツールを使っても検出不可能で
タスクマネージャなどで変にハンドルが増えてないかなど
地道に調べるしか方法がない
だからハンドルなどは生で使わずにクラスにラップして使うのが通常だが
題意のDLLがどういう風になっているかは俺は知らん
もしリークが発生してしまったらメモリリークより深刻な事態になる
メモリよりもOSのリソースの方が貴重で制限が厳しいから
むしろこっちのほうを気にすればよいのにと思ってしまう
メモリリーク対策などVC++付属のやつに任せてしまってさ
854 :
デフォルトの名無しさん (ワッチョイ be6b-72yv)
2017/03/23(木) 14:02:35.67 ID:xx3Et9SY0
ツールに依存しきって分岐網羅とかやらなくなってるとしたら
それはツールによって腐ったとしか言いようがない
855 :
2017/03/23(木) 14:11:13.36 ID:FwJwtm3q0
ちなみにリソースリークが発生していて
結果としてメモリ使用量がどんどん増えていくってのは有りうるよ
タスクマネージャで調べたら使用メモリが増えていってる感じだったってことだけど
それだけだと何が原因か、はたまた問題ないのか、難しいよ
メモリ使用量を見るだけじゃダメで、ハンドル使用量etcも確認しないとね
これはマナーとしてWindowsソフト開発者は絶対するよ
リソースリークなんかしてたらむちゃくちゃ恥ずかしいし迷惑だから
あと、リソースリークはメモリリーク検出ツールでは検出できないからね
それから、もしリソースリークが発生していることが分かっても
どこで発生しているか突き止めるのはメモリリーク以上に難しい、とは言っておく
856 :
2017/03/23(木) 14:26:25.40 ID:FwJwtm3q0
テストを走らせるときにVC++のメモリリーク検出機能をONにしておくと
テスト終了時にメモリリークが発生したかどうか知らせてくれるというだけで
メモリリーク検出ツールを使うことと
テストの網羅が不十分なこととは関連性がないよ
メモリリーク検出ツールを使ったから、何か油断して
テストの網羅が不十分になるっていう理論の展開は
一般的におこらないというか、無理がある
むしろテストを網羅しないとメモリリークを検出できないわけで
857 :
デフォルトの名無しさん (ワッチョイ 9375-iMo4)
2017/03/23(木) 14:28:17.35 ID:mYb1ScGd0
valgrindではunixシステムの主要リソースであるfile descriptorのリークも検出出来るけどな
858 :
デフォルトの名無しさん (ワッチョイ be6b-72yv)
2017/03/23(木) 14:29:11.39 ID:xx3Et9SY0
おまえさっき、こう言ってたじゃん
> たまーにしか通らないパスでメモリリークが発生していた場合など
> メモリリークの発見が遅れることはあるけど
859 :
2017/03/23(木) 14:43:08.69 ID:FwJwtm3q0
それはテストが不十分ゆえに発生した問題であって
メモリリーク検出ツールを使った事とは全く関係がない

>まぁ通ってないパスがある時点でテストが十分でないということだし

と書いておいただろ
860 :
2017/03/23(木) 15:03:37.80 ID:ixe949V5d
無いことを保証するってのは、こわい文言だね。
dll内で、メモリ確保、解放してるところを、共通の関数に置き換えて、その上で、gcにおきかえかなぁ。
861 :
デフォルトの名無しさん (ワッチョイ be6b-72yv)
2017/03/23(木) 15:45:13.38 ID:xx3Et9SY0
>>859
関係大ありだよ
通ってないパスのバグが検出できないツールを使っているのに
たまーにしか通らないパスをテストしないのは
ツールを過信してる証拠だろうが
862 :
2017/03/23(木) 16:33:59.49 ID:FwJwtm3q0
いや、意味不明なんだが
通ってないパスのメモリリークが検出できないのは当たり前で
そんな変な勘違いする人はいないし
テストの網羅度が下がる理由はもっと別要因の別問題の別観点であり
メモリリーク検出ツールを過信したからとか意味不明
「俺はメモリリーク検出ツールを使っているからテストの網羅度が低くてもOKだぜ」
ってシナリオがもうありえないっつーか、前提がおかしいだろ
メモリリークしかテストしないかのような前提はおかしい
メモリリークさえなければ出力が間違っててもOK、とはならないだろ
となれば当然テストするだろ、リーク検出ツールの有無に関係なく
むしろ、リークの有る無しより、出力のほうが大事だろ、そっち優先
そのためのテストであり、パスの網羅度が高ければ結果的にリーク検出度も高いというだけ
どのぐらい完璧なテストをするか、すべてのパスを網羅できるか、は
メモリリーク検出ツールを使うかどうかとは関係ない、また別の現実問題
863 :
2017/03/23(木) 16:44:15.11 ID:ixe949V5d
お、おまいら、そうおこるなよ。
>849
から、つづきもないし、上手く行っていることを祈ろう。
864 :
デフォルトの名無しさん (ワッチョイ be6b-72yv)
2017/03/23(木) 17:00:53.12 ID:xx3Et9SY0
> 通ってないパスのメモリリークが検出できないのは当たり前で

だったらツールでは防げないバグの話にツールを持ち出すこと自体が大間違いだな
865 :
2017/03/23(木) 17:33:17.98 ID:FwJwtm3q0
ツールで防げないバグってのは
一度も通ったことのないパスのメモリリークの事を指しているんだろうけど
それをどうにかしてほしいって話は無かったはずだが、どっから出てきたんだ?
そんな話してたか?
リーク検出ツールを使ってもテストの網羅度が完璧じゃなくて漏れてしまうこともある「が」
それでも一定の効果はあるので有用である
という話はしたが
テストのパスの網羅度が不十分で漏れてしまうメモリリークバグを
ツールでどうにかする、とは俺は言ってないんだが、初めからな
866 :
2017/03/23(木) 17:35:51.53 ID:argEiYvxp
>>853読んでそんなトンチンカンな理解をする方が大間違いだろう
メモリリークが大して騒がれない、ってことに対するオマケの補足情報にどんだけ突っかかるんだ
867 :
デフォルトの名無しさん (ワッチョイ be6b-72yv)
2017/03/23(木) 18:00:16.89 ID:xx3Et9SY0
おまえ853で開口一番こう言ったぞ
> ツールでメモリリークがないことを保証したいってだけなら
> VC++のランタイム付属のやつで十分だろ
どっから出てきたって、おまえの口からだよ
868 :
デフォルトの名無しさん (スッップ Sd4a-ejJz)
2017/03/23(木) 18:26:51.25 ID:pJ6fwoOxd
また言った言わないの揚げ足取り合戦かよくだらねえ
869 :
デフォルトの名無しさん (ワッチョイ be6b-72yv)
2017/03/23(木) 18:34:26.25 ID:xx3Et9SY0
話の本題を無視して言葉尻にだけ突っかかる誰かさんのようなのを揚げ足取りというんだよ
870 :
2017/03/23(木) 18:54:08.36 ID:ne+fmuh4d
>>863
ありがとう
とりあえずでboehmでメモリリーク監視することになった
思いきりリークしてるみたいだからどうしようかと悩むが...

別件なのだけどvc6環境のC++とvc9環境のC++で差分の出る演算ってあるかな?
for文のスコープの範囲が変わるぐらいしかわからんくて
大きな演算の違いはないのだろうけどもそれぞれの環境でのモジュールで
本当に微々たる差が出ているみたいで...
基本的には結果に差分がなく、特定のパラメータファイルの時だけ差分が出てしまう。その差も30mb中の0.1%も満たないぐらい
やってることとしてはvc6→vc9環境へプロジェクトファイルの移行
871 :
2017/03/23(木) 19:11:57.84 ID:ne+fmuh4d
パラメータファイルって書くと設定値みたいに見えるね
特徴抽出したやつに演算かけてます
872 :
2017/03/23(木) 19:20:15.49 ID:Ei+8urX30
>>848
32→64bit移行の安全性を実行時ツールで検出、というのはかなり無理じゃないか?
だからみんなソースコードをチェックしているわけだし。
http://sgry.jp/pgarticles/64.html
http://yukinarit.blog11.fc2.com/blog-entry-27.html
http://qiita.com/izmktr/items/59085ca70a6c11b0b352

>>870
> 思いきりリークしてるみたいだからどうしようかと悩むが...
32→64bit移行ではリーク自体は発生しないぞ。
それは結果的に症状がリークなだけで、根本的に駄目なところがあるんだよ。
まずは32bitの旧バイナリと新テストパターンで足場を固めないと駄目だと思うぞ。

数値演算結果の誤差ならSSEとx87の精度の違いかもしれん。
ただしVC9(VS2008)は演算にはSSEを出せなかったはずだから関係ないとは思うが。
873 :
2017/03/23(木) 19:36:37.57 ID:ne+fmuh4d
>>872
長々とサンクス
思いきりリークしてるから..ってのは元々からリークしていただろうから
対処をどうしようか悩むなぁって意味でした

SSEとx87についてちょっと調べてくる
874 :
2017/03/23(木) 19:50:33.67 ID:CpsZOT5F0
浮動小数点の丸めモードが違うとかあるか?
875 :
2017/03/23(木) 20:04:25.70 ID:8W2HqVqhM
>>870
vc6って標準準拠してたっけ?
c++のような何かだったような気がするけど。
876 :
2017/03/23(木) 20:26:53.12 ID:qM4EW3hi0
>>870
ベームGCか,なかなか息がながいライブラリだね
877 :
2017/03/23(木) 20:32:55.87 ID:CpsZOT5F0
>>875
当時は標準規格というもの自体が無かった
878 :
2017/03/23(木) 20:37:31.58 ID:Ei+8urX30
>>873
あと、FMACの最適化がどこかであったはず。
(ただしググッても出てこないので、俺がGPUの話と混同して勘違いしているだけかも)
内容は、FMACの中間結果を精度が高い状態で保持しておき、FADDに突っ込むというもの。
これに該当した場合は、結果がハードウェア依存になる。
(旧ハードと新ハードでFMACの結果が微妙に異なる)
だから同一ハードでの新旧バイナリでの結果をdiffしているのなら、これは該当しない。
環境移行が面倒等で、旧マシンで結果だけ作って新マシンと比べている場合、当たるかもしれない。
ただし再度言うが、GPUの話だったかもしれんのでよろしく。
879 :
2017/03/23(木) 20:40:17.12 ID:HovpjxiMM
>>870
> 別件なのだけどvc6環境のC++とvc9環境のC++で差分の出る演算ってあるかな?
正しいプログラムだとそんなに変更はないと思うけど、例えば引数の評価順に依存しているプログラムの動きが変わるって言うのはC言語あるあるだから
要するにバグの顕在化って奴ね
なのでコンパイラ替えたら一通りテストした方がいい
880 :
2017/03/23(木) 21:06:58.74 ID:63eMbsST0
幸いなことに、再現性のあるバグだ。
メモリ関連にしては、ましな方。
画像データなんだよな?
当時だと、特徴抽出前にグレースケールにしてたもんだが。。
そのデータだけ、サイズが縦横違うとかないかな。
どっかで、メモリの取り方(x方向、y方向のピクセル値)間違えてるとか。
あるいは、メモリを取り直してたりしてないかな。
reallocとか。

実務的なとこでは、仕事の落とし所も考えといた方がいいかも。今回は、調査だけなのか、移植までなのか。。
881 :
2017/03/23(木) 21:15:40.12 ID:FwJwtm3q0
>>867
もうあんまり話したくないけど、最後に言っておくと
実用上問題ないレベルで保証できればそれでよいだろってこと
100%バグがないことを保証するのはどうやっても何やってもどんなツール使っても
無理なのは当たり前の常識だろ
VC++付属の検出ツールでも実用上問題ないレベルでのメモリリークの検査はできるし
コードに2,3行追加するだけで、壮大にメモリリークしているかどうかぐらいは
直ぐにでもチェックできるから、とりあえず試してみろって話をしたんだよ
というか、普通はONにした状態で開発しているものなんだよ
あえてOFFにしとく理由は何もないからな、邪魔になるわけでもなし
質問者が何であえてOFFにした状態で開発していたのかは定かではないが
知らなかったってことなら今日からONにしとけばよいだけだろ

で、実用上云々の説明がそのあとに続く「稀に漏れることがある」って話で
>たまーにしか通らないパスでメモリリークが発生していた場合など
>メモリリークの発見が遅れることはあるけど
>まぁ通ってないパスがある時点でテストが十分でないということだし
>一か月に一回ほどの頻度でメモリリークするぐらいは別に問題ないという考え方もある
と書いたんだよ
そのどうでも良いところにかみついて揚げ足取りしたのはお前だろ
882 :
2017/03/23(木) 21:24:27.07 ID:CpsZOT5F0
>>880
計算部分だけブレークポイント使って一行ずつ実行しながら見比べてみろよ
883 :
2017/03/23(木) 21:33:57.23 ID:63eMbsST0
>>882
そだな。データが特定されてるんだもんな。
884 :
2017/03/23(木) 21:38:04.51 ID:FwJwtm3q0
boehmは詳しくないが、普通メモリリーク検出ツールは
どこで確保したメモリがリークしたのかわかるようになっている物が多いはずだぞ
その周辺を漁ればメモリリークの箇所を特定することはそう難しくないハズ
VC++付属のツールの場合は
ttp://yukinarit.blog11.fc2.com/blog-entry-38.html
↑のようにしておくとリークしたメモリを確保した箇所の
「ソース名」「行数」「ダンプ」がわかる
あとはちょっとソースコード追いかければリーク箇所を特定できるはず
885 :
2017/03/23(木) 21:47:32.04 ID:63eMbsST0
memcpyとかも、解放、抜けたりしがち。
886 :
デフォルトの名無しさん (ワッチョイ be6b-72yv)
2017/03/23(木) 22:20:42.38 ID:xx3Et9SY0
> 実用上問題ないレベルで保証できればそれでよいだろってこと

実用上問題あるかどうか、おまえ勝手に決めてるのか?
887 :
2017/03/23(木) 22:36:32.61 ID:ViT7/D1o0
すまん
めっちゃレスもらってるから全部に逐一は答えられんわ
まず答えてくれてる人ありがとう助かる

>>879
俺もそうは思うんだけどもVC6時代のテスト項目とか残っていない
さらに言えば仕様書や設計書すらなく困り果ててる

>>880
サイズ自体が異なっていたから何かしらの処理で変な取り方をしているのだろうとは考えてる
実務のことだからほぼほぼ影響を与えないのであればコストと相談してスルーってのもありだけど...そこは要相談なんだろうな

>>882
俺もそうはしたいんだがVC6環境がないから対比で比べられないんだわ
888 :
2017/03/23(木) 23:14:34.92 ID:v1/Wdv6U0
valgrind自体はともかくvalgrindという単語を見て
以前このスレに現れたキティガイを思い出した
889 :
2017/03/24(金) 00:06:32.21 ID:8SSjzg+S0
漏れも、仕様書や設計書がない、DLLからエラーが返ってくるから、
そのDLLをデバッグしてくれとか、
1月150万円で、上場企業から請け負ったこともあるけど、

こういうのは直しても、切りがない。
違うタイプのデータが来ると、またエラーになる

無理だと断っても、また見てくれって言う。
そのDLLが何をやっているのか分からないし、仕様書もないから、
新規に作り直すことは無理だから

C/C++で解析できる人なんて、まず見つからないから
890 :
2017/03/24(金) 00:16:13.17 ID:DhGI6SB10
ハッカーに1000万払おう
891 :
2017/03/24(金) 00:17:14.57 ID:RtKD05ZR0
>>889
マジカヨ?ちょっとその仕事試しに受けてみたいかも。
それってどれくらいの規模だった?
892 :
2017/03/24(金) 00:18:51.24 ID:9w5lj4S/0
>>887
めっちゃスルーされてるけど
>>844
は結構良かったよ。リーク箇所のスタックトレースまで出力される。
あとVC++標準のは誤検知する場合がある。
googleのv8でリークが誤検知されてた。
893 :
デフォルトの名無しさん (ワッチョイ 9375-iMo4)
2017/03/24(金) 01:09:06.67 ID:DlmXd06I0
>>892
VC標準の貶すと顔真っ赤にして怒り出すやつ居るから気を付けろ
894 :
デフォルトの名無しさん (ワッチョイ 9375-iMo4)
2017/03/24(金) 01:23:02.12 ID:DlmXd06I0
彼にとってはリーク箇所のスタックトレースなんか要らないし、誤検出は使い方が悪いし、リークするコードなんて書かないから高機能は必要ないらしい。
挙げ句の果てに(自分の書いたコードに対して使うとも言ってないのに)そもそもリークするコード書いてる低脳と煽ってくる。
895 :
2017/03/24(金) 01:25:52.24 ID:RtKD05ZR0
>>887
ついでにこんなんが出てきたので貼っておく。
> サイン、コサインをインテルの CPU で計算すると少しバグっているらしい
> http://tomeapp.jp/archives/1282

要するに、x87のアセンブラ命令 FSIN, FCOS 等には誤差が出る場合があって、
これを嫌うコンパイラの場合は自前で計算しているらしい。
だからコンパイラを変更した場合、sin,cosの値が微妙にずれる事があり得る。
VC6->VC9でどうなのかは知らん。
896 :
2017/03/24(金) 01:39:49.34 ID:uwgr9JVd0
FPUのPIの値がちょっと誤差持ってるって話じゃなかったっけ?
897 :
2017/03/24(金) 01:58:41.18 ID:RtKD05ZR0
俺はこれは初耳だったからよくは知らない。

> In a single Intel publication, the problem is partially acknowledged. The 1999 edition of Intel Architecture Software Developer’s Manual Volume 1: Basic Architecture (download) states:
>
> The trigonometric instructions may use a 66-bit approximation to the true value of pi to reduce the magnitude of the input argument. In this case, the final computed result can vary considerably from the true mathematically precise result.
>
> This statement, which never again appears in a public Intel document, acknowledges the argument reduction problem. However, the entirely separate problem of large errors near argument multiples of pi/2 is not addressed.
> http://notabs.org/fpuaccuracy/index.htm
主張としては、sinXのXが無駄にでかい時は仕方ないとして、
pi/2の倍数のところに誤差があるのは駄目だろ、ということらしい。
つっても仮数部が10bit多いし、doubleに丸めるなら見えなくなると思うが。

正直なところ、浮動小数点の演算結果比較はこの手の落とし穴が大量にあるから、
完全一致は諦めて、4bit位の誤差までは見逃すようにしないと現実的に無理だと思う。
898 :
2017/03/24(金) 02:13:33.84 ID:8SSjzg+S0
>>891
20年前の話

プログラマー・SEは、1人月100〜150万円だけど、
会社が取ってくる仕事だから、社員なら1/3、派遣なら7割もらえる。
ただし、派遣では生活保障がない

どこの大企業でも、プログラムの仕事は、ちょいちょいあるだろ

>>895
JavaScriptでも誤差があるよ

function calcNumberOfDigits(x) {
return Math.floor(Math.log2(x)) + 1;
}
calcNumberOfDigits(Math.pow(2, 53) - 1);

floorで切り捨てているから、52+1=53 になるはずなのに、54になる!

Math.log2(x) = Math.log(x) / Math.LN2
これは、除数・被除数ともに誤差があるから、時々おかしくなる
899 :
2017/03/24(金) 02:49:48.36 ID:RtKD05ZR0
>>898
いやその話じゃない。FSIN,FCOSの誤差の話は、
Intelは 1.0ulp 誤差だと言っているのにそうなってない、という話。
(とは言え仮数部が10bit多いのだが)

君が言っているのは数学的なものとだろ?
それは浮動小数点では誤差があるのが仕様。

> floorで切り捨てているから、52+1=53 になるはずなのに、54になる!
これは間違い。以下。
Math.floor(Math.log2(Math.pow(2,53)-1))+1 // 54で正しい。
Math.log2(Math.pow(2,53)-1) は、52よりも53に限りなく近いから、53になる。

> これは、除数・被除数ともに誤差があるから、時々おかしくなる
これも上記の通り、認識間違い。
Math.LN2はそもそも「浮動小数点的には」誤差がない。
というより計算済みの値が使われる(はず)
Math.log2(x)等の関数は一般的に割り算での実装はされないはず。
理由は以下。
・割り算は誤差が出やすい(多分テーラー展開式等が使われる)
・割り算は遅い
・そもそも固定値割り算は逆数の掛け算に変更される
(とはいえ、現実的にはこの方法は割り算よりも誤差が出たりするが)
だから、
> Math.log2(x) = Math.log(x) / Math.LN2
が成立しない時も、それは浮動小数点計算による誤差であり、仕様。
900 :
2017/03/24(金) 03:00:17.44 ID:GqbwU5RX0
>>887
ソフトウェアとして、ライフサイクル切れてるのではないか。。
仕様がないのでは、検査できないではないか。

来期別案件で、再構築も提案していいかもな。只、お客さんから見ると機能がふえるわけではないから、なかなか首を縦に降ってもらえないのだが。
901 :
2017/03/24(金) 07:12:58.02 ID:pzB5kBTUd
>>892
すまん
スルーしてるつもりはない
全レスすると全レスやつ〜って煽られたことあるから数多いときは一部にしてた...

>>895
これの可能性ある気がする
VC6時代のは別コンパイラでもコンパイルしてた〜みたいな話聞いてたから
今リリースされているのが別環境で用意ができるのであれば探してみるよありがとう

>>900
だよね
設計者や仕様書が如何に大事かがわかったよ
902 :
2017/03/25(土) 03:58:44.57 ID:D917NA3h0
設計者: 私が辞めても代わりはいるもの
903 :
デフォルトの名無しさん (ワッチョイ be8c-72yv)
2017/03/25(土) 18:13:50.51 ID:2Y4XLGXL0
プロとしての規律を大事にお仕事してるんですね
904 :
2017/03/26(日) 15:26:40.92 ID:pwPfsDuW0
>>895
こんなのあるんだ・・・誤差という言い方は語弊があるような
立派なバグじゃないですかインテルさん
というかハードウェアって直せないの?
905 :
2017/03/26(日) 15:50:44.38 ID:rQp0RVJN0
ソフトウエア資産的に修正ると多大な影響がある。
906 :
2017/03/26(日) 15:52:58.04 ID:r1GdkURH0
特定のプロセッサが生産時期で結果が変わるとか地獄しかない
907 :
2017/03/26(日) 16:15:08.70 ID:Uwt+/Suh0
>>904
多分原因は>>896からみのPI等の桁落ち(桁不足)だろうから、
修正自体は簡単で、増やせばいいだけ。

ただし、既存ソフトへの影響が大きすぎるのと、
そもそもx87の仮数部は10bit多くて、doubleに格納した場合は丸められるわけだから、
顕在化する確率はかなり低い。
この問題もx87(1980年)からなら30年以上経って発見されたわけだし。
また現在の科学技術計算ではdoubleが主流でx87は使われなくなりつつあるし。

だから、当面は無視するのが常策だよ。
908 :
デフォルトの名無しさん (ワッチョイ fe1f-sIi0)
2017/03/26(日) 18:22:41.51 ID:Ntld20FG0
>>906
浮動小数点ではよくある、気にならないとおもうが・・
浮動小数点の演算は誤差、ケタ落ちを考慮するのが普通。
909 :
デフォルトの名無しさん (ワッチョイ fe1f-sIi0)
2017/03/26(日) 18:27:34.32 ID:Ntld20FG0
誤差の問題よりソフトウェアの速いからという回答になってるが・・


なんでハードウエアサポート使わないの?

この質問に対する回答によると、「2011年の10月以降 x86-64の Linuxではこの(ソフトウェア)コードが使われており、
明らかにFSINより速い(Since October 2011, this is the code that actually runs when you call sin() on a typical x86-64 Linux system. It is apparently faster than the fsin assembly instruction.)」とのことです。

というわけで、現在かなり普及している x86_64 アーキテクチャの CPU の三角関数命令 FSIN は、速度、精度などが問題視されており(少なくとも glibc では)、別途ソフトウェア的に実現されているようです。

まとめ
■サインなどの三角関数の値はテーラー展開を使用した有名な式を昔も今も使って計算していることが多い。
■20年以上昔から浮動小数点数演算用のFPUには三角関数の値を計算する命令(ハードウェアサポート)がある。
■しかしインテルの x86_64 系アーキテクチャーのこの命令は精度及び速度に問題があるらしく、少なくとも glibc 2.22 ではFPUのサイン命令は使っておらず、ソフトウェア的に計算しているらしい。
という感じでした。
http://tomeapp.jp/archives/1282
910 :
2017/03/26(日) 19:45:11.69 ID:KxYPtDxZ0
テイラー展開/マクローリン展開(x=0) を中心から遠くに適用しようとすると誤差はでるね
周期で割って近場で代入するのが普通だが,それを嫌ったのかな?
911 :
2017/03/26(日) 21:51:40.27 ID:fl4IudC1r
浮動小数点計算で精度が足りないとか言ってる奴は
たいていは精度じゃなくてオツムが足りない
912 :
2017/03/26(日) 21:53:51.01 ID:5/5Va2U30
最近の大学では実用数学やらんのか
913 :
2017/03/26(日) 22:32:47.30 ID:r1GdkURH0
64bitで精度が足りなくなるのは原子力か宇宙か暗号くらいじゃないのか
914 :
2017/03/26(日) 22:40:07.59 ID:pnqG1H1Or
精度の問題と>>906の様にロジック自体がおかしいアホの問題を一緒にしてしまっているような
915 :
2017/03/26(日) 22:49:30.03 ID:+0YN82z50
>>913
分布を扱う業種だったら足りなくなるだろ
tail riskの話になると64bitじゃ全然足りない
916 :
デフォルトの名無しさん (ワッチョイ 6f92-kvyc)
2017/03/27(月) 03:12:54.27 ID:om6iAVJe0
浮動小数点の精度の問題と特定のsin実装の誤差の問題をごっちゃにしてるのがいるな
917 :
2017/03/27(月) 19:37:51.44 ID:DcY7c9jX0
三角関数とか測量や透視投影関連の画角計算するようなごく一部の連中しか使わないだろJK
しいて言えば機械学習する人らがまれにacos()を使うかな〜ぐらい
ニッチすぎてハードウェア演算だろうがソフトウェアーエミュだろうが大して問題になんね
918 :
2017/03/27(月) 19:47:44.82 ID:iyhdhEhz0
話の元としては、特徴抽出だったから、フーリエ変換かな。。。
919 :
2017/03/27(月) 20:48:32.18 ID:iw91puSD0
ソフトウェア開発工程に実装設計が必要なんじゃないかなって思い始めたんだけど
そんなことしてるひといるかな?
920 :
2017/03/27(月) 20:59:26.57 ID:+nINF5LH0
ニッチな数学関数は社会インフラのクリティカルな部分に使われるからひやひやする
でもそんくらいの些細な誤差なら数百億かけたお天気衛星が落ちるくらい
うみほたるがいきなし潰れたりスカイツリーがいきなり倒れたりはしない
921 :
2017/03/27(月) 21:12:17.23 ID:iyhdhEhz0
>>919
LLDのことじゃなくて?
具体的には、どんな感じ?
922 :
2017/03/27(月) 21:48:32.03 ID:cEFtoidy0
cmathのよくわからない関数は誰か使ってんのか?
923 :
デフォルトの名無しさん (ワッチョイ be8c-72yv)
2017/03/27(月) 22:03:40.41 ID:gdZSPxyQ0
C++17でspecial math functionsが追加される件のことか?
924 :
2017/03/27(月) 22:16:03.16 ID:9PqnwE37p
LLDって何の略?
925 :
2017/03/27(月) 22:17:37.19 ID:YTkDzohr0
long long decimal
926 :
2017/03/27(月) 22:52:15.25 ID:iyhdhEhz0
Lower Level Design
927 :
2017/03/28(火) 00:29:07.69 ID:wYvZd6LUd
>>921
はじめて聞く

俺の中のイメージだと
要件定義・基本設計・詳細設計の次に実装設計が合ってもいいと思うんだ
詳細設計って機能とかだからそれをどう実現するかとかの関数の中のサブ関数レベルの話
928 :
2017/03/28(火) 00:57:49.92 ID:0r7X/qmQ0
>>917
いや、普通にPC使ってたら三角関数位使うだろ
929 :
2017/03/28(火) 01:17:13.75 ID:EZ0E4K7B0
>>927
詳細設計=LLDね。
詳細設計をやると、実装の設計までいきませんか?
データの持ち方、関数のフローチャートまで書くとおもうのですが。。
単体検査で、分岐追えなくなってしまうし。。
なんか、思い違いしてますかね。
930 :
デフォルトの名無しさん (ワッチョイ 9375-iMo4)
2017/03/28(火) 01:21:00.12 ID:r9lg9pov0
>>928
GUI使ってたらグラフィックスライブラリが間違いなく使ってるよね
931 :
2017/03/28(火) 01:35:15.98 ID:7ttxV7Jp0
その辺の言葉って仕事の分野とか規模とかによってまちまちな気がして面倒臭い
結局のところブレークダウンして行ってるだけだし、文書のメンテする手間とか勘案した上でやった方が良いと判断したならやれば良いんじゃないか

あとスレチじゃね
932 :
2017/03/28(火) 06:57:20.65 ID:+hgLXPeGM
> 詳細設計=LLDね。
俺も初めて聞いた
英語で低レベルな糞設計は何て言うんだろ?
933 :
2017/03/28(火) 07:09:38.55 ID:wYvZd6LUd
>>931
スレチかすまん
ちょっと探してくる

>>929
規模によるとは思うが事細かな処理内容は記載されなくないか
分岐処理とかの内部のやつとか
934 :
デフォルトの名無しさん (ワッチョイ eb37-72yv)
2017/03/28(火) 10:52:55.66 ID:JfwQ0DgC0
crappy design
935 :
デフォルトの名無しさん (ワッチョイ 6f92-kvyc)
2017/03/28(火) 17:59:50.95 ID:lUbwlPy10
>>917
三角関数がニッチすぎるだとかwさすがですね
936 :
2017/03/28(火) 20:42:08.50 ID:Woa0lIQR6
まあ数学はなるたけ使わずにプログラムできるようにいろんなライブラリが整備されてるわけだから、三角関数不要と思ってる奴がいるのはむしろライブラリ作成者が成功している証といえる
937 :
デフォルトの名無しさん (ワッチョイ eb5e-72yv)
2017/03/28(火) 23:53:38.80 ID:mX0+s2UE0
>>936
おまえシャブでも食ってんのか? 今日は何グラム?
938 :
2017/03/29(水) 08:00:31.62 ID:vWDDuFOJr
double型は使う分野と使わない分野の差が激しい
少なくとも誰でも使う訳ではない
939 :
デフォルトの名無しさん (ワッチョイ 5739-6tpp)
2017/03/29(水) 09:05:07.67 ID:Ysl+RBZV0
シャブシャブなら
381KB

新着レスの表示

レス数が900を超えています。1000を超えると表\示できなくなるよ。
★スマホ版★■掲示板に戻る■全部前100次100最新50

名前:E-mail: