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


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

C++相談室 part159



1 名前:デフォルトの名無しさん [2022/02/19(土) 11:56:42.14 ID:kSnJ/KwP.net]
前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1636969758/

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]
頓珍漢な回答して相手にされないからっておれに当たるなよ。

130 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 16:03:22.40 ID:vCUIsgzX.net]
回答してないけどw >>122-126は全て本人確定かなw

131 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 16:04:56.99 ID:A1VwjaQk.net]
>>129 >120

132 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 16:14:02.97 ID:vCUIsgzX.net]
>>130
>>120も回答じゃないけどw

133 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 16:42:08.43 ID:lSALbkfN.net]
126と86は俺だけど…



134 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 16:45:52.89 ID:UVDZkpPA.net]
>>126
kwsk
複数プロセスから同一ファイルに対する同時書き込みオープンは当然できなず、後から開こうとしたプロセスはオープンに失敗する
その場合失敗したプロセスは(エラー要因を調べた上で)一定時間(例えばT秒後)後にオープンを再トライする必要がある
んまーそう作っても良いが(ファイルアクセス権獲得待ちをいつでも簡単にやめられるメリットがある)が、
失敗の度にT秒消費するというのをミューテックスを使えば短縮できる

135 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 16:51:07.27 ID:A1VwjaQk.net]
オープン失敗したら100ms開けてリトライで十分だろう。待機が嫌なら非同期で実装するだけ。
T秒消費するというが同期オブジェクト使っても変わらん。

136 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 16:54:41.39 ID:UVDZkpPA.net]
>>134
>T秒消費するというが同期オブジェクト使っても変わらん。
間違い。
同期オブジェクトを使えばプロセスAがファイルへのアクセス権を行使中、
プロセスBがアクセス権が回ってくるのを待っている状態で
プロセスAがアクセス権を放棄した瞬間にプロセスBにディスパッチされる
ことが気体できる
無駄というものが最小限で済む

137 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 16:58:57.65 ID:lSALbkfN.net]
同期オブジェクトってそんな低レベルで存在しとる概念なのかね

138 名前:はちみつ餃子 mailto:sage [2022/02/23(水) 17:06:44.05 ID:o4j3GXmb.net]
同期オブジェクトを機能させるためにスケジューラに負担をかけるので
待機時間が特に短いことがわかってるならスピンロックのほうが性能は出る可能性はある。
でもスピンロックを正しく実装できる気がしない。

同期のための仕組みを用意してくれてるんだからそれを使っておくのが基本的には楽だよ。
待機時間 100ms のところを 10ms とかに短縮できたところでなんだというんだ。
それが必要な場合もあるといえばあるけど、どちらがより良いかは状況による。

139 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 17:12:13.15 ID:UVDZkpPA.net]
>待機時間 100ms のところを 10ms とかに短縮できたところで
プロセスAがファイルのアクセス権を握り続けている間、
プロセスBがファイルシステムを10 ms周期でcallすることになるな!

140 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 17:17:22.47 ID:A1VwjaQk.net]
消費ってCPUリソースの話じゃないのか。
書き込みに100msの待機が問題となるようなリアルタイムな要件があるならともかく
ファイルの書き込みなんていう遅いものは非同期の実装に頭使うほうが効率的だろう。

141 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 17:21:14.59 ID:UVDZkpPA.net]
非同期の実装を最小の時間ロスで安全に行うものにするにはミューテックスによる同期が必要なわけで(以下無限ループ

142 名前:はちみつ餃子 mailto:sage [2022/02/23(水) 17:24:49.92 ID:o4j3GXmb.net]
スピンロックは沼なんで、
OS が用意してくれとる仕組みを使えってことで FA 。

143 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 17:26:48.01 ID:A1VwjaQk.net]
>>136
同期は機械語レベルの話じゃけんのう。
尻拭いの案件でよく見るが間違ってもCでグローバル変数でif文で切り分けとかしないでくれよ。
OSが提供する同期オブジェクト使うんだ。



144 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 17:30:05.39 ID:lSALbkfN.net]
タイミング合わせるために工夫をこらしたプログラムってのは見ていて嫌な気分になるのう
8bit機なら全部ビジーウェイトでいいんだけど

145 名前:デフォルトの名無しさん mailto:sage [2022/02/23(水) 18:04:03.45 ID:vCUIsgzX.net]
>>






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<255KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef