1 名前:デフォルトの名無しさん [2022/02/19(土) 11:56:42.14 ID:kSnJ/KwP.net] 前スレ C++相談室 part158 https://mevius.5ch.net/test/read.cgi/tech/1636969758/
2 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 12:05:32.96 ID:b+8HD1Ua.net] C(チンチン)+(プラ)+(プラ)
3 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:32:43.00 ID:rSu4VNCf.net] アセンブリとかC言語だと「この操作はするな」ってのを簡単には禁止できないからね 許可されてる(コンパイラから怒られない)操作が増えるとその分だけ不正解のコードを書くリスクが高くなる structのこのフィールドは排他制御してから変更してねってのをC言語じゃ簡単には強制できんだろ C++ならgetter作ればいいだけなのに
4 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:38:43.35 ID:2h4SA+VW.net] >>1 乙 >>1000 は宣言に従うこと >>3 それぐらいはC程度の高水準言語であればギリ保証できる クラスFooに対するgetterやsetterを経由しないアクセスを Fooの構造体メンバ名を変えたときビルドエラーとして確実にあぶりだせる ように書くことはFooを書く人の一存で一応できる
5 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:52:37.43 ID:2h4SA+VW.net] カプセル化が簡単にできるというのと、 オブジェクトC := オブジェクトA + オブジェクトB オブジェクトE = オブジェクトC * オブジェクトD ... ここで:=は生成、+や*はなんらかのメッセージ(メソッド) このようにオブジェクトからオブジェクトを作る、的な、 基本単位がオブジェクトなプログラミング環境が維持されないのは オブジェクト指向プログラミングしているうちに入らないと 思うんですよねー(棒
6 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 15:57:04.56 ID:ymxofDah.net] format.hを待ってますた
7 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 15:59:32.57 ID:lVeS0ElI.net] >>3 でもそのC++からCを見て不正解のコードを書くリスクが高くなるという話がそのまま RustからC++を見た場合も当てはまってしまうよな Rustコンパイラならメモリ安全やデータ競合に問題がある操作をエラーで拒否するのにC++はなぜ許して致命的バグを生み出してしまうのだろう、と
8 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 17:53:08.72 ID:kSnJ/KwP.net] 無関係過ぎる 元はアセンブラ必須という人が書き込みがあったので、C++のコンパイラ(gcc)がSIMDを吐く条件についての話をしたんだが・・・ それについては正解できる人や惜しい人すら皆無で、馬鹿がC++全然関係ないOOの話を引っ張ってきて、今じゃC++と無縁な宇宙の話になっている
9 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 18:09:20.91 ID:x/upE6G9.net] 自分でこんなレスしといて今更何言ってるんだかw > 組み込み機器用のCPUって特殊なんで、コンパイラが安定しないなんてよくある話 > オブジェクト指向のメリットの本質についての話なので、可能/不可能が実装言語に依存しないというのもよくある話(楽かどうかは別) > 別に昭和でも平成でも令和でも変わってないけど、>> 991に伝わってないのは確か
10 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 18:26:04.31 ID:kSnJ/KwP.net] 馬鹿がID変えてまた登場
11 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 18:50:37.51 ID:mDQ0X8WX.net] 明示的にはSSEコンパイラ組み込み関数を使えば実現できるけど、多くのコンパイラはシングルレーンのループの一部を自動的にベクトル化してくれるのね コンパイラが暗黙的なベクトル化をしてくれる条件ってシングルレーン以外に何があるんだろ
12 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 19:09:18.39 ID:x/upE6G9.net] >>10 顔真っ赤じゃんw
13 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 19:43:50.83 ID:kSnJ/KwP.net] その問題はもう答え書いた
14 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 20:38:46.85 ID:x/upE6G9.net] 恥の上塗りかよw 答えを書いたとか関係ないだろ > 馬鹿がC++全然関係ないOOの話を引っ張ってきて に乗っといて何言ってるんだよ
15 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 21:13:10.67 ID:kSnJ/KwP.net] 可哀想な馬鹿が勘違いしてるみたいだからちゃんと書いておくと、>>13 は>>11 へのレスな
16 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 21:45:03.99 ID:x/upE6G9.net] 人をバカにしても恥ずかしいレスは消えないよw
17 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 02:19:28.36 ID:c79emsKu.net] >>7 実際そうだよ 生のポインタを使ってる限りはどこに所有権があるか自分で管理するしかない Rustの考え方はC++使いからすれば羨ましいわ
18 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 05:27:00.10 ID:aLhaBLLn.net] けんかをやめて ふたりを止めて わたしのために 争わないで
19 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 09:25:04.73 ID:JXXbW9ML.net] きみC#さんだよね
20 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 10:18:23.47 ID:c+ifp9sQ.net] >>17 だからスマポで出来るやん、それ てか欧米産の大手ゲームの解析なんかしてると普通に向こうもスパゲッティコードだらけだけどな なんだかんだで力技ゴリ押し開発になっちゃうんだよ結局
21 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 10:23:29.96 ID:mD/m0vxj.net] ゲームはハード性能をゴリゴリに引き出すのが正義だからスマポ程度のオーバーヘッドでも許容できないんよ
22 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 10:30:30.73 ID:c+ifp9sQ.net] >>21 いや俺もゲーム開発しとるけどスマポどころかGC任せにするのがもうここ10年くらいは主流だぞ?(最終的にはネイティブ化されるけどそれでもゼロオーバーヘッドになる訳では全くない)
23 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 10:31:03.74 ID:hF9eBvbm.net] え? ゲームでもスマートポインタは普通に使うよ
24 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 10:36:14.20 ID:mD/m0vxj.net] ああ、ゲームって最新の3Dグリグリのやつな(欧米の大手って言うからそっち想像しちゃった) スマホゲーやブラウザゲーはまた別よ
25 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 10:37:11.73 ID:c+ifp9sQ.net] >>24 タルコフ見て同じ事言える?
26 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 10:40:48.26 ID:hF9eBvbm.net] ID:mD/m0vxj は知ったかぶりだね なんのためにC++相談室スレにデタラメを書き込んでるの?
27 名前:デフォルトの名無しさん [2022/02/20(日) 10:43:58.31 ID:h6G+3sJT.net] 共用体が良くわからないのですが、同じメモリーアドレスを複数のメンバで共用するとは どういうことなのでしょうか? メモリの節約と書いてあるのですが、よくわかりません。 同じ型の共用体が複数あったときに使ってないメンバ変数が勝手に消されるなんてわけないですよね どなたか共用体と構造体の違いを教えていただければ幸いです。 (まだクラスについての知識はほとんどないです。)
28 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 10:51:16.26 ID:lvHr33WL.net] PODで型変換するくらいしか使わんのでは
29 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 10:53:23.74 ID:c+ifp9sQ.net] >>27 とあるデータの見方を複数用意するのが共用体 union { intptr_t integer; void* pointer; } value; ↑が構造体であればvalueはポインタ*2分のメモリを使うところ、共用体だとsizeof(value)は4(32bit)or8(64bit)って感じで変数1個でしかない integerとpointerは実体は全く同じデータを見ていて、その見方を二つ用意しただけ value.integer = 8;ってするとpointerも8になる
30 名前:デフォルトの名無しさん [2022/02/20(日) 10:55:47.01 ID:h6G+3sJT.net] え!?メモリの節約ができるの!? でも・・・制限があるんでしょ? って感じで気になるのです。 ただ、基底クラスとか継承っていうのがわからないんだけど、 クラスについての記述がもう少し先にあるから、まだクラスの部分について読みたくない 、クラスを学んでから共用体について学んだほうが良いのでしょうか?
31 名前:デフォルトの名無しさん [2022/02/20(日) 10:56:42.82 ID:h6G+3sJT.net] >>29 ありがとうございます今すぐ読みます
32 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 11:01:01.36 ID:mD/m0vxj.net] そのレベルなら共用体なんて使わないし使うべきじゃないから読み飛ばしていいよ 一通り学習してから戻ってきな
33 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 11:02:54.57 ID:c+ifp9sQ.net] >>30 別に直接的にメモリの節約が出来る訳ではない >>29 の例で言った通り、一つのデータに対して複数の名前を付けるだけの話なのでデータは結局一つしか同時には入れられない なんか実用的な例ありそうだけどunionはC++だとそんな使わないし積極的に使うべきでもないからすぐには思い浮かばない
34 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 11:15:09.90 ID:5KrZlkth.net] variantとかは中身は共用体だった気がする
35 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 11:16:50.11 ID:uUEkIMOM.net] >>27 例えばスクリプト言語みたいに色んな型が入る変数を定義したい時に struct { char c; int i; double d; }; みたいにするとdを使ってる時はc, iの領域が無駄だよね、そういう時に union { char c; int i; double d; }; のようにすると領域が無駄にならない
36 名前:デフォルトの名無しさん [2022/02/20(日) 11:24:25.42 ID:h6G+3sJT.net] なんか気になっちゃうのです。 union value { int test1; double test2; } ; int main() { value test; test.test1= 2147483647; test.test2 = 1.4; cout << sizeof test<<endl; cout << test.test1 << endl << test.test2<<endl; } これなんですけど、共用体のサイズは8byteで構造体にすると16バイトになります。 でも、doubleって8byteですよね? 共用体valueの中には4byteのtest1と8byteのtest2があるはずなのですが、 なんで共用体valueは8byteなのでしょうか? そもそも共用体の中に変数があると言う考え方が間違ているのでしょうか?
37 名前:デフォルトの名無しさん [2022/02/20(日) 11:25:50.54 ID:h6G+3sJT.net] >>35 ありがとうございます。ちなみにその仕組みとかって・・・聞けたりとか・・・
38 名前:デフォルトの名無しさん [2022/02/20(日) 11:26:58.89 ID:h6G+3sJT.net] structだと4byte無駄になるのですね。
39 名前:デフォルトの名無しさん [2022/02/20(日) 11:28:36.50 ID:h6G+3sJT.net] 何となくなのですが、構造体だと メンバの中で一番大きな変数のサイズ*メンバの数 分の領域が確保されるのかな?って思ってみたりしています。
40 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 11:35:01.82 ID:c+ifp9sQ.net] >>36 だから正に"共用"体という名の通り、test1とtest2はメモリの場所を共用してる 君が言う通り、intは4byte、doubleは8byte この場合はunion全体としてのサイズは大きい方に合わさるが、メモリの場所を共用してる事には変わりないためtest2(double)の下位4バイトとtest1(int)が重なってる事になる intとdoubleだと出力分かりづらいからunion value { int test1; long long test2; } ;でやってみ test1 = 0x5; test2 = 0x2410000000000007; こうするとtest1は7(0x00000007)、test2(0x2410000000000007)はとなる(下位4byteは共用されてる)
41 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 11:39:14.94 ID:c+ifp9sQ.net] >>40 これがstructだとちゃんと4+8で12byteの構造体となる(アラインメントって概念によりそうでない事もあるけどそれはまた別で勉強したほうがいい) test1 = 0x5; test2 = 0x2410000000000007; structだとさっきと同じ事をしてもtest1とtest2でメモリは共用されておらずそれぞれ独立しているため、test1は0x5、test2は0x2410000000000007となる
42 名前:デフォルトの名無しさん [2022/02/20(日) 11:41:34.03 ID:h6G+3sJT.net] >>40 ありがとうございます。 すごいっす、メチャすごいっす。 あまりの喜びに敬語忘れてすみません。 "共用”なのですね。 ってことは共用体はいくつかメンバ変数を用意しておいて、一個だけ使なら使ってもいいよ。 しかも、いちばん最後に代入された値が採用されるよと言うことで大丈夫でしょうか?
43 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 11:42:49.02 ID:5KrZlkth.net] ポイントだけ聞くようにして全部聞こうとすんなアホ
44 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 11:50:02.29 ID:hF9eBvbm.net] そもそもC++スレ
45 名前:デフォルトの名無しさん [2022/02/20(日) 11:52:56.02 ID:h6G+3sJT.net] >>40 おかげさまで何とか理解できました。 自分の書いた上の記述(>>41 )もちょっと違ってたような気がするけど まぁ置いておいて・・・。 本当にありがとうございます。
46 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 11:53:19.65 ID:lvHr33WL.net] 共用体とビットフィールドでウハウハよ
47 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 12:26:21.52 ID:8UrVWzFH.net] >>20 スマートポインタを徹底すればできるが記述量が結構増えるのよ 結局面倒臭くなって使わなくなってしまった
48 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 12:30:45.48 ID:8UrVWzFH.net] 共用体はデータ量をケチる目的では使わんでしょ (マイコンとかバイナリデータとかの)データの配置順に意味があるやつとの相互運用にしか使ったことないぞ union A{ struct{ char low; char high;}; short data; }; union B{ struct { int head; double body;}; char data[12]; };
49 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 12:31:01.23 ID:VFmEI3Uz.net] スマポは使えば楽できるときと そうでないときがあるからな 見境のないスマポ厨はただのマゾ
50 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 12:38:44.84 ID:BLiyeQro.net] >>48 大量に確保するデータの場合1バイト2バイトが大きく影響することもあるから、データ量目的でも使うよ
51 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 12:38:51.77 ID:5nwqcAs1.net] 参照オブジェクトを処理するのに 何故か内部でスマポ使いだしたとしたら 予めそいつの代わりに謝っておいてやろう。スマポ。
52 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 12:40:31.26 ID:5KrZlkth.net] 共用体は特定のアーキテクチャで上位下位とか分けるのに使うのが多かったけど、上に書いたようにstd::variantで使うので主にメモリ節約だと思う ところで↓でコメントにしてるエラーはなんか悔しくない?どうしてこういう仕様なんだろう? #include <iostream> using namespace std; struct s { int a; }; int main() { s o; cout << sizeof(o.a) << endl; cout << typeid(o.a).name() << endl; cout << sizeof(int) << endl; cout << typeid(int).name() << endl; cout << sizeof(s::a) << endl; //cout << typeid(s::a).name() << endl; // error return 0; }
53 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 12:44:49.03 ID:BLiyeQro.net] sjis/utf8、utf16、utf32を一緒くたに扱う文字列クラスを作った時にそれぞれの型のポインタを共用体で持たせたな キャストするより楽だったからw
54 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 12:49:58.81 ID:EDNjM2Vr.net] >>48 それはお前の経験が足らんだけ >>34 が言うようなケースでも使うよ
55 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 13:44:10.67 ID:MjuaBSm2.net] >>51 これ何であかんの?
56 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 13:59:07.64 ID:uAn4231w.net] >>36 アセンブラでアライン覚えて来い青二才
57 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 15:04:19.29 ID:aLhaBLLn.net] 共用体使うとシフト演算しなくていいし、 最近のCPU(っても20年まえぐらい)から1ビット操作命令もあるし、パフォーマンスがいいと思うぜ
58 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 18:12:12.24 ID:8IAIbIwN.net] >>54 std::variant見てきた ただのunionラップクラスじゃねーか
59 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 19:01:05.55 ID:uUEkIMOM.net] >>58 > ただのunionラップクラスじゃねーか それの何が不満なんだよw
60 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 21:42:58.02 ID:8IAIbIwN.net] ただのunionラッパーをunionの活用例かのような言い方をした >>54 に対する不満だ
61 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 21:47:59.16 ID:uAn4231w.net] 米大統領と密談した「IQ1200の金星人」ヴァリアント・ソーとは ...
62 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 22:02:46.59 ID:uUEkIMOM.net] >>60 意味わからんw ラッパーだと活用例じゃないとでも?
63 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 22:37:27.22 ID:V67/tnWS.net] スマポの記述量が長い問題って皆どうしてんの?
64 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 22:52:41.23 ID:uSEnVnLU.net] C++のstd::variantとほぼ近い、 Rustのenum(=格納付きenum=タグ付きunion)を比べると 圧倒的にRustのenumが使いやすくてRust言語の核心部分となっていることからもわかるように C++ではその分野の言語サポートが弱いんだよな
65 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 22:54:00.38 ID:uSEnVnLU.net] >>63 その件もRustが上手いことやってるよな
66 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 23:01:58.00 ID:V67/tnWS.net] >>65 そうなのか 正直あんまり触ったことないんだが、そういう話なら触ってみようかな
67 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 23:24:26.58 ID:5KrZlkth.net] Rustのことはスレ
68 名前:違いだけど、言語機能としてどこまでサポートするかは、分かりやすさと直結してると思う C++のstd::variantの方が分かりやすいと思う人もいれば Rustのenumの方が分かりやすいと思う人もいると思う [] [ここ壊れてます]
69 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 23:44:12.87 ID:Y4d5gioW.net] >>67 C++には十分なパターンマッチング機構がないからタグ付き共用体(Rustではenum)を便利に生かせないのが大きい C++よりRustは記述がしやすいと言われている原因の大きな一つとなっている
70 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 23:47:42.47 ID:5KrZlkth.net] ほんとに馬鹿ばかりだな・・・ そんな話はしてないしスレ違いだと言ってるだろ・・・ https://mevius.5ch.net/test/read.cgi/tech/1643289587/
71 名前:デフォルトの名無しさん mailto:sage [2022/02/20(日) 23:59:35.38 ID:uSEnVnLU.net] >>52 で主にメモリ節約が目的と言っているようだが それはC++の言語によるサポートが貧弱すぎるための特殊な悲惨な状況であって 他の言語ではむしろvariantこそがプログラミングの中心、という話ではないか
72 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 00:04:14.70 ID:NpsKB2au.net] 馬鹿には分からないかもしれないけど、嫌なら自分で作ればいいという世界なんだよ
73 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 00:06:46.53 ID:Jx3FjySw.net] 昔は全部ゼロから作ってたな
74 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 00:10:21.16 ID:lBTJyZA6.net] >>71 それは無理 様々な言語がなぜ言語レベルでパターンマッチングなどをサポートとしているかというと 言語レベルでサポートしないと無理なことが多数あるため C++しか書いたことがない特殊な人でなければこれを理解することができる
75 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 00:12:34.69 ID:NpsKB2au.net] https://mevius.5ch.net/test/read.cgi/tech/1643289587/
76 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 00:19:21.75 ID:NpsKB2au.net] ところで>>52 の > ところで↓でコメントにしてるエラーはなんか悔しくない?どうしてこういう仕様なんだろう? への回答はないの?
77 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 01:59:03.04 ID:dmBIFY6O.net] &s::aの型がint s::*な以上s::aの型はintにはならんからじゃない? sizeofだけ許されてるのがわからん
78 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 02:21:18.10 ID:NpsKB2au.net] ありがとう。全く同じ感想だわ。わからんよね。 #include <memory> #include <cxxabi.h> // for gcc #include <iostream> using namespace std; const char* demangle(const char* name) { return abi::__cxa_demangle(name, NULL, NULL, NULL); // leaks } struct s { int a; }; int main() { cout << sizeof(&s::a) << endl; cout << demangle(typeid(&s::a).name()) << endl; cout << sizeof(s::a) << endl; //cout << demangle(typeid(s::a).name()) << endl; // error return 0; }
79 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 08:22:55.36 ID:QJQOoC8g.net] PPoEのことピッポエって読んでたらめっちゃバカにされてくやしいです。 どうしたらいいですか?
80 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 08:24:57.39 ID:wtPLXwv8.net] ボコしたら?
81 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 19:45:02.12 ID:K+YQY1en.net] 複数のプロセスから同時に同じファイルに書き込むにはどうすればいいですか? ofstreamで実験(a.exeとb.exeを同時に起動して、同じtxtに10行ずつ書き込み)してみましたが、 a.exeで書き込んだ内容が10行並んだ後に、b.exeで書き込んだ内容が10行並ぶような結果になりました。 書き込んだ順に並ぶようにするにはどうすればいいですか?
82 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 19:50:32.28 ID:NpsKB2au.net] OS固有の方法を使え
83 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 19:56:04.55 ID:gBEocJIs.net] fprintf()とかの標準ライブラリだとcloseかflushするまで書き込みは反映されない 書き込みのタイムスタンプ順を保証するとなるとかなり面倒くさい 毎回flushするとかcloseするとかしないといけない 書き込んだ内容がもう一方のプロセスに上書きされて消えたりとかの問題も出てくる
84 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 20:03:35.84 ID:K+YQY1en.net] ありがとうございます。 保証とまでは求めてなくて、だいたい秒オーダー程度の順でぱっと見の違和感なければいいかなと思っていますのでひとまずflushを入れて実験してみます。 (多少の順番ずれは問題ないですが、上書き消滅だけは絶対問題なので)
85 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 20:06:09.78 ID:9Efuu0ky.net] ロックしろ
86 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 20:08:56.82 ID:Hi57Ra7S.net] ・別々のファイルに吐き出しておいて後からマージ(リアルタイム性不要なら一番楽) ・書き込みの時に毎回排他ロックする(くそ遅い、書き込みが稀ならあり) ・書き込み専門のプロセスを設けてプロセス間通信(正しいけどめんどくさい)
87 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 20:22:59.51 ID:M/x1eSML.net] >>80 書き込みプロセスを集約した方が制御はしやすいわ
88 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 21:24:26.76 ID:NpsKB2au.net] こんなC++erばかりではもうダメだな・・・・ 質問は最悪だけど、確認も回答もやばい 混ざった行が出来たり上書き消滅する日がいつか来る
89 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 21:47:29.24 ID:2lTMmgDc.net] >>87 ロックを使っても行が混ざるのかーすごいなー
90 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 21:55:16.21 ID:Gf4lGfIx.net] ロックの仕方によるから 極論文字単位にロックしたら混ざるし
91 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 22:05:20.94 ID:NpsKB2au.net] 真面目に相手をするなら、質問の前提を明確にしないといけないから。 聞きたいことだけ書いてきて、状況が全く分からない質問に対して、あれこれ書いても意味はなく、最初にしないといけないのはまず確認。 環境やら現象やら具体的なコード、最終的なゴールがどこか、当たり前のモノが全て抜けていて、未だに8割方見えていない。
92 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 22:27:52.22 ID:2lTMmgDc.net] 質問に対して状況を確認せず真っ先に>>81 で抜けてる回答してる君がいうと説得力があるね
93 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 22:40:17.44 ID:NpsKB2au.net] あれはいつものWIN32APIスレへの誘導しか意味してないw .exeが出て来た時点で萎える
94 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 23:11:26.10 ID:Vo68A3hI.net] 同時には無理やろ〜
95 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 23:17:32.27 ID:NpsKB2au.net] // std::endlでflush()。時間測定と1行/秒機能付きバッファ懸念OS順序懸念あり。 // 混ざった行が出来たり上書き消滅してもいい人向け。 #include <iostream> #include <fstream> #include <chrono> #include <thread> using namespace std::chrono; template<typename T, typename CallbackFunc, typename TargetFunc, typename... Args> void measure(CallbackFunc callback, TargetFunc f, Args... args) { auto start = high_resolution_clock::now(); auto result = f(args...); auto end = high_resolution_clock::now(); callback(result, duration_cast<T>(end - start).count()); } int write_to_file(const char* path, const char* sts) { std::ofstream f(path, std::ios_base::app); for (int i = 0; i < 10; ++i) { f << sts << std::endl; //std::this_thread::sleep_for(1s); } return 0; } int main(int argc, char* argv[]) { int ret = -1; measure<microseconds>( [&](auto result, auto time) {ret = result; std::cout << time << std::endl; }, &write_to_file, "hoge.txt", (argc > 1 ? argv[1] : "hoge")); return ret; }
96 名前:デフォルトの名無しさん mailto:sage [2022/02/21(月) 23:19:40.75 ID:NpsKB2au.net] 書き忘れた。異常系なし。
97 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 08:35:20.17 ID:4AnTGrM3.net] セマフォかミューテックス使えばいいだけやん
98 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 08:52:30.71 ID:uvLrfhT4.net] 偉そうなこと言っといて>>83 の上書き禁要件ガン無視してるのは草
99 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 08:56:43.07 ID:vnxKrxaR.net] 消滅って実際あるもんかね? unix系はなさそうな気がする
100 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 10:16:04.97 ID:fFHtSmjB.net] 標準ライブラリの仕様で上書き消滅しないって保証されてれば問題ない 保証されてなければ20プロセスぐらいからchrono::system_clockのタイムスタンプとloopcountを出力させる負荷テストしてみて判断するしかない
101 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 10:38:46.92 ID:3Vwbzil/.net] >>99 > 保証されてなければ20プロセスぐらいからchrono::system_clockのタイムスタンプとloopcountを出力させる負荷テストしてみて判断するしかない バカなの? 普通に排他制御すればいいだけだろ