1 名前:デフォルトの名無しさん [2022/02/19(土) 11:56:42.14 ID:kSnJ/KwP.net] 前スレ C++相談室 part158 https://mevius.5ch.net/test/read.cgi/tech/1636969758/
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を出力させる負荷テストしてみて判断するしかない バカなの? 普通に排他制御すればいいだけだろ
102 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 12:32:42.83 ID:G6nBeheJ.net] 俺は最初にWIN32APIスレへの誘導の意味で、OS固有の方法と書いてるよw ソースコードは回答ではなく、本来質問時に提示されるべき叩き台を俺がわざわざ書いただけw ソースコードが分からないアホ向けに説明しておくと、OSに書き込みが発生するのは実際にファイルに書き込むAPIを叩いたとき(/システムコールかそれに準ずるものを呼んだ時(以下略))なので、それはバッファをフラッシュするタイミングになる。 それが発生するのは普通fに文字列を書き込むときバッファが溢れるかendlの呼び出し中(ライブラリの実装に依存する)。 文字列の長さがバッファから溢れない限り、endl中のAPI呼出が重なるかどうかが問題になる。 各プロセスでAPI呼出が運悪く重なった場合、ここからは一度に書き込まれる量と、OSのファイルシステム実装に依存するが、 混ざった行が出来たり上書き消滅する可能性が生まれる。 それが問題な場合は、主にOS固有の方法でIPCかファイルロックを行う必要がある。 なお要件が明確でない状態で何かを言う必要は全くないw
103 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 13:18:13.18 ID:/94dJWyd.net] グダグタと意味不明な長文書いておいて > なお要件が明確でない状態で何かを言う必要は全くないw って笑いでも取ろうとしてるのか?
104 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 13:22:26.14 ID:uHuVwSWm.net] > 複数のプロセスから同時に同じファイルに書き込む > 書き込んだ順に並ぶようにするには 同時に書き込んでるのに書き込んだ順が決まるわけないやろ〜
105 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 13:30:20.16 ID:Xp3JBKU/.net] 何したいのか知らないけど>>85 で出てるようにタイムスタンプ付けて別のファイルとして書き出した後、 メモリ上でマージするなり第三のプロセスでマージしたファイルを書き出すなりするのが一番楽だな
106 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 13:33:11.97 ID:/94dJWyd.net] >>103 秒オーダーで揃ってりゃいいって話だから多少の前後は気にすんな
107 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 13:39:15.40 ID:uHuVwSWm.net] ファイルOpenして書き込んですぐCloseするだけやん。
108 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 13:46:45.07 ID:G6nBeheJ.net] ほら何もかも要件の問題だろ?w 馬鹿なんだよ質問者がw
109 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 16:11:10.10 ID:BY2+Ruab.net] 馬鹿が馬鹿を笑う地獄絵図
110 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 21:29:07.28 ID:3uW2JHvs.net] 質問のレベルが低くて恐縮ですが、クラスにおいてメンバ変数は各インスタンスに対してメモリが確保されますが、メンバ関数も各インスタンス毎にメモリ確保されるんでしたっけ? メンバ関数はクラスで共有されるんでしたっけ?
111 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 21:44:13.67 ID:G9HkpoRr.net] 共有されてて、呼び出すときにインスタンスのポインタが渡ります。
112 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 21:53:10.29 ID:aBkA6PYf.net] >>109 通常のメンバ関数の実体はそのクラスで1つ(共有される)でインスタンスのメモリ領域は消費しないが、 virtual関数はオーバーライド動作のためにインスタンスにポインタが確保される
113 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:27:23.48 ID:Ui5AoFrq.net] >>110 >>111 ありがとうございます! virtualはともかくメンバ関数を書く際にあまりその点は気にしなくてよさそうですね、安心しました
114 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:27:30.88 ID:Ui5AoFrq.net] >>110 >>111 ありがとうございます! virtualはともかくメンバ関数を書く際にあまりその点は気にしなくてよさそうですね、安心しました
115 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:31:03.90 ID:Ee0G2C5Q.net] main(exe)とlib(dll)の両方から参照されるクラスHoge(非dll・シングルトン)のインスタンスをmainとlibで共用する方法はないですか。 軽く調べてみたらHogeをdll化するかHogeのラッパーdllを作れと出てきたのですが 作らなくても実現出来る方法があれば教えてください
116 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:31:52.69 ID:Ee0G2C5Q.net] main(exe)とlib(dll)の両方から参照されるクラスHoge(非dll・シングルトン)のインスタンスをmainとlibで共用する方法はないですか。 軽く調べてみたらHogeをdll化するかHogeのラッパーdllを作れと出てきたのですが 作らなくても実現出来る方法があれば教えてください
117 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:32:39.84 ID:SYhqe6to.net] virtualも継承されたクラスごとにポインタサイズの隠しフィールドができるだけで virtual関数が増えてもクラスサイズは変わらないんじゃ?
118 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:38:55.24 ID:SYhqe6to.net] >>114 >>115 C++17以降ならstatic変数がある それ以前ならtemplate関数を使ってどうにかごまかせばいける class C{}; inline C c=...; //C++17以降 template<int...>C& _dummy_func(){static C _back=...; return _back;}static C&c=_dummy_func();
119 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:39:30.53 ID:G6nBeheJ.net] ポインタサイズじゃないよ
120 名前:デフォルトの名無しさん mailto:sage [2022/02/22(火) 22:39:57.82 ID:SYhqe6to.net] static変数じゃねーわ inline変数
121 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 01:56:47.51 ID:vCUIsgzX.net] https://godbolt.org/z/P497GqYc7 struct s { virtual void* func(){return this;} virtual void* func2(){return this;} }; struct s2: public s { void* func(){return this;} void* func2(){return this;} }; s obj; s2 obj2; int main() { s& o = obj2; o.func(); o.func2(); return 0; } gcc/clang/msvcどれもポインタサイズだった模様w >>114 についてはまた同じ馬鹿の質問だろうけど論外w コードで示せアホw 「main(exe)とlib(dll)の両方から参照される参照されるクラスHoge(非dll・シングルトン)」???? クラスHogeはシングルトンなのかそうでないのか? lib(dll)から参照されるクラスHoge(非dll)とは? どうして毎日こんな馬鹿な質問が出来るのか分からない。 仮にDLLが遅延ロードされず、シングルトンで、インスタンスの定義だけEXE側に入れたいというアホな要件を思いついた馬鹿がいるのだとしたら、dllexportを使わず、モジュール定義でやれ。 なお、inlineメンバ変数を使ってもdllexpportsならDLL側にインスタンスの定義が入る。
122 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 09:00:40.51 ID:stefKGxD.net] ヒント: 仮想継承
123 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 13:46:51.78 ID:UVDZkpPA.net] >>96 そうだねミューテックス使うね
124 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 13:49:09.36 ID:UVDZkpPA.net] Windowsなら名前付きミューテックスでファイルのオープンからクローズまでを排他するところやが C++の標準規格でどうなっているのかわ知らん、
125 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 14:13:27.06 ID:UVDZkpPA.net] 複数のプロセスから同一ファイルに書き込んで書き込み内容の順序(位置)を制御する方法は 1. プロセス間の同期側で順序を担保する(イベント等による通信を併用 2. ファイルのアクセス権を握ったプロセスがファイルの中身を読んで書き込み位置を決める 3. ファイルのアクセス権を握ったプロセスがファイルを追記オープンして単純に追記していく の大きく分けて3つの方法が取れる 普通は3が多いという印象 ※ 個人の感想です 辞書化とかが必要なら専用のプロセスが適宜ファイルのアクセス権を獲得してやったらええ、
126 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 14:58:09.38 ID:lSALbkfN.net] ちょっと処理が重なったくらいでデータが消えるようなコンピュータはまともに動かんと思うよ
127 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 15:17:24.74 ID:A1VwjaQk.net] そんなアホなことせんでもOSが同期取ってくれるやろ…
128 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 15:43:04.84 ID:vCUIsgzX.net] >>122-126 2日前からアホ質問者不在のまま要件不明案件でお蔵入りした質問を今更ほじくり返して質問者本人ですか?w
129 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 15:53:59.19 ID:A1VwjaQk.net] 頓珍漢な回答して相手にされないからっておれに当たるなよ。