19/12/11 18:13:18.74 bM/oaPHs.net
>>771
質問されたような簡単な場合であっても、少なくとも、80386系CPUでも、
物理CPUを2つ積んでいるようなマシンだと、色々な配慮が必要。
一つの理由は、CPUキャッシュが外部メモリに反映されていない場合が
あるため。
もう一つは、値の変化のタイミングがコードに書いた通りで無い事があり、
僅かにタイミングがずれることで、「すれ違い」現象の様なことが
おきることがある。これが起きると、変数の値をフラグ的に利用して
厳密に何かをやりたい場合に非常に致命的な問題を生じてしまうことがある。
これを避けるには、80386の設計者は、XOR交換命令を使うことを想定
していたらしい。
2つのスレッドでデータをやり取りする場合には色々と注意が必要で、
普通はデータが準備できたかどうかをCreateEvent(),SetEvent(),
WaitForSingleEvent()などで待機して処理するのが基本。
792:デフォルトの名無しさん
19/12/11 18:17:08.59 bM/oaPHs.net
>>776
スマン。XOR交換命令ではなく、xchg命令だった。
793:デフォルトの名無しさん
19/12/11 18:20:46.73 NtLrnXCf.net
goよりかはrustの方が全然マシやと思うぞ
最近go案件振られること多いけどC言語触ってるみたいで好きになれんわ~
794:デフォルトの名無しさん
19/12/11 18:30:30.06 /1t9T7AP.net
>>776
xchgはsequential consistencyが必要な場合だよ
今回のように単にatomicにread/writeできればいいだけなら不要
お前さんも含めてよくわからん人は使わないのは正解
795:デフォルトの名無しさん
19/12/11 18:36:33.88 bM/oaPHs.net
>>779
正直言って、俺は、lock, xchg, mfence, prefetch,
キャッシュ制御付き(?)mov各種(大量)
に付いてはちゃんと理解出来てないことは認める。
796:デフォルトの名無しさん
19/12/11 18:38:56.23 bM/oaPHs.net
MFENCE
PREFETCH
MOVNTDQA
LFENCE(?)
XCHG
LOCK prefix
WC Memory
↑沢山あるけど、よく分からない。
xchgもちゃんと理解できてない。
797:デフォルトの名無しさん
19/12/11 18:39:59.12 bM/oaPHs.net
MFENCE, LFENCE, SFENCE。
服のサイズみたいだ。分からん。
798:デフォルトの名無しさん
19/12/11 18:46:12.74 bM/oaPHs.net
>>779
xchgは、2つ以上のCPUが1つの事柄に関する lock を同時に獲得しようとした時に
1 CPU だけが lock を獲得できて、他はすべて獲得できないようにするための
ためのようですね。今回とは余り関係ないようです。
799:デフォルトの名無しさん
19/12/11 21:50:49.53 10jfhd7e.net
>>777
XORを使った交換テクニックがあったのを思い出した
800:デフォルトの名無しさん
19/12/12 00:31:42.87 n5d2iAqE.net
>>765
その場合でも排他制御は基本的には必要。
たとえば読み込んで範囲チェックをした後に値が変わってしまったらまずいでしょ。
別メモリにコピーを取っていてから処理しているつもりでも、最適化が気を利かして削除しちゃうこともあるだろうしね。
801:デフォルトの名無しさん
19/12/12 00:36:46.28 n5d2iAqE.net
>>765
あとはアレだな、変数の構造にもよるけど、変数を読み込んでる最中に、上位ワードを読み込んだ後に値が変わって下位ワードだけ新しくなるなんてことも
可能性としては0とは言えない。
802:デフォルトの名無しさん
19/12/12 00:54:16 UvCIGzud.net
AVXを使えば256bitを1命令で
AVX512を使えば512bitを1命令で
読み書き可能
803:デフォルトの名無しさん
19/12/12 01:00:12 UvCIGzud.net
x86系だとCMPXCHG命令
ARMだとLL, AC命令
がデータの一貫性確認に使える
804:デフォルトの名無しさん
19/12/12 03:03:25 hmkgwwLY.net
とんちプログラミングはもう流行らなさそう。
805:デフォルトの名無しさん
19/12/12 03:28:17.88 J/GuvI9A.net
とんちプログラミングwww
806:デフォルトの名無しさん
19/12/12 03:55:57 g+q4RhTJ.net
> これを避けるには、80386の設計者は、XOR交換命令を使うことを想定
> していたらしい。
当たり前じゃね?アトミックな命令を使うのは基本だと思うが
807:デフォルトの名無しさん
19/12/12 07:30:46.73 UvCIGzud.net
XOR
808:デフォルトの名無しさん
19/12/12 07:43:20 Vt8W+oPZ.net
xor rax,rbx
xor rbx,rax
xor rax,rbx
これでswap rax,rbx相当ってことね
809:デフォルトの名無しさん
19/12/12 07:53:00.21 UvCIGzud.net
>>777
810:デフォルトの名無しさん
19/12/12 10:43:59.85 r0VN1UlG.net
condition_variableで待機しているスレッドがない状態でnotify_allしたときの動作ってどうなりますか?
811:デフォルトの名無しさん
19/12/12 10:56:19.34 WJA8YZFG.net
時空が逆流し、針の先から悪魔が生まれる
812:デフォルトの名無しさん
19/12/12 11:06:56.29 a67Hqgb2.net
jsに対するTypeScriptみたいな感じで
C++に対するRustっていう認識は間違ってるが
それならC++に対するそれは何が適当なんかある?
813:デフォルトの名無しさん
19/12/12 11:10:12.33 Vt8W+oPZ.net
allに該当する要素の数が0なのを特別視する必要はなさそう
814:デフォルトの名無しさん
19/12/12 11:21:14.68 NrsugUJv.net
非同期な操作やしその瞬間何も起きんなら単にスルーするだけ
815:デフォルトの名無しさん
19/12/12 12:01:38.93 Z8SHCwDj.net
>>797
無い。
816:デフォルトの名無しさん
19/12/12 12:26:43.11 gL/Y8Ccu.net
>>797
Managed C++とかC++/CLIとか
817:デフォルトの名無しさん
19/12/12 13:04:34.98 Z8SHCwDj.net
>>801
それだと余計に変になっているので、JS ---> TypeScript の関係とは違う。
818:デフォルトの名無しさん
19/12/12 13:08:42.86 b3wcvAqB.net
C++は型安全だからC++はC++
819:デフォルトの名無しさん
19/12/12 14:17:55.83 CNmkwPhj.net
型安全認定された!
820:デフォルトの名無しさん
19/12/12 14:59:18.45 ZWrMIDdu.net
ていうかTypeScriptはJSが型があまりにもザルすぎて危険だよね、Javaやら
C/C++ほど堅くないにしてもある程度の型はいるよね?っていう発想ででてきた
ものだから C++ から寄せていくならむしろ型をユルくしてくパターンだな
そんなクソ言語には興味がないので具体的に何?ときかれても知らんがな
821:デフォルトの名無しさん
19/12/12 16:27:22.69 AVYkL4QT.net
JSが危険ってどういう事?
C/C++は型がない=危険だけど
JSなんかは型安全な言語だからちゃんと例外になって、
メモリ保護エラーとか起こすこと無いけど?
822:デフォルトの名無しさん
19/12/12 16:39:21.91 hmkgwwLY.net
Treeの節(Node)は部分木を表すRangeだと考えて差し支えないですかね?
823:デフォルトの名無しさん
19/12/12 16:47:21.68 hmkgwwLY.net
C++20のレンジってもしかしてDBのカーソルとかに応用できませんかね?
824:デフォルトの名無しさん
19/12/12 18:38:14.77 Ijd1d2r8.net
毎回フルスキャンしたいならどうぞ
825:デフォルトの名無しさん
19/12/12 18:59:14.59 hmkgwwLY.net
ビューで制限できるし遅延評価を目的としたストリームを代弁できるんじゃないかなって思ったのですが。
826:デフォルトの名無しさん
19/12/12 19:07:50.30 Z8SHCwDj.net
>>806
型も宣言も無い事が危険になることが多い。
例えば、関数を定義しても仮引数に型がないので、全く間違った実引数列
を指定してしまっても処理系がエラーを出してくれない。関数を修正して
仮引数列の真ん中あたりに新しい仮引数を一つ増やしたとする。
この場合、この関数を呼び出す側もちゃんと全て修正する必要がある。
Cだと型をチェックしてくれるので修正の仕方を間違うとエラーになって
くれることが多い。ところがJSだと間違っても全くエラーを出してくれない。
また、JSの場合、ローカル変数とグローバル変数を間違って使ってしまい、
グローバル変数にいれたつもりがローカル変数になってしまっていることがある。
また、変数を1文字間違えた場合も全くエラーにならず、新しいグローバル変数
が使用されたと解釈されてしまう。
どれも、C言語だとエラーになってくれるので安全だが、JSだと危険。
827:デフォルトの名無しさん
19/12/12 19:25:03.70 AVYkL4QT.net
>>811
お前が型安全の意味を間違ってるってことはよく分かった。
メモリ保護エラーなど言語で解決されないエラー
(OSがトラップするエラー)になってしまうことを
型安全じゃないっていうんだよ
言語で例外になるならそれは型安全
828:デフォルトの名無しさん
19/12/12 19:44:50.53 Vt8W+oPZ.net
ぬるぽ
829:デフォルトの名無しさん
19/12/12 20:29:23.98 f2lx0DlC.net
ツンッ
830:デフォルトの名無しさん
19/12/12 20:46:51.94 6QhfdrtV.net
>>808
おそらくできると思う
831:デフォルトの名無しさん
19/12/12 22:31:55.78 hmkgwwLY.net
boost.property_treeはノードはコンテナだって書いてる。
アルゴリズムイントロダクションにはポインタ三つ組みのツリー表現が紹介されてるけど、これがノードがコンテナ的な感じだろか。
832:デフォルトの名無しさん
19/12/12 22:36:00.00 2qfVB5NM.net
>>812
???
>>811は型安全なんて一言も言ってないけど?
833:デフォルトの名無しさん
19/12/12 22:37:04.02 hmkgwwLY.net
仮に、ノードにSTLのリストやベクターを持たせて子ノードを格納すると、別の部分木のイテレータが互換性を持たなくなる。
これはちょっとまずい。
ある部分木の途中からある部分木の途中までを注目することはよくあるから。
834:デフォルトの名無しさん
19/12/12 22:45:48.06 hmkgwwLY.net
ノードの物理量が必ず同じであることを利用すれば、データ構造ヒープを木として使うのが良いんだろか。
これなら、メモリーの確保はSTLのベクターが使え、木全体でイテレータが互換性を持てる。
835:デフォルトの名無しさん
19/12/12 22:52:26.39 hmkgwwLY.net
考えれば考えるほど、ノードに子ノード格納用のSTLコンテナを持たせるのは現実味がなく思える。
836:デフォルトの名無しさん
19/12/12 22:59:41.49 hmkgwwLY.net
つまり、型安全はプログラムの健全性を担保するものではなく、C++は型安全とは言えないって事で良いのでは。
837:デフォルトの名無しさん
19/12/12 23:02:50.75 +RpJiFi7.net
jsてのは女子小学生の意味か?
838:デフォルトの名無しさん
19/12/12 23:04:10.87 hmkgwwLY.net
型が無いと僕たちには辛すぎるよね。
ミスを発見してくれないから。
839:デフォルトの名無しさん
19/12/12 23:36:51.22 Rc7qy7fw.net
型はまあ重要だけど型ガーばっか言ってる奴は揃ってバカだよな。
840:デフォルトの名無しさん
19/12/13 00:21:19.32 0IHjBlJG.net
型が無いとinsertがinsert_from_intとかinsert_from_stringとか別々にしないといけなくなって、色々大変そう。
呼び出し側が責任を持つということになるのかも。
841:デフォルトの名無しさん
19/12/13 00:22:24.50 0IHjBlJG.net
型演算をコンパイラに任せることが出来なくなって、すべてプログラミングしないといけなくなるのかな。
842:デフォルトの名無しさん
19/12/13 06:47:47.05 6WB0hlYg.net
>>824
むしろ(静的)型なんて俺には不要だぜ、ベイビーって奴の方がアホっぽいけどなw
>>825-826
静的型付け 動的型付け
あたりでググってこい
843:デフォルトの名無しさん
19/12/13 07:17:35.68 0IHjBlJG.net
機械語は変数に型がない。
命令で型を使い分ける。
その大変さを考えると型欲しいってなるのかも。
844:デフォルトの名無しさん
19/12/13 07:24:37.08 Ry/2QtNy.net
まさにBがCに進化するときの考え方だね
845:デフォルトの名無しさん
19/12/13 09:49:21.00 wVkcEFxk.net
>>825
ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
用意して使うと言う発想はスクリプト言語的な発想。
そのようにした場合、コンパイラが厳密にどの関数を使うかが人間には
分からない事が多いので安全性を損なう場合が多い。
スクリプト言語は RAD言語なのため、できるだけ短い関数名で対処しようと
するが、それが思わぬ間違いを含みがち。
C言語が好かれているのは、どういう処理がされるかが人間が完全予測できる
ことで、「大体の動作」は好まれない。
846:デフォルトの名無しさん
19/12/13 09:53:03.46 wVkcEFxk.net
>>826
型の違いでコードを自動変化させるという思想は、C++の中でも非常に最近に
なって STL (template) で流行りだしたもの。
もともとC言語に型が導入されたのは、プログラマのミスをコンパイラが発見して
エラーを出してくれるようにするためだった。C言語には関数の多態性(overload)
がない。なお、override と overload は別の概念なので、知らない人は検索して
欲しい。
847:デフォルトの名無しさん
19/12/13 09:53:50.44 0IHjBlJG.net
イネーブラ使えば良いのでは。
848:デフォルトの名無しさん
19/12/13 10:00:20.89 0IHjBlJG.net
コンセプトコイコイって感じなのかな。
849:デフォルトの名無しさん
19/12/13 11:27:07.79 WVlIRY9+.net
#pragma omp parallel forで
自動分割され、各スレッドに割り当てられた
ループの開始点と終了点を取得することできませんか?
850:デフォルトの名無しさん
19/12/13 18:09:24.89 e6j7CnOm.net
>C言語には関数の多態性(overload)がない
さらりと嘘をつくやつがおるな
851:デフォルトの名無しさん
19/12/13 18:27:30.70 fi1/rC5j.net
今UE4と組み込み以外でc++の仕事あります?
852:デフォルトの名無しさん
19/12/13 18:33:53.16 xTSwswyu.net
オーバーロードあるか?
ディスパッチの方法はいろいろあると思うが
853:デフォルトの名無しさん
19/12/13 18:55:58.62 ftjAwgQI.net
>>836
USのマイクロソフトに行け
854:デフォルトの名無しさん
19/12/13 19:01:03.38 ysGzQi5M.net
>>830
> ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
> 用意して使うと言う発想はスクリプト言語的な発想。
え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
「同じ関数名の関数を複数用意」できるのは静的型付け言語の特徴だよ
855:デフォルトの名無しさん
19/12/13 19:52:22.32 6WB0hlYg.net
>>839
> え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
関数は無理だがメソッドでいいならPowerShell
856:デフォルトの名無しさん
19/12/13 20:00:57.46 ysGzQi5M.net
PowrShell は型付言語ですからね。
それぐらいでしょ?
857:はちみつ餃子
19/12/13 20:54:52.57 1q9LzdDI.net
用語としてメソッドと言ってるものでよければ Common Lisp もそうじゃね?
858:デフォルトの名無しさん
19/12/13 21:07:31.92 KHLl2/ku.net
>>841
うん、1つあれば
> え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
の反例になるからね
859:デフォルトの名無しさん
19/12/13 21:09:15.79 wKYhuojH.net
>>843
そしたら、一つぐらいしか無いって俺は意見を訂正するだけなんだが、
お前も同じ関数名の関数を複数用意できるのはスクリプト言語では
PowerShellだけだって訂正するって話でいいの?
860:デフォルトの名無しさん
19/12/13 21:13:12.55 gmdEaqRD.net
それでいいんじゃないの
861:デフォルトの名無しさん
19/12/13 21:23:18.13 T1rtAOWF.net
質問です
template <typename T>
constexpr inline T value;
template <typename T>
constexpr inline T value = (T)0;
こうやって変数テンプレートの宣言と初期化を分
862:離すると VC、clang(Xcode付属)ではエラーになるんですがwandboxで試すとエラーになりません 本来どっちの動作が正しいんでしょうか?
863:デフォルトの名無しさん
19/12/13 21:37:57.11 KHLl2/ku.net
>>844
別にそれでいいよ
> え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
が無知からの発言と認めてもらえればいいだけだしw
864:デフォルトの名無しさん
19/12/13 22:26:34.23 0IHjBlJG.net
>>846
これも通ってしまった。
#include <iostream>
template <typename T>
constexpr T value = 1;
template <typename T>
constexpr T value = 2;
template <typename T>
constexpr T value = 3;
template <typename T>
constexpr T value = 4;
template <typename T>
constexpr T value = 5;
template <typename T>
constexpr T value = 6;
int main()
{
std::cout << value<int> << std::endl;
}
865:デフォルトの名無しさん
19/12/13 22:27:26.74 0IHjBlJG.net
実行結果。
Start
6
0
Finish
最後の定義が有効になってるように見える。
866:デフォルトの名無しさん
19/12/13 22:28:16.14 0IHjBlJG.net
Wandbox
C++
gcc HEAD 10.0.0 2019
867:デフォルトの名無しさん
19/12/13 22:54:36.18 T1rtAOWF.net
ありがとうございます、その結果を見るとgccがおかしいぽいですね・・・
宣言時に初期化は必須と考えて書いていこうと思います、ありがとうございました
868:デフォルトの名無しさん
19/12/13 22:57:06.09 0IHjBlJG.net
僕もちょっとわからないんだけど。
869:デフォルトの名無しさん
19/12/14 00:21:27.14 stptR0oK.net
>>836
デスクトップアプリ
870:デフォルトの名無しさん
19/12/14 07:31:10.87 SZLGcxYz.net
>>846
診断メッセージをよく見ろよ
> error C2737: 'value': 'constexpr' オブジェクトは初期化する必要があります。
そもそも分離できないんだよ
いいか、constexprは翻訳時定数だぞ
それを翻訳段階9まで未解決のままにできると思うか?
871:デフォルトの名無しさん
19/12/14 08:56:55.09 fBoJLlft.net
>>854
なんでできるようにしないの?
そっちの方がおかしくね?
872:デフォルトの名無しさん
19/12/14 09:02:00.44 SZLGcxYz.net
なんでという理由も述べたはずだが
873:デフォルトの名無しさん
19/12/14 09:53:01.66 fBoJLlft.net
>>856
だからそれを可能にするようにしてくれ
874:デフォルトの名無しさん
19/12/14 10:02:03.90 SZLGcxYz.net
ん? 俺は江添じゃねえぞ
奴なら標準会員だから言ってみるのもいいが
875:デフォルトの名無しさん
19/12/14 10:02:27.48 SZLGcxYz.net
- 標準会員
+ 標準化委員
876:デフォルトの名無しさん
19/12/14 10:08:29.00 yV/FURvf.net
江添本ダメ絶対
877:デフォルトの名無しさん
19/12/14 10:30:50.58 stptR0oK.net
江添でもできない
878:846
19/12/14 10:35:10.86 QUVSvjZy.net
>>854
>診断メッセージをよく見ろよ
見た上で言ってます(つまりgccまたはVC, clangのバグではないかということ
>いいか、constexprは翻訳時定数だぞ
それ以前にテンプレートなんですが
879:デフォルトの名無しさん
19/12/14 12:26:05.30 m0rD8Ode.net
ローマ法王は根競べで決めるらしいですよ奥さん。
880:デフォルトの名無しさん
19/12/14 12:26:49.81 gw9aL+td.net
誰でも閲覧できる規格ドラフト見ればすぐにわかることをこんな掃きだめで聞いても
881:デフォルトの名無しさん
19/12/14 12:35:13.30 SZLGcxYz.net
>>862
なんかとんがってんな
コンパイラのバグとまで言う根拠は何だ?
相場では規格票の条文だが
テンプレートなのは見ればわかるさ
だから何なのか説明をやめないでくれ
882:デフォルトの名無しさん
19/12/14 12:50:37.99 gw9aL+td.net
>相場では規格票の条文
通産省の癖の抜けない老人はご退場いただきたい
883:デフォルトの名無しさん
19/12/14 12:58:43.25 m0rD8Ode.net
これODRの緩和と関係あるんですかね?
884:デフォルトの名無しさん
19/12/14 13:34:08.27 T/HCOnVQ.net
>>772
>x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ
別に。
コアAの読み書きをコアA自身が見る分にはそうかもわからんが
コアAの読み書きを異なるコアBから見たらwrite同士やread同士でも順番が入れ替わり得る
(アウトオブオーダー実行の影響で
安全に動かすには適切にメモリバリアで順序化する必要がある
885:デフォルトの名無しさん
19/12/14 13:37:18.74 JwYnIOEa.net
>>868
read ==> read
read ==> write
は入れ替わらない
886:デフォルトの名無しさん
19/12/14 13:37:51.96 T/HCOnVQ.net
といってもロックレス何ちゃらぐらいの制御であればInterlockedCompareExchange()で済むから
スレッド間の通信なら普通メモリバリアとか直接触る必要は無いが
887:デフォルトの名無しさん
19/12/14 13:38:24.93 T/HCOnVQ.net
>>869
迷信
888:デフォルトの名無しさん
19/12/14 13:39:11.91 JwYnIOEa.net
ソースは?
889:デフォルトの名無しさん
19/12/14 13:39:40.59 T/HCOnVQ.net
リードキューやコマンドキューにコマンドが入るのはアウトオブオーダープロセスの事後であるため
そのような保証は無い
890:デフォルトの名無しさん
19/12/14 13:41:05.07 JwYnIOEa.net
それのソース
891:デフォルトの名無しさん
19/12/14 13:44:15.66 JwYnIOEa.net
URLリンク(github.com)
892:デフォルトの名無しさん
19/12/14 14:15:12.84 JwYnIOEa.net
x86系は
シングルコアのマルチスレッドアプリ
の多くがそのまま動くように出来てる
シングルコア時代が長かったから
893:デフォルトの名無しさん
19/12/14 14:55:10.15 QUVSvjZy.net
>>865
>テンプレートなのは見ればわかるさ
>だから何なのか
普通に考えて、実体化がまだなのに定義(初期化)を強制される妥当な理由はない、ということ
894:デフォルトの名無しさん
19/12/14 14:57:30.67 T/HCOnVQ.net
確かにリンク先のインテルのマニュアルの
>8.2.3.2 Neither Loads Nor Stores Are Reordered with Like Operations
>Example 8-2. Stores Are Not Reordered with Older Loads
に
>Initially x = y = 0r1 = 1 and r2 = 1 is not allowed
と書いてあって>>875と同じことが書いてあるが疑わしい
マニュアルが間違っているのではないか、
ちな
>8byteのデータはアドレスが8の倍数のときにアライメントされている。
から安全に読み書きできるというのはi486みたいな古いプロセッサーだとかえって危険らしい
>8.1.1 Guaranteed Atomic Operations
を見たらワカル、
895:デフォルトの名無しさん
19/12/14 15:04:35.33 T/HCOnVQ.net
つか上のインテルのマニュアルには「投機的実行時中のメモリアクセスではメモリアクセス例外は発生しない」
旨が2箇所ぐらいに書かれているが、
ということはつまりアセンブリコード上A→BまたはA→Cというメモリアクセスが条件によってどちら片方だけ実行されることを意図したコードであっても
A→B→Cというメモリアクセス順に成り得ることを意味し、他コアからもそう見えてしまうはずだが、
これをメモリアクセス順がreorderされていないうちに入れてしまうのはどうなのか、、、
マニュアル執筆者の国語の再教育が必要なのではないか
896:デフォルトの名無しさん
19/12/14 15:10:49.52 SZLGcxYz.net
>>877
おまえさん、もしかして
テンプレートの宣言と定義と
オブジェクトの宣言と定義を
ごっちゃにしてないか?
int test;
int test = 5;
これは宣言と定義じゃなく定義の重複だぞ
897:デフォルトの名無しさん
19/12/14 15:13:40.23 PwUHvw+y.net
お前なぁ
x86のこと大して詳しくないのにしゃしゃり出てくるからそういう情けないこと言うはめになるんだよ
x86でstd::atomicのmemory_orderを変えてバリア付きがどういうインストラクションになるか見てみな
storeのseq_cst以外は素のmovだから(コンパイラ依存だから絶対ではない)
898:デフォルトの名無しさん
19/12/14 15:20:09.00 T/HCOnVQ.net
そりゃー間違ったマニュアルにしたがって実装したら間違った実装になり得る(キリ
ていうかアウトオブオーダー実行の影響がマルチコアCPUにおいても透過的だと認めやっても良いが、
>>879の投機的実行の件はどうなんじゃ?
あるコアが投機的実行中に他のコアをストップさせるのでは何のための投機的実行かわからん…
899:デフォルトの名無しさん
19/12/14 15:21:14.95 k5kIl1RN.net
>>877
× 普通に考えて
〇 俺の頭の中で
× 妥当な理由はない
〇 妥当な理由は思い当たらない
テンプレートなら初期化は不要という主張なら、
constexpr 変数の宣言と定義を
900:分離できないことは納得してるのかな? そうだとして、それをテンプレートの時だけ可能とすることに意義があると思うの? 特別ルールを設ければコンパイラ実装やプログラムの読み取りにコストがかかるから、 明確が意義がなければ特別ルールは無いのが妥当だと思うよ。
901:デフォルトの名無しさん
19/12/14 15:24:42.79 QUVSvjZy.net
>>880, >>883
マウント取るのが最優先でまともな回答できない(するつもりも無い)んなら黙っててくれ
>これは宣言と定義じゃなく定義の重複だぞ
externつけたら?
>それをテンプレートの時だけ可能とすることに意義があると思うの?
テンプレート実引数に使われる型が不完全型であっても、実体化まで評価を遅らせられる
さて、
>× 普通に考えて
>〇 俺の頭の中で
>× 妥当な理由はない
>〇 妥当な理由は思い当たらない
こんなゴミみたいな煽り入れてきたからには逃げるなよ
902:デフォルトの名無しさん
19/12/14 15:32:39.86 SZLGcxYz.net
>>884
おまえさんの元の質問はこうだったな
template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;
どこにexternなんて書いてある?
マウントがどうたら気にするあまり後出しなんかしてるのはそっちだぞ
こっちはそんなこと微塵も考えちゃいねえよ失敬な
最初の口調に戻れよ
903:デフォルトの名無しさん
19/12/14 15:36:57.55 QUVSvjZy.net
間違えた
Xテンプレート実引数に使われる型が不完全型であっても、実体化まで評価を遅らせられる
○初期化に使われる定数式の評価を遅らせられる
言い換えれば、宣言と定義を分離できないならconstな変数テンプレートの宣言時には
それに使う定数式内のすべての型が完全型であることを強制されてしまう
=std::is_integral_v = std::is_integral<T>::valueでいえば
is_integral構造体の方が取り回しがいい、ということ
なんのために変数テンプレートが導入されたのか・・・・
904:デフォルトの名無しさん
19/12/14 15:37:56.58 QUVSvjZy.net
>>885
自分が失敬だからこうなってるとは考えられないんだな
何様だよ、そもそも質問に答えてないだろうが
905:デフォルトの名無しさん
19/12/14 15:43:43.09 SZLGcxYz.net
>>887
template <typename T> constexpr inline T value;
template <typename T> constexpr inline T value = (T)0;
を例示しての質問に対して
int test;
int test = 5;
という答えをしているぞ
valueがtestになったのは悪かったが
余計な飾りをとって問題の核心を指摘したんだよ
906:デフォルトの名無しさん
19/12/14 15:48:43.77 SZLGcxYz.net
家事があるんでしばらく離席する
907:デフォルトの名無しさん
19/12/14 15:58:10.05 QUVSvjZy.net
規格でそうなってる(テンプレートゆえの特例は無い)のが”わかってるなら”
最初からそう言ってくれれば済むんじゃないの?
>>854を読み直せよ、テンプレートのことが完全にすっぽぬけた上に失礼な回答だろ
>コンパイラのバグとまで言う根拠は何だ?
とまで、って・・・・普通にありえるだろ、動作が違うんだから(未定義とかいう屁理屈は無しで)
で、>>883は逃げたの?
908:デフォルトの名無しさん
19/12/14 16:55:24.17 k5kIl1RN.net
>>886
やっぱり constexpr 変数の宣言と定義を分離して何がしたいのか、
何ができるようになるのか、が見えてこない。ごめんね。
宣言だけ見える constexpr 変数への参照やポインタだけはとれるようになるけど、
それだともう constexpr である必要なくて const 変数でよさそうで、それならふつうに
宣言と定義は分けられるし。
ちなみにテンプレート実体化までテンプレート引数依存箇所の評価はされないから、
宣言と定義を分ける話を「評価を遅らせられる」と言い表しているのも何か間違ってそう。
「記述を遅らせられる」の間違い?
909:デフォルトの名無しさん
19/12/14 17:16:54.80 SZLGcxYz.net
だめだこいつ
絶望的に人に者を尋ねる態度がわかってない
「言ってくれれば済む」とか図々しすぎ
技術的な議論がしたいがこいつ相手では
不必要にイラついちまって無理だわ
俺そんなに人間できてない
910:デフォルトの名無しさん
19/12/14 17:24:00.92 QUVSvjZy.net
>>891
すまん、
>テンプレート実体化までテンプレート引数依存箇所の評価はされない
これ検証してみたらたしかにそうだった
手元のコードで完全型を要求されたから、初期化時に不完全型を使えないと思い込んでた
(おそらくconstexprな変数テンプレートの実体化が、必要な型の実体化より先に来てたっぽい
多分構造体か何かでワンクッション置けば解決できると思う)
これなら確かに分けられなくて問題無いね
>>892
>いいか、constexprは翻訳時定数だぞ
>それを翻訳段階9まで未解決のままにできると思うか?
>なんかとんがってんな
>後出しなんかしてるのはそっちだ
>余計な飾りをとって問題の核心を指摘したんだよ
さらには
>最初の口調に戻れよ
の上で
>技術的な議論がしたいがこいつ相手では
>不必要にイラついちまって無理だわ
よくそんなセリフが言えたもんだ
自己評価高すぎじゃない?wwww
911:デフォルトの名無しさん
19/12/14 17:52:18.36 SZLGcxYz.net
意見が合うとか合わないとか以前の問題
根底的なメンタリティに欠陥がある相手とは話にならない
912:デフォルトの名無しさん
19/12/14 17:58:45.99 k5kIl1RN.net
FYI
>>846
Bug 68012: g++ incorrectly accepts forward declaration of constexpr variable template
URLリンク(gcc.gnu.org)
>>848
One definition rule
URLリンク(timsong-cpp.github.io)
> No translation unit shall contain more than one definition of any variable, function, class type, enumeration type, or template.
913:デフォルトの名無しさん
19/12/14 18:08:23.02 QUVSvjZy.net
>>895
わざわざありがとう、やっぱgccのバグだったのね
914:デフォルトの名無しさん
19/12/14 19:50:50.54 UskLmxJI.net
GCCに踊らされてスレを浪費した
915:デフォルトの名無しさん
19/12/14 20:04:04.94 4qfYuBec.net
>>837
オーバーロード=多態性じゃないんで…
オーバーライドのことなら当然cで実現できる
916:デフォルトの名無しさん
19/12/14 21:11:37.22 zf7JKoX1.net
>>898
どうやって?
いや、ディスパッチの方法はいろいろあると思うが
917:デフォルトの名無しさん
19/12/14 21:15:53.72 SZLGcxYz.net
禿もそんなことを言いながら
virtualの導入には当初反対から出発したんだよな
918:デフォルトの名無しさん
19/12/14 21:26:53.87 00Pm6Tju.net
>>899
その話題QZ相手にやったばかりなんで自分で調べて
919:デフォルトの名無しさん
19/12/15 09:10:03.56 LATD77rz.net
君が忘れた腕時計見つめながら。
920:デフォルトの名無しさん
19/12/15 10:29:35 ir8W/KPm.net
>>898
overload は、同じ関数名で仮引数の型が違う関数を作れるという多態性のことですよ。
921:デフォルトの名無しさん
19/12/15 10:52:20.53 LATD77rz.net
ツリーのイテレータがあるとして、イテレータが返すのはノードじゃなくて、ノードの持つ値ですよね?
すると、イテレータは立体機動出来ないといけなくなるけど、begin().begin()とか変ですよね?
begin().parent()とか。
922:デフォルトの名無しさん
19/12/15 10:59:28.89 LATD77rz.net
イテレータが返すじゃなくて、イテレータの逆参照が返すかな。
923:デフォルトの名無しさん
19/12/15 11:08:51.65 fGq+HT2S.net
コレクションとしては子孫ノード全部を列挙できればよくて、ツリー構造に沿った操作が行いたいなら
それに加えて直接の子ノードのみを列挙するイテレータが用意できればいいだろう。
924:デフォルトの名無しさん
19/12/15 11:17:54.16 LATD77rz.net
何が子ノードのみを列挙するイテレータを返すかがよくわからない。
ノードの値がイテレータを返すことはできないので、ノードが子ノードを指すイテレータを返すとすると、イテレータの逆参照はノードを返すことになる。
これは意味論的にちょっと違うかなって。
コレクションにおいて位置はイテレータで示されるので、立体的な位置を持つツリーでは、イテレータ自身が立体機動出来て、巡回能力を持つイテレータは、reverse_iteratorのように外部に用意されれば良いのかなと思ったんだけど。
たとえば、レベルオーダーや深さ優先の巡回イテレータがあるとすると、普通に考えるとスタックやキューが内部に必要にある。
というわけでコピーのコストがあるので、これを標準には出来ないんじゃないかなって。
925:デフォルトの名無しさん
19/12/15 11:22:50.93 LATD77rz.net
子ノードを指すイテレータの逆参照が子ノードを返すとすると、*node.begin()は子ノードを返す。
**node.begin()は最初の子ノードの
926:値を返すことになるんだけども。 イテレータの逆参照がノードを返す場合、初期化子リストが素直に実装出来てイイんだけども、イテレータの逆参照が値を返さないのが腑に落ちない感じ。
927:デフォルトの名無しさん
19/12/15 11:23:28.40 Q+saMC6e.net
>>903
こらこらoverloadは多態じゃない多重定義だ
多態はpolymorphism間違えるな
928:デフォルトの名無しさん
19/12/15 11:27:25.99 LATD77rz.net
イテレータは演算子の実装を求められてるわけではなく、その演算子を呼び出した時の効果を求められてるだけなので、++(int)はスタックをコピーしない方法を考えた。
929:デフォルトの名無しさん
19/12/15 11:30:57.88 fGq+HT2S.net
そこは値じゃなくてノードを返すイテレータでいいんじゃね?
必要ならイテレータ自体を拡張してもいいだろうけど、この場合はあまり応用できそうもないし。
930:デフォルトの名無しさん
19/12/15 11:31:53.05 LATD77rz.net
そうなのかな?
931:デフォルトの名無しさん
19/12/15 11:37:55 PfQY9kAx.net
まずイテレータで何を抽象化したいかを明確にしなよ
ノードを意識させたいのか?
932:デフォルトの名無しさん
19/12/15 11:38:38 LATD77rz.net
STL風ツリーって検索しても絶対出てこないし、CIAが絡んでるような気がしてきた。
933:デフォルトの名無しさん
19/12/15 11:39:36 LATD77rz.net
そこがわかんないんだよねえ。
禿4とか読んでると、イテレータは位置を意味してるように思うんだけど。
934:デフォルトの名無しさん
19/12/15 11:45:00 mSzJWPy5.net
ツリー構造
範囲が広すぎて
汎用化すると使い勝手が悪くなるからしない
ってだけかと
935:デフォルトの名無しさん
19/12/15 11:56:45.76 Q+saMC6e.net
recursive_directory_iteratorとかね
936:デフォルトの名無しさん
19/12/15 12:06:14.82 mSzJWPy5.net
なんでdirectory?
treeでいいじゃん
937:デフォルトの名無しさん
19/12/15 12:22:05.91 Q+saMC6e.net
いや立体がどうたら言ってるから
じゃあrecursive_directory_iteratorを使うユーザーのコードは
いちいち多重ループだの再帰だのといった処理になるのかって
思ってさ
938:デフォルトの名無しさん
19/12/15 12:24:23.41 LATD77rz.net
ツリーは、あるノードの親が知りたいときもあるはず。
939:デフォルトの名無しさん
19/12/15 13:07:24.45 TeOOTcIs.net
ごちゃごちゃ考える前にイテレータの本分を決めなよ
begin()からend()まで++で走らせた時にどうなってほしいの?
話はそれからだ
940:デフォルトの名無しさん
19/12/15 13:09:44.18 MBW+LfoG.net
一般にtreeの探索順序はアルゴリズムと深く結びついてるし、
そこ凝りだすと沼だぞ。
941:デフォルトの名無しさん
19/12/15 13:09:51.26 5G1zfwod.net
関数ポインタをシリアライズしてファイルとして保存し、
ファイルからその関数ポインタを利用できる形に復元する方法ってあるのでしょうか?
942:デフォルトの名無しさん
19/12/15 13:13:54.57 nhcuVJi8.net
関数だろうが変数だろうがポインタはただの整数値でしょ
943:デフォルトの名無しさん
19/12/15 13:18:39 p2D9PeH2.net
>>923 環境や「利用」の仕方を具体的に限定すればやりようはあるかもね。
944:デフォルトの名無しさん
19/12/15 13:20:48 hicN34V0.net
次に(別のプロセスで)ファイルを読み込んだときに、
元の関数を同じ番地で参照できると限らんしな。
関数ポインタの配列のインデクスなら大丈夫だろうだけど。
945:デフォルトの名無しさん
19/12/15 13:23:00.95 LATD77rz.net
URLリンク(ja.cppreference.com)
これconstexprになってるけど、どういうときに定数になるんだろ?
end()の時かな?
946:デフォルトの名無しさん
19/12/15 13:39:23 2FA7t6Jx.net
C++20以降のvector/stringとか
使われる時にconstexprであることを妨げないようにするために付いてるんだと思う
947:デフォルトの名無しさん
19/12/15 13:47:38.10 LATD77rz.net
どうもありがとう。
948:デフォルトの名無しさん
19/12/15 13:52:49.06 ph9lwYgM.net
constexpr関数の中で使うため。
949:デフォルトの名無しさん
19/12/15 14:30:37.97 o9m7qUoD.net
デストラクタがデフォルトでvirtualじゃないのは設計不良ではあるまいか
950:デフォルトの名無しさん
19/12/15 14:34:47.01 EeC59mXx.net
あえてベースの方のメソッドを呼びたいなんてことあるのかね?
951:デフォルトの名無しさん
19/12/15 14:38:17 p2D9PeH2.net
>>931 URLリンク(isocpp.org)
952:デフォルトの名無しさん
19/12/15 15:15:03.49 K1ul1r/C.net
>>931
C++では基本的にゼロコストでできるところはそうできるようにするポリシーだからvirtualが必要なときだけvirtualを明示的に指定させる、というのをどこかで読んだ気がする
953:デフォルトの名無しさん
19/12/15 15:29:48.68 7Mmj/dyw.net
virtualでなかったら継承禁止にしても良かったんじゃないかとは思う
954:デフォルトの名無しさん
19/12/15 16:19:56.16 AolOnHel.net
そうするとメタプログラミングに色々と支障が出たはずだし
STLも結構継承使ってるから実現出来なかったかコスト増えてるよ
955:デフォルトの名無しさん
19/12/15 16:52:10.11 TkLVy9px.net
デストラクタをvirtualにする必要があるのは、baseのポインタ経由でdeleteする場合だけ
baseのポインタを使うことすらないようなもの(CRTPなど)までvirtualになるのは
どうなんだろうか
956:デフォルトの名無しさん
19/12/15 17:01:04.52 ph9lwYgM.net
unique_ptr使えばvirtualにする必要無いのでは?
957:デフォルトの名無しさん
19/12/15 17:16:05.58 p2D9PeH2.net
>>938 んなこたーない。
shared_ptr<Base>{new Derived} なら virtual デストラクタ不要になるから、間違えて覚えてるだけでは?
958:デフォルトの名無しさん
19/12/15 18:59:53.87 tmrMX5L5.net
>>937
>デストラクタをvirtualにする必要があるのは、baseのポインタ経由でdeleteする場合だけ
mjk、
959:デフォルトの名無しさん
19/12/15 19:10:50.35 AolOnHel.net
セオリーとして覚えてる人多いけど、何故なのかまで考えてない人が多い例の一つだね
要するにdeleteする基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ
末端のデストラクタを呼べれば、そこから基底のデストラクタを呼んでいくのは何が基底かわかりきってるから自動で出来る
960:デフォルトの名無しさん
19/12/15 19:29:34.24 tmrMX5L5.net
>>941
>基底のポインタからデストラクタを呼ぶ際に末端のデストラクタを呼ぶ方法(vtable)が必要というだけ
mjk、
961:
19/12/15 19:42:55.10 gCPcwtH+.net
永遠の初心者です、お願いします
1. 式で if 文を表現したいときは条件演算子(三項演算子 ?: )が使えますが、同じく式でループ構造を表す方法は C++11 以後にありますでしょうか?
2. 1 の質問の理由としては、C++ は Java とちがって uper() がなく、派生クラスのコンストラクタの基底クラス初期化部分に式しか書けません、ここにループを書くとすれば「コンストラクタ用メンバ関数(メソッド)」を置いていますがいかにも無様だと思っています…
3. ある既存のクラスに皮をかぶせて機能アップを図るとき、もとのクラスの派生クラスとして機能アップ部分を既述することは、よくある定石でしょうか、それともあまりしないことでしょうか?
---
以上3点の質問は以下のプログラムを書いていて感じました
お題は「エラトステネスのふるい」、ただし、当初、まっとうにふるいを書いた後、機能アップ項目として
篩部分に格納する数は 2n + 1 奇数に限定する、あるいは 6n + 1, 6n + 5 の形のみに限定する
等を元の篩に対して派生クラスとして記述しました
URLリンク(ideone.com)
962:デフォルトの名無しさん
19/12/15 20:01:24.23 01f7hQnX.net
>>943
ラムダ式の出番かな?
void test(bool flag) { flag ? []{ for(int i = 0; i < 10; ++i) cout << i; } : throw 1; }
963:デフォルトの名無しさん
19/12/15 20:05:17.27 5sPbacoo.net
エラストテネス
6n+1, 6n+5だけ保持とかってみんな考えるよね
ちなみに
巨大なテーブル作成時のパフォーマンスを上げるなら
キャッシュ�
964:ェ効くよう分割処理するのが非常に効果的 スレッド分割の為にいずれにしろ分割処理は作る事になる
965:デフォルトの名無しさん
19/12/15 20:07:01.24 5sPbacoo.net
エラトステネス
966:デフォルトの名無しさん
19/12/15 20:14:20.76 mkXjftMX.net
高分子エラストマー
967:はちみつ餃子
19/12/15 20:20:59.00 jthcUe0A.net
>>943
初期化部分に複雑な処理をベタ書きする方が無様だと思うよ。
初期化リストの中にそんなごちゃごちゃしたこと書きたい?
ワイが思うだけなので世間でどう思われてるかは知らんけどとりあえずひとつの意見として。
968:デフォルトの名無しさん
19/12/15 20:54:13.00 TKBas8kS.net
>>939
親クラス(Base)のデストラクタに virtual 付けなくても...
{
shared_ptr<Base> obj( new Derived() );
} // ~Derived() called, then ~Base() called.
~Derived() はコールされるんですね... 確認してみて驚きました。
これができる仕組みを誰か教えてください。
スマートポインタのオブジェクトは子クラスの事何も知らないのに
どうして ~Derived() のコールが可能なのでしょうか?
969:デフォルトの名無しさん
19/12/15 21:07:41.82 2FA7t6Jx.net
>>949
いわゆるtype erasure
URLリンク(blog.cryolite.net)
970:デフォルトの名無しさん
19/12/15 21:19:04.13 TKBas8kS.net
>>950
まだ仕組みのとこまでですが理解できました。ありがとうございます。
971:デフォルトの名無しさん
19/12/15 21:24:07.01 tmrMX5L5.net
質問ですが構造体Fooの内側に構造体Barが定義されているという入れ子になった構造体において、
Fooの外のコードでFoo::Barのサイズをsizeof()で知りたいとき、以下は正しい?
1. C++だとsizeof(Foo::Bar)と書いたらおk
2. CまたはC++でもC互換構文の範疇で済ます場合、次のどちらかの方法でしか書けない
(1) Foo::Barのインスタンスyが存在するスコープ内で、sizeof(y)と書く
(2) Fooのインスタンスxが存在するスコープ内において、Foo::Bar型のメンバyをFooが持つ
(Foo::yが定義されている)という条件の下で、sizeof(x.y)と書く
972:デフォルトの名無しさん
19/12/15 21:39:08.56 tmrMX5L5.net
ふとオモタがインスタンスの必要性は無くせるかもしれん
Foo::Bar型のメンバFoo::yが定義さえされておれば、Fooのインスタンスが無くても
sizeof(((Foo*)0)->y)
と書けばC言語で逝けるかもしれん…
スゲー気持ち悪いコードだが、、、、
973:デフォルトの名無しさん
19/12/15 21:46:34.52 PfQY9kAx.net
>>951
あくまでコンパイル時の型で決まるだけだから要注意
例えば
class A;
class B : public A;
A* p = new B();
std::shared_ptr<A> a(p);
これだとBのデストラクタは呼ばれない
974:デフォルトの名無しさん
19/12/15 21:48:17.68 5sPbacoo.net
なんでそんな中途半端な機能を
わざわざコストをかけて入れたんだろう
975:デフォルトの名無しさん
19/12/15 21:49:32.31 5sPbacoo.net
やむを得ず
なんだろうけど
976:デフォルトの名無しさん
19/12/15 21:51:55.29 PfQY9kAx.net
>>953
Linuxカーネルとかそういう感じのマクロ満載だよ
C言語はそういうもん
977:デフォルトの名無しさん
19/12/15 22:05:12.60 TeOOTcIs.net
type erasureと相性悪いんだっけ
978:はちみつ餃子
19/12/15 22:15:04.90 jthcUe0A.net
>>943
思い出した。
gcc や clang の拡張で良ければ複文が式になる。
だいぶん昔からある機能。
#include <vector>
#include <iostream>
int main() {
std::vector<int> foo(({int i; for(i=0; i<3; i++); i;}));
std::cout << foo.size() << std::endl;
return 0
979:; }
980:
19/12/16 19:39:21.34 NZyGx79l.net
>>944,945,948,959
コメントありがとうございます!
>>944,959
まずgcc拡張
>SieveDerived(int n) : Sieve<T>(({int r; while((r = index(n)) == 0) n--; r;})) { } /* HERE!! */
で問題なく動作しました
すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました
次にラムダ式で定義して即評価する方法がみつかりました
>SieveDerived(int n) : Sieve<T>([](int n)->int{int r; while ((r = index(n)) == 0) n--; return r;}(n)) { } /* HERE!! */
これがやりたかった!とても満足しています、ありがとうございました!
今までは関数オブジェクトの糖衣構文としてしかみていなかったラムダ式を、自分の希望にあわせて(あるいはねじまげてでも)採用し、表現できるようになったのは一歩理解が深まったかと考えています
>>948
>初期化リストの中にそんなごちゃごちゃしたこと書きたい?
クラスのメソッド=メンバ関数には、クラスの提供する機能として独立性の高いもの、少なくとも二箇所で同じような処理がダブっているもの、あるいは主観的には「lemma」として成り立つものを書きたいと考えていました
一箇所でしか使わないものでも lemma 性があるのならば private メソッドとして書くのもありかと思っていますが、今回の場合は、他におなじような処理をおこなっている場所はなく、かといってメソッドとして立てるほどのことでもないので、
複数個所からコールできるメソッドにはしたくなかった、という主観がありました、そういう性質の記述ならば初期化リストにごちゃごちゃ書くのもありかと、読み手には他からコールされ得ないことが自明である点からしても
URLリンク(ideone.com)
981:デフォルトの名無しさん
19/12/16 20:14:24.13 89loOkbp.net
まあこういう自己満は通過儀礼だよな
982:デフォルトの名無しさん
19/12/16 21:46:21.90 kSgVv2yp.net
lambdaの即時評価はjsだと多用されているイメージ
ブロックスコープないからね
983:はちみつ餃子
19/12/17 00:52:53.01 0JRJucIS.net
>>960
> すでにgcc拡張で存在するところからみて、私の希望はあながち無謀かつ無稽なものではないことを知りほっとしました
30 年以上の実績があってもなお仕様に入らない程度に駄目なんだよ。
984:デフォルトの名無しさん
19/12/17 03:23:09 JQ5aWxOy.net
プライベートメンバの単体テストってみんなどうしてるのかな。
985:デフォルトの名無しさん
19/12/17 03:30:02 nsTCJN+n.net
#define private public
986:デフォルトの名無しさん
19/12/17 03:58:13.47 KUtZUPl9.net
#if 0
friend test;
#endif
987:デフォルトの名無しさん
19/12/17 07:08:07.08 KzMqUd+t.net
#ifndef NDEBUG
friend struct test;
#endif
988:デフォルトの名無しさん
19/12/17 07:46:15.26 wpWnXFFo.net
闇言語
989:デフォルトの名無しさん
19/12/17 11:20:07.09 dc1/89bE.net
namespace Method{ namespace Detail {
template<typename ReturnType, typename ... ArgTypes> struct MethodRegister{};
} }
// 文字列で呼び出すための関数を登録するためのマクロ
#define METHOD_REGISTER_WITH_NAME( NAME, FUNC, RETURNTYPE, ... ) \
namespace Method { namespace Detail { \
template<> struct MethodRegister<RETURNTYPE, __VA_ARGS__> { \
using Functional = std::function<RETURNTYPE(__VA_ARGS__)>; \
MethodRegister() { \
MethodContainer::GetInstance().Register<RETURNTYPE, __VA_ARGS__>( #FUNC, Functional( static_cast<RETURNTYPE(*)( __VA_ARGS__ )>( FUNC ) ) ); \
} \
~MethodRegister() { \
MethodContainer::GetInstance().Unregister( #FUNC ); \
} \
}; \
static MethodRegister<RETURNTYPE, __VA_ARGS__> sMethodRegister##FUNC; \
} }
void HOGE(){
std::cout << "Hello World!" << std::endl;
}
void HOGE( std::string text ){
std::cout << text << std::endl;
}
METHOD_REGISTER_METHOD( HOGE, void );
METHOD_REGISTER_METHOD( HOGE, void, std::string );
こういった形で関数を登録する用のクラスを生成し、変数として生成して管理の自動化を行いたいのですが、
関数のオーバーロードを対応しようとした所、クラスの再定義や変数の再定義、管理クラスへの重複登録等
多数の問題が出て詰まってしまいました。
こういった問題を対処するにはどうすればよいのでしょうか?
990:デフォルトの名無しさん
19/12/17 11:28:10.65 rApV4krM.net
BOOST
991:デフォルトの名無しさん
19/12/17 12:23:52.67 lfJGbKnI.net
>>966
>>967
リリース時に消す必要あんの?
992:デフォルトの名無しさん
19/12/17 18:42:08.59 iYSb7MEE.net
このへんがいいんでないの。
URLリンク(srz-zumix.blogspot.com)
993:
19/12/17 19:10:07.01 780pCLgH.net
>>963
まあ、
({int r; while((r = index(n)) == 0) n--; r;})
の最後の
r;
というのが限りなく非文法的ですし
994:デフォルトの名無しさん
19/12/17 21:19:56.70 r3fDxRx7.net
プライベートメンバをテストしたくなったらそのロジックのみを非メンバ関数に切り出してテストしてるな。
まぁ、特に支障がなければ単純にpublicにするだけの時もあるけど。
995:デフォルトの名無しさん
19/12/17 21:45:39.29 HvtzVY9o.net
templateでアクセスすると合法的にプライベートメンバにアクセスできる
996:デフォルトの名無しさん
19/12/17 21:49:21.80 iYSb7MEE.net
そんな糞な方法でテストなんかしたくねー。
997:デフォルトの名無しさん
19/12/18 01:14:03 zSYbFuJ0.net
テストなんかお綺麗にする必要が無い
998:デフォルトの名無しさん
19/12/18 06:18:11.97 BbfJ/y//.net
テストのテストが必要になるような意味のわからないテストコードはアウト
テストコードは実行せずに人が読んで理解できなければいけない
999:デフォルトの名無しさん
19/12/18 07:25:56.60 ksLRDXXy.net
>>978
どんな感じか見せていただけないでしょうか。
1000:デフォルトの名無しさん
19/12/18 07:42:51.80 PEFQbiIG.net
>>971
絶対必要でもないが
少なくともデバッグ用であることくらい
アピールしたい
//よりNDEBUGという特定ワードを使う点にも拘りがある
1001:デフォルトの名無しさん
19/12/18 07:48:17.80 uFDqtnkl.net
>>979
例えばテストコードの中にループや条件分岐があるようなものはアウト
1002:デフォルトの名無しさん
19/12/18 11:33:15.65 ksLRDXXy.net
ループは許してもらえませんか?
データの並びとか検査したいんで。
条件分岐はたぶんないと思います。
1003:デフォルトの名無しさん
19/12/18 12:41:59.93 pXzQg2xI.net
原理主義にすぐ染まるやつw
ご苦労様
1004:デフォルトの名無しさん
19/12/18 13:15:29.66 iEIErwam.net
テスト用にいろんな複雑なテストも入れてるけど
まずいのか?
1005:デフォルトの名無しさん
19/12/18 13:22:47.07 AjekT9H/.net
Debugビルドしたら遅すぎて検証できなくて詰んだ
1006:デフォルトの名無しさん
19/12/18 13:34:17.71 YQOjezK4.net
典型的な糞テストは、テスト対象の出力がハッシュや現在時刻などのような予測しづらいものに依存している場合に、
テストコードにテスト対象自体のロジックと似たものを書いてしまっているケースだな
原則的には、期待する出力は全てハードコードするのが正しい
難しいなら一度試しにテスト対象を実行して目視テストし、その結果をハードコードしたほうがマシ
1007:デフォルトの名無しさん
19/12/18 13:39:53.25 iEIErwam.net
メカが絡むリアルタイム処理でそんな事出来るかよ
1008:デフォルトの名無しさん
19/12/18 15:13:38.33 uFDqtnkl.net
>>982
Parameterized Testsがあれば十分じゃね?
1009:デフォルトの名無しさん
19/12/18 15:16:04.78 uFDqtnkl.net
>>986
期待する出力をハードコードするから
テストで「○○以上であること」って書くこと無いよね?
こういうテストケースある?言い換えるとそういうマッチャーって必要?
1010:デフォルトの名無しさん
19/12/18 15:38:06.38 AmwvkO78.net
次スレは
1011:デフォルトの名無しさん
19/12/18 16:59:26.54 ksLRDXXy.net
よ。
1012:デフォルトの名無しさん
19/12/18 17:57:22.30 uFDqtnkl.net
ほらよ
C++相談室 part147
スレリンク(tech板)
1013:デフォルトの名無しさん
19/12/18 20:28:47.90 CdPazUY7.net
>>987
それはまた別の話
ここで言ってるのは単体テストレベルの話だぞ
1014:デフォルトの名無しさん
19/12/18 21:11:16.67 LM1drZI+.net
クラスとかの勉強入る前にC言語でしっかり文字列処理出来るようになったほうがいい?
1015:蟻人間
19/12/18 21:14:21.02 Zo1XP656.net
>>995
strcpyなんて古い関数は21世紀では使えないぜ。std::stringでOK.
1016:デフォルトの名無しさん
19/12/18 21:14:35.04 uFDqtnkl.net
C言語でしっかり文字列処理出来るようになったほうがいい? → いい
C++でC言語の文字列処理する? → しない
1017:デフォルトの名無しさん
19/12/18 21:16:04.08 aoz4SWmd.net
>>987
逆にそういう不確定な部分とロジック部分を切り分けるのが単体テストの目的でもある。
1018:デフォルトの名無しさん
19/12/18 23:15:57.41 cF9WM4jz.net
>>992乙
お前らコピー使うなムーブしろ
1019:デフォルトの名無しさん
19/12/19 00:00:58.14 zX6m0cqE.net
単体テストはどんだけ単純でわかりやすいコードでテストパターンを網羅するかが肝
Google TestとかTest::MoreとかJUnit使ったらワカル
1020:蟻人間
19/12/19 00:08:57.93 r6T/W91o.net
あれっ?
1021:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 41日 12時間 33分 22秒
1022:過去ログ ★
[過去ログ]
■ このスレッドは過去ログ倉庫に格納されています