前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1636969758/
探検
C++相談室 part159
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2022/02/19(土) 11:56:42.14ID:kSnJ/KwP2022/02/20(日) 10:51:16.26ID:lvHr33WL
PODで型変換するくらいしか使わんのでは
2022/02/20(日) 10:53:23.74ID:c+ifp9sQ
>>27
とあるデータの見方を複数用意するのが共用体
union { intptr_t integer; void* pointer; } value;
↑が構造体であればvalueはポインタ*2分のメモリを使うところ、共用体だとsizeof(value)は4(32bit)or8(64bit)って感じで変数1個でしかない
integerとpointerは実体は全く同じデータを見ていて、その見方を二つ用意しただけ
value.integer = 8;ってするとpointerも8になる
とあるデータの見方を複数用意するのが共用体
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.01ID:h6G+3sJT え!?メモリの節約ができるの!?
でも・・・制限があるんでしょ?
って感じで気になるのです。
ただ、基底クラスとか継承っていうのがわからないんだけど、
クラスについての記述がもう少し先にあるから、まだクラスの部分について読みたくない
、クラスを学んでから共用体について学んだほうが良いのでしょうか?
でも・・・制限があるんでしょ?
って感じで気になるのです。
ただ、基底クラスとか継承っていうのがわからないんだけど、
クラスについての記述がもう少し先にあるから、まだクラスの部分について読みたくない
、クラスを学んでから共用体について学んだほうが良いのでしょうか?
31デフォルトの名無しさん
2022/02/20(日) 10:56:42.82ID:h6G+3sJT >>29
ありがとうございます今すぐ読みます
ありがとうございます今すぐ読みます
2022/02/20(日) 11:01:01.36ID:mD/m0vxj
そのレベルなら共用体なんて使わないし使うべきじゃないから読み飛ばしていいよ
一通り学習してから戻ってきな
一通り学習してから戻ってきな
2022/02/20(日) 11:02:54.57ID:c+ifp9sQ
2022/02/20(日) 11:15:09.90ID:5KrZlkth
variantとかは中身は共用体だった気がする
2022/02/20(日) 11:16:50.11ID:uUEkIMOM
>>27
例えばスクリプト言語みたいに色んな型が入る変数を定義したい時に
struct {
char c;
int i;
double d;
};
みたいにするとdを使ってる時はc, iの領域が無駄だよね、そういう時に
union {
char c;
int i;
double d;
};
のようにすると領域が無駄にならない
例えばスクリプト言語みたいに色んな型が入る変数を定義したい時に
struct {
char c;
int i;
double d;
};
みたいにするとdを使ってる時はc, iの領域が無駄だよね、そういう時に
union {
char c;
int i;
double d;
};
のようにすると領域が無駄にならない
36デフォルトの名無しさん
2022/02/20(日) 11:24:25.42ID:h6G+3sJT なんか気になっちゃうのです。
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なのでしょうか?
そもそも共用体の中に変数があると言う考え方が間違ているのでしょうか?
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.54ID:h6G+3sJT >>35
ありがとうございます。ちなみにその仕組みとかって・・・聞けたりとか・・・
ありがとうございます。ちなみにその仕組みとかって・・・聞けたりとか・・・
38デフォルトの名無しさん
2022/02/20(日) 11:26:58.89ID:h6G+3sJT structだと4byte無駄になるのですね。
39デフォルトの名無しさん
2022/02/20(日) 11:28:36.50ID:h6G+3sJT 何となくなのですが、構造体だと
メンバの中で一番大きな変数のサイズ*メンバの数
分の領域が確保されるのかな?って思ってみたりしています。
メンバの中で一番大きな変数のサイズ*メンバの数
分の領域が確保されるのかな?って思ってみたりしています。
2022/02/20(日) 11:35:01.82ID:c+ifp9sQ
>>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は共用されてる)
だから正に"共用"体という名の通り、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は共用されてる)
2022/02/20(日) 11:39:14.94ID:c+ifp9sQ
>>40
これがstructだとちゃんと4+8で12byteの構造体となる(アラインメントって概念によりそうでない事もあるけどそれはまた別で勉強したほうがいい)
test1 = 0x5;
test2 = 0x2410000000000007;
structだとさっきと同じ事をしてもtest1とtest2でメモリは共用されておらずそれぞれ独立しているため、test1は0x5、test2は0x2410000000000007となる
これがstructだとちゃんと4+8で12byteの構造体となる(アラインメントって概念によりそうでない事もあるけどそれはまた別で勉強したほうがいい)
test1 = 0x5;
test2 = 0x2410000000000007;
structだとさっきと同じ事をしてもtest1とtest2でメモリは共用されておらずそれぞれ独立しているため、test1は0x5、test2は0x2410000000000007となる
42デフォルトの名無しさん
2022/02/20(日) 11:41:34.03ID:h6G+3sJT >>40
ありがとうございます。
すごいっす、メチャすごいっす。
あまりの喜びに敬語忘れてすみません。
"共用”なのですね。
ってことは共用体はいくつかメンバ変数を用意しておいて、一個だけ使なら使ってもいいよ。
しかも、いちばん最後に代入された値が採用されるよと言うことで大丈夫でしょうか?
ありがとうございます。
すごいっす、メチャすごいっす。
あまりの喜びに敬語忘れてすみません。
"共用”なのですね。
ってことは共用体はいくつかメンバ変数を用意しておいて、一個だけ使なら使ってもいいよ。
しかも、いちばん最後に代入された値が採用されるよと言うことで大丈夫でしょうか?
2022/02/20(日) 11:42:49.02ID:5KrZlkth
ポイントだけ聞くようにして全部聞こうとすんなアホ
2022/02/20(日) 11:50:02.29ID:hF9eBvbm
そもそもC++スレ
45デフォルトの名無しさん
2022/02/20(日) 11:52:56.02ID:h6G+3sJT2022/02/20(日) 11:53:19.65ID:lvHr33WL
共用体とビットフィールドでウハウハよ
2022/02/20(日) 12:26:21.52ID:8UrVWzFH
2022/02/20(日) 12:30:45.48ID:8UrVWzFH
共用体はデータ量をケチる目的では使わんでしょ
(マイコンとかバイナリデータとかの)データの配置順に意味があるやつとの相互運用にしか使ったことないぞ
union A{
struct{ char low; char high;};
short data;
};
union B{
struct { int head; double body;};
char data[12];
};
(マイコンとかバイナリデータとかの)データの配置順に意味があるやつとの相互運用にしか使ったことないぞ
union A{
struct{ char low; char high;};
short data;
};
union B{
struct { int head; double body;};
char data[12];
};
2022/02/20(日) 12:31:01.23ID:VFmEI3Uz
スマポは使えば楽できるときと
そうでないときがあるからな
見境のないスマポ厨はただのマゾ
そうでないときがあるからな
見境のないスマポ厨はただのマゾ
2022/02/20(日) 12:38:44.84ID:BLiyeQro
>>48
大量に確保するデータの場合1バイト2バイトが大きく影響することもあるから、データ量目的でも使うよ
大量に確保するデータの場合1バイト2バイトが大きく影響することもあるから、データ量目的でも使うよ
2022/02/20(日) 12:38:51.77ID:5nwqcAs1
参照オブジェクトを処理するのに
何故か内部でスマポ使いだしたとしたら
予めそいつの代わりに謝っておいてやろう。スマポ。
何故か内部でスマポ使いだしたとしたら
予めそいつの代わりに謝っておいてやろう。スマポ。
2022/02/20(日) 12:40:31.26ID:5KrZlkth
共用体は特定のアーキテクチャで上位下位とか分けるのに使うのが多かったけど、上に書いたように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;
}
ところで↓でコメントにしてるエラーはなんか悔しくない?どうしてこういう仕様なんだろう?
#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;
}
2022/02/20(日) 12:44:49.03ID:BLiyeQro
sjis/utf8、utf16、utf32を一緒くたに扱う文字列クラスを作った時にそれぞれの型のポインタを共用体で持たせたな
キャストするより楽だったからw
キャストするより楽だったからw
2022/02/20(日) 12:49:58.81ID:EDNjM2Vr
2022/02/20(日) 13:44:10.67ID:MjuaBSm2
>>51
これ何であかんの?
これ何であかんの?
2022/02/20(日) 13:59:07.64ID:uAn4231w
>>36
アセンブラでアライン覚えて来い青二才
アセンブラでアライン覚えて来い青二才
2022/02/20(日) 15:04:19.29ID:aLhaBLLn
共用体使うとシフト演算しなくていいし、
最近のCPU(っても20年まえぐらい)から1ビット操作命令もあるし、パフォーマンスがいいと思うぜ
最近のCPU(っても20年まえぐらい)から1ビット操作命令もあるし、パフォーマンスがいいと思うぜ
2022/02/20(日) 18:12:12.24ID:8IAIbIwN
2022/02/20(日) 19:01:05.55ID:uUEkIMOM
2022/02/20(日) 21:42:58.02ID:8IAIbIwN
ただのunionラッパーをunionの活用例かのような言い方をした >>54 に対する不満だ
2022/02/20(日) 21:47:59.16ID:uAn4231w
米大統領と密談した「IQ1200の金星人」ヴァリアント・ソーとは ...
2022/02/20(日) 22:02:46.59ID:uUEkIMOM
2022/02/20(日) 22:37:27.22ID:V67/tnWS
スマポの記述量が長い問題って皆どうしてんの?
2022/02/20(日) 22:52:41.23ID:uSEnVnLU
C++のstd::variantとほぼ近い、
Rustのenum(=格納付きenum=タグ付きunion)を比べると
圧倒的にRustのenumが使いやすくてRust言語の核心部分となっていることからもわかるように
C++ではその分野の言語サポートが弱いんだよな
Rustのenum(=格納付きenum=タグ付きunion)を比べると
圧倒的にRustのenumが使いやすくてRust言語の核心部分となっていることからもわかるように
C++ではその分野の言語サポートが弱いんだよな
2022/02/20(日) 22:54:00.38ID:uSEnVnLU
>>63
その件もRustが上手いことやってるよな
その件もRustが上手いことやってるよな
2022/02/20(日) 23:01:58.00ID:V67/tnWS
2022/02/20(日) 23:24:26.58ID:5KrZlkth
Rustのことはスレ違いだけど、言語機能としてどこまでサポートするかは、分かりやすさと直結してると思う
C++のstd::variantの方が分かりやすいと思う人もいれば
Rustのenumの方が分かりやすいと思う人もいると思う
C++のstd::variantの方が分かりやすいと思う人もいれば
Rustのenumの方が分かりやすいと思う人もいると思う
2022/02/20(日) 23:44:12.87ID:Y4d5gioW
>>67
C++には十分なパターンマッチング機構がないからタグ付き共用体(Rustではenum)を便利に生かせないのが大きい
C++よりRustは記述がしやすいと言われている原因の大きな一つとなっている
C++には十分なパターンマッチング機構がないからタグ付き共用体(Rustではenum)を便利に生かせないのが大きい
C++よりRustは記述がしやすいと言われている原因の大きな一つとなっている
2022/02/20(日) 23:47:42.47ID:5KrZlkth
2022/02/20(日) 23:59:35.38ID:uSEnVnLU
>>52で主にメモリ節約が目的と言っているようだが
それはC++の言語によるサポートが貧弱すぎるための特殊な悲惨な状況であって
他の言語ではむしろvariantこそがプログラミングの中心、という話ではないか
それはC++の言語によるサポートが貧弱すぎるための特殊な悲惨な状況であって
他の言語ではむしろvariantこそがプログラミングの中心、という話ではないか
2022/02/21(月) 00:04:14.70ID:NpsKB2au
馬鹿には分からないかもしれないけど、嫌なら自分で作ればいいという世界なんだよ
2022/02/21(月) 00:06:46.53ID:Jx3FjySw
昔は全部ゼロから作ってたな
2022/02/21(月) 00:10:21.16ID:lBTJyZA6
>>71
それは無理
様々な言語がなぜ言語レベルでパターンマッチングなどをサポートとしているかというと
言語レベルでサポートしないと無理なことが多数あるため
C++しか書いたことがない特殊な人でなければこれを理解することができる
それは無理
様々な言語がなぜ言語レベルでパターンマッチングなどをサポートとしているかというと
言語レベルでサポートしないと無理なことが多数あるため
C++しか書いたことがない特殊な人でなければこれを理解することができる
2022/02/21(月) 00:12:34.69ID:NpsKB2au
2022/02/21(月) 00:19:21.75ID:NpsKB2au
2022/02/21(月) 01:59:03.04ID:dmBIFY6O
&s::aの型がint s::*な以上s::aの型はintにはならんからじゃない?
sizeofだけ許されてるのがわからん
sizeofだけ許されてるのがわからん
2022/02/21(月) 02:21:18.10ID:NpsKB2au
ありがとう。全く同じ感想だわ。わからんよね。
#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;
}
#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;
}
2022/02/21(月) 08:22:55.36ID:QJQOoC8g
PPoEのことピッポエって読んでたらめっちゃバカにされてくやしいです。
どうしたらいいですか?
どうしたらいいですか?
2022/02/21(月) 08:24:57.39ID:wtPLXwv8
ボコしたら?
2022/02/21(月) 19:45:02.12ID:K+YQY1en
複数のプロセスから同時に同じファイルに書き込むにはどうすればいいですか?
ofstreamで実験(a.exeとb.exeを同時に起動して、同じtxtに10行ずつ書き込み)してみましたが、
a.exeで書き込んだ内容が10行並んだ後に、b.exeで書き込んだ内容が10行並ぶような結果になりました。
書き込んだ順に並ぶようにするにはどうすればいいですか?
ofstreamで実験(a.exeとb.exeを同時に起動して、同じtxtに10行ずつ書き込み)してみましたが、
a.exeで書き込んだ内容が10行並んだ後に、b.exeで書き込んだ内容が10行並ぶような結果になりました。
書き込んだ順に並ぶようにするにはどうすればいいですか?
2022/02/21(月) 19:50:32.28ID:NpsKB2au
OS固有の方法を使え
2022/02/21(月) 19:56:04.55ID:gBEocJIs
fprintf()とかの標準ライブラリだとcloseかflushするまで書き込みは反映されない
書き込みのタイムスタンプ順を保証するとなるとかなり面倒くさい
毎回flushするとかcloseするとかしないといけない
書き込んだ内容がもう一方のプロセスに上書きされて消えたりとかの問題も出てくる
書き込みのタイムスタンプ順を保証するとなるとかなり面倒くさい
毎回flushするとかcloseするとかしないといけない
書き込んだ内容がもう一方のプロセスに上書きされて消えたりとかの問題も出てくる
2022/02/21(月) 20:03:35.84ID:K+YQY1en
ありがとうございます。
保証とまでは求めてなくて、だいたい秒オーダー程度の順でぱっと見の違和感なければいいかなと思っていますのでひとまずflushを入れて実験してみます。
(多少の順番ずれは問題ないですが、上書き消滅だけは絶対問題なので)
保証とまでは求めてなくて、だいたい秒オーダー程度の順でぱっと見の違和感なければいいかなと思っていますのでひとまずflushを入れて実験してみます。
(多少の順番ずれは問題ないですが、上書き消滅だけは絶対問題なので)
2022/02/21(月) 20:06:09.78ID:9Efuu0ky
ロックしろ
2022/02/21(月) 20:08:56.82ID:Hi57Ra7S
・別々のファイルに吐き出しておいて後からマージ(リアルタイム性不要なら一番楽)
・書き込みの時に毎回排他ロックする(くそ遅い、書き込みが稀ならあり)
・書き込み専門のプロセスを設けてプロセス間通信(正しいけどめんどくさい)
・書き込みの時に毎回排他ロックする(くそ遅い、書き込みが稀ならあり)
・書き込み専門のプロセスを設けてプロセス間通信(正しいけどめんどくさい)
2022/02/21(月) 20:22:59.51ID:M/x1eSML
>>80
書き込みプロセスを集約した方が制御はしやすいわ
書き込みプロセスを集約した方が制御はしやすいわ
2022/02/21(月) 21:24:26.76ID:NpsKB2au
こんなC++erばかりではもうダメだな・・・・
質問は最悪だけど、確認も回答もやばい
混ざった行が出来たり上書き消滅する日がいつか来る
質問は最悪だけど、確認も回答もやばい
混ざった行が出来たり上書き消滅する日がいつか来る
2022/02/21(月) 21:47:29.24ID:2lTMmgDc
>>87
ロックを使っても行が混ざるのかーすごいなー
ロックを使っても行が混ざるのかーすごいなー
2022/02/21(月) 21:55:16.21ID:Gf4lGfIx
ロックの仕方によるから
極論文字単位にロックしたら混ざるし
極論文字単位にロックしたら混ざるし
2022/02/21(月) 22:05:20.94ID:NpsKB2au
真面目に相手をするなら、質問の前提を明確にしないといけないから。
聞きたいことだけ書いてきて、状況が全く分からない質問に対して、あれこれ書いても意味はなく、最初にしないといけないのはまず確認。
環境やら現象やら具体的なコード、最終的なゴールがどこか、当たり前のモノが全て抜けていて、未だに8割方見えていない。
聞きたいことだけ書いてきて、状況が全く分からない質問に対して、あれこれ書いても意味はなく、最初にしないといけないのはまず確認。
環境やら現象やら具体的なコード、最終的なゴールがどこか、当たり前のモノが全て抜けていて、未だに8割方見えていない。
2022/02/21(月) 22:27:52.22ID:2lTMmgDc
質問に対して状況を確認せず真っ先に>>81で抜けてる回答してる君がいうと説得力があるね
2022/02/21(月) 22:40:17.44ID:NpsKB2au
あれはいつものWIN32APIスレへの誘導しか意味してないw
.exeが出て来た時点で萎える
.exeが出て来た時点で萎える
2022/02/21(月) 23:11:26.10ID:Vo68A3hI
同時には無理やろ〜
2022/02/21(月) 23:17:32.27ID:NpsKB2au
// 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;
}
// 混ざった行が出来たり上書き消滅してもいい人向け。
#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;
}
2022/02/21(月) 23:19:40.75ID:NpsKB2au
書き忘れた。異常系なし。
2022/02/22(火) 08:35:20.17ID:4AnTGrM3
セマフォかミューテックス使えばいいだけやん
2022/02/22(火) 08:52:30.71ID:uvLrfhT4
偉そうなこと言っといて>>83の上書き禁要件ガン無視してるのは草
2022/02/22(火) 08:56:43.07ID:vnxKrxaR
消滅って実際あるもんかね?
unix系はなさそうな気がする
unix系はなさそうな気がする
2022/02/22(火) 10:16:04.97ID:fFHtSmjB
標準ライブラリの仕様で上書き消滅しないって保証されてれば問題ない
保証されてなければ20プロセスぐらいからchrono::system_clockのタイムスタンプとloopcountを出力させる負荷テストしてみて判断するしかない
保証されてなければ20プロセスぐらいからchrono::system_clockのタイムスタンプとloopcountを出力させる負荷テストしてみて判断するしかない
100デフォルトの名無しさん
2022/02/22(火) 10:38:46.92ID:3Vwbzil/ >>99
> 保証されてなければ20プロセスぐらいからchrono::system_clockのタイムスタンプとloopcountを出力させる負荷テストしてみて判断するしかない
バカなの?
普通に排他制御すればいいだけだろ
> 保証されてなければ20プロセスぐらいからchrono::system_clockのタイムスタンプとloopcountを出力させる負荷テストしてみて判断するしかない
バカなの?
普通に排他制御すればいいだけだろ
101デフォルトの名無しさん
2022/02/22(火) 12:32:42.83ID:G6nBeheJ 俺は最初にWIN32APIスレへの誘導の意味で、OS固有の方法と書いてるよw ソースコードは回答ではなく、本来質問時に提示されるべき叩き台を俺がわざわざ書いただけw
ソースコードが分からないアホ向けに説明しておくと、OSに書き込みが発生するのは実際にファイルに書き込むAPIを叩いたとき(/システムコールかそれに準ずるものを呼んだ時(以下略))なので、それはバッファをフラッシュするタイミングになる。
それが発生するのは普通fに文字列を書き込むときバッファが溢れるかendlの呼び出し中(ライブラリの実装に依存する)。
文字列の長さがバッファから溢れない限り、endl中のAPI呼出が重なるかどうかが問題になる。
各プロセスでAPI呼出が運悪く重なった場合、ここからは一度に書き込まれる量と、OSのファイルシステム実装に依存するが、 混ざった行が出来たり上書き消滅する可能性が生まれる。
それが問題な場合は、主にOS固有の方法でIPCかファイルロックを行う必要がある。
なお要件が明確でない状態で何かを言う必要は全くないw
ソースコードが分からないアホ向けに説明しておくと、OSに書き込みが発生するのは実際にファイルに書き込むAPIを叩いたとき(/システムコールかそれに準ずるものを呼んだ時(以下略))なので、それはバッファをフラッシュするタイミングになる。
それが発生するのは普通fに文字列を書き込むときバッファが溢れるかendlの呼び出し中(ライブラリの実装に依存する)。
文字列の長さがバッファから溢れない限り、endl中のAPI呼出が重なるかどうかが問題になる。
各プロセスでAPI呼出が運悪く重なった場合、ここからは一度に書き込まれる量と、OSのファイルシステム実装に依存するが、 混ざった行が出来たり上書き消滅する可能性が生まれる。
それが問題な場合は、主にOS固有の方法でIPCかファイルロックを行う必要がある。
なお要件が明確でない状態で何かを言う必要は全くないw
102デフォルトの名無しさん
2022/02/22(火) 13:18:13.18ID:/94dJWyd グダグタと意味不明な長文書いておいて
> なお要件が明確でない状態で何かを言う必要は全くないw
って笑いでも取ろうとしてるのか?
> なお要件が明確でない状態で何かを言う必要は全くないw
って笑いでも取ろうとしてるのか?
103デフォルトの名無しさん
2022/02/22(火) 13:22:26.14ID:uHuVwSWm > 複数のプロセスから同時に同じファイルに書き込む
> 書き込んだ順に並ぶようにするには
同時に書き込んでるのに書き込んだ順が決まるわけないやろ〜
> 書き込んだ順に並ぶようにするには
同時に書き込んでるのに書き込んだ順が決まるわけないやろ〜
104デフォルトの名無しさん
2022/02/22(火) 13:30:20.16ID:Xp3JBKU/ 何したいのか知らないけど>>85で出てるようにタイムスタンプ付けて別のファイルとして書き出した後、
メモリ上でマージするなり第三のプロセスでマージしたファイルを書き出すなりするのが一番楽だな
メモリ上でマージするなり第三のプロセスでマージしたファイルを書き出すなりするのが一番楽だな
105デフォルトの名無しさん
2022/02/22(火) 13:33:11.97ID:/94dJWyd >>103
秒オーダーで揃ってりゃいいって話だから多少の前後は気にすんな
秒オーダーで揃ってりゃいいって話だから多少の前後は気にすんな
106デフォルトの名無しさん
2022/02/22(火) 13:39:15.40ID:uHuVwSWm ファイルOpenして書き込んですぐCloseするだけやん。
107デフォルトの名無しさん
2022/02/22(火) 13:46:45.07ID:G6nBeheJ ほら何もかも要件の問題だろ?w 馬鹿なんだよ質問者がw
108デフォルトの名無しさん
2022/02/22(火) 16:11:10.10ID:BY2+Ruab 馬鹿が馬鹿を笑う地獄絵図
109デフォルトの名無しさん
2022/02/22(火) 21:29:07.28ID:3uW2JHvs 質問のレベルが低くて恐縮ですが、クラスにおいてメンバ変数は各インスタンスに対してメモリが確保されますが、メンバ関数も各インスタンス毎にメモリ確保されるんでしたっけ?
メンバ関数はクラスで共有されるんでしたっけ?
メンバ関数はクラスで共有されるんでしたっけ?
110デフォルトの名無しさん
2022/02/22(火) 21:44:13.67ID:G9HkpoRr 共有されてて、呼び出すときにインスタンスのポインタが渡ります。
111デフォルトの名無しさん
2022/02/22(火) 21:53:10.29ID:aBkA6PYf112デフォルトの名無しさん
2022/02/22(火) 22:27:23.48ID:Ui5AoFrq113デフォルトの名無しさん
2022/02/22(火) 22:27:30.88ID:Ui5AoFrq114デフォルトの名無しさん
2022/02/22(火) 22:31:03.90ID:Ee0G2C5Q main(exe)とlib(dll)の両方から参照されるクラスHoge(非dll・シングルトン)のインスタンスをmainとlibで共用する方法はないですか。
軽く調べてみたらHogeをdll化するかHogeのラッパーdllを作れと出てきたのですが
作らなくても実現出来る方法があれば教えてください
軽く調べてみたらHogeをdll化するかHogeのラッパーdllを作れと出てきたのですが
作らなくても実現出来る方法があれば教えてください
115デフォルトの名無しさん
2022/02/22(火) 22:31:52.69ID:Ee0G2C5Q main(exe)とlib(dll)の両方から参照されるクラスHoge(非dll・シングルトン)のインスタンスをmainとlibで共用する方法はないですか。
軽く調べてみたらHogeをdll化するかHogeのラッパーdllを作れと出てきたのですが
作らなくても実現出来る方法があれば教えてください
軽く調べてみたらHogeをdll化するかHogeのラッパーdllを作れと出てきたのですが
作らなくても実現出来る方法があれば教えてください
116デフォルトの名無しさん
2022/02/22(火) 22:32:39.84ID:SYhqe6to virtualも継承されたクラスごとにポインタサイズの隠しフィールドができるだけで
virtual関数が増えてもクラスサイズは変わらないんじゃ?
virtual関数が増えてもクラスサイズは変わらないんじゃ?
117デフォルトの名無しさん
2022/02/22(火) 22:38:55.24ID:SYhqe6to118デフォルトの名無しさん
2022/02/22(火) 22:39:30.53ID:G6nBeheJ ポインタサイズじゃないよ
119デフォルトの名無しさん
2022/02/22(火) 22:39:57.82ID:SYhqe6to static変数じゃねーわ inline変数
120デフォルトの名無しさん
2022/02/23(水) 01:56:47.51ID:vCUIsgzX 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側にインスタンスの定義が入る。
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側にインスタンスの定義が入る。
121デフォルトの名無しさん
2022/02/23(水) 09:00:40.51ID:stefKGxD ヒント: 仮想継承
122デフォルトの名無しさん
2022/02/23(水) 13:46:51.78ID:UVDZkpPA >>96
そうだねミューテックス使うね
そうだねミューテックス使うね
123デフォルトの名無しさん
2022/02/23(水) 13:49:09.36ID:UVDZkpPA Windowsなら名前付きミューテックスでファイルのオープンからクローズまでを排他するところやが
C++の標準規格でどうなっているのかわ知らん、
C++の標準規格でどうなっているのかわ知らん、
124デフォルトの名無しさん
2022/02/23(水) 14:13:27.06ID:UVDZkpPA 複数のプロセスから同一ファイルに書き込んで書き込み内容の順序(位置)を制御する方法は
1. プロセス間の同期側で順序を担保する(イベント等による通信を併用
2. ファイルのアクセス権を握ったプロセスがファイルの中身を読んで書き込み位置を決める
3. ファイルのアクセス権を握ったプロセスがファイルを追記オープンして単純に追記していく
の大きく分けて3つの方法が取れる
普通は3が多いという印象 ※ 個人の感想です
辞書化とかが必要なら専用のプロセスが適宜ファイルのアクセス権を獲得してやったらええ、
1. プロセス間の同期側で順序を担保する(イベント等による通信を併用
2. ファイルのアクセス権を握ったプロセスがファイルの中身を読んで書き込み位置を決める
3. ファイルのアクセス権を握ったプロセスがファイルを追記オープンして単純に追記していく
の大きく分けて3つの方法が取れる
普通は3が多いという印象 ※ 個人の感想です
辞書化とかが必要なら専用のプロセスが適宜ファイルのアクセス権を獲得してやったらええ、
125デフォルトの名無しさん
2022/02/23(水) 14:58:09.38ID:lSALbkfN ちょっと処理が重なったくらいでデータが消えるようなコンピュータはまともに動かんと思うよ
126デフォルトの名無しさん
2022/02/23(水) 15:17:24.74ID:A1VwjaQk そんなアホなことせんでもOSが同期取ってくれるやろ…
127デフォルトの名無しさん
2022/02/23(水) 15:43:04.84ID:vCUIsgzX >>122-126
2日前からアホ質問者不在のまま要件不明案件でお蔵入りした質問を今更ほじくり返して質問者本人ですか?w
2日前からアホ質問者不在のまま要件不明案件でお蔵入りした質問を今更ほじくり返して質問者本人ですか?w
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… [BFU★]
- 【中国外務省】日中関係悪化は高市氏に責任と名指しで非難… ★2 [BFU★]
- 外務省局長は無言で厳しい表情…日中の高官協議終了か 高市首相“台湾”発言で中国が強硬対応 発言撤回求めたか…★2 [BFU★]
- 小野田紀美・経済安保担当相「何か気に入らないことがあればすぐに経済的威圧をする国への依存はリスク」 [Hitzeschleier★]
- 政府、株式の配当など金融所得を高齢者の医療保険料や窓口負担に反映する方針を固めた [バイト歴50年★]
- 【維新】吉村知事「中国人観光客だけに頼るビジネスモデル変えていかないといけない」「高市総理の発言は撤回する必要はない」 [Hitzeschleier★]
- 中国高官と話す外務省局長の表情、やばい ★2 [175344491]
- 中国高官と話す外務省局長の表情、やばい [175344491]
- 港区、中国に宣戦布告 中国外務省をおちょくる掲示物を展示 [175344491]
- 【ほんこん悲報】吉本新喜劇の中国公演が中止に! [523957489]
- 中国外務省「日中関係の悪化は高市早苗首相が原因」と名指しで強く非難。キタ━(゚∀゚)━! [153490809]
- 小野田経済安保相「すぐに経済的威圧するところへの依存はリスク」😲 [861717324]
