22/02/19 11:56:42.14 kSnJ/KwP.net
前スレ
C++相談室 part158
スレリンク(tech板)
2:デフォルトの名無しさん
22/02/19 12:05:32.96 b+8HD1Ua.net
C(チンチン)+(プラ)+(プラ)
3:デフォルトの名無しさん
22/02/19 13:32:43.00 rSu4VNCf.net
アセンブリとかC言語だと「この操作はするな」ってのを簡単には禁止できないからね
許可されてる(コンパイラから怒られない)操作が増えるとその分だけ不正解のコードを書くリスクが高くなる
structのこのフィールドは排他制御してから変更してねってのをC言語じゃ簡単には強制できんだろ
C++ならgetter作ればいいだけなのに
4:デフォルトの名無しさん
22/02/19 13:38:43.35 2h4SA+VW.net
>>1乙
>>1000は宣言に従うこと
>>3
それぐらいはC程度の高水準言語であればギリ保証できる
クラスFooに対するgetterやsetterを経由しないアクセスを
Fooの構造体メンバ名を変えたときビルドエラーとして確実にあぶりだせる
ように書くことはFooを書く人の一存で一応できる
5:デフォルトの名無しさん
22/02/19 13:52:37.43 2h4SA+VW.net
カプセル化が簡単にできるというのと、
オブジェクトC := オブジェクトA + オブジェクトB
オブジェクトE = オブジェクトC * オブジェクトD
...
ここで:=は生成、+や*はなんらかのメッセージ(メソッド)
このようにオブジェクトからオブジェクトを作る、的な、
基本単位がオブジェクトなプログラミング環境が維持されないのは
オブジェクト指向プログラミングしているうちに入らないと
思うんですよねー(棒
6:デフォルトの名無しさん
22/02/19 15:57:04.56 ymxofDah.net
format.hを待ってますた
7:デフォルトの名無しさん
22/02/19 15:59:32.57 lVeS0ElI.net
>>3
でもそのC++からCを見て不正解のコードを書くリスクが高くなるという話がそのまま
RustからC++を見た場合も当てはまってしまうよな
Rustコンパイラならメモリ安全やデータ競合に問題がある操作をエラーで拒否するのにC++はなぜ許して致命的バグを生み出してしまうのだろう、と
8:デフォルトの名無しさん
22/02/19 17:53:08.72 kSnJ/KwP.net
無関係過ぎる
元はアセンブラ必須という人が書き込みがあったので、C++のコンパイラ(gcc)がSIMDを吐く条件についての話をしたんだが・・・
それについては正解できる人や惜しい人すら皆無で、馬鹿がC++全然関係ないOOの話を引っ張ってきて、今じゃC++と無縁な宇宙の話になっている
9:デフォルトの名無しさん
22/02/19 18:09:20.91 x/upE6G9.net
自分でこんなレスしといて今更何言ってるんだかw
> 組み込み機器用のCPUって特殊なんで、コンパイラが安定しないなんてよくある話
> オブジェクト指向のメリットの本質についての話なので、可能/不可能が実装言語に依存しないというのもよくある話(楽かどうかは別)
> 別に昭和でも平成でも令和でも変わってないけど、>> 991に伝わってないのは確か
10:デフォルトの名無しさん
22/02/19 18:26:04.31 kSnJ/KwP.net
馬鹿がID変えてまた登場
11:デフォルトの名無しさん
22/02/19 18:50:37.51 mDQ0X8WX.net
明示的にはSSEコンパイラ組み込み関数を使えば実現できるけど、多くのコンパイラはシングルレーンのループの一部を自動的にベクトル化してくれるのね
コンパイラが暗黙的なベクトル化をしてくれる条件ってシングルレーン以外に何があるんだろ
12:デフォルトの名無しさん
22/02/19 19:09:18.39 x/upE6G9.net
>>10
顔真っ赤じゃんw
13:デフォルトの名無しさん
22/02/19 19:43:50.83 kSnJ/KwP.net
その問題はもう答え書いた
14:デフォルトの名無しさん
22/02/19 20:38:46.85 x/upE6G9.net
恥の上塗りかよw
答えを書いたとか関係ないだろ
> 馬鹿がC++全然関係ないOOの話を引っ張ってきて
に乗っといて何言ってるんだよ
15:デフォルトの名無しさん
22/02/19 21:13:10.67 kSnJ/KwP.net
可哀想な馬鹿が勘違いしてるみたいだからちゃんと書いておくと、>>13は>>11へのレスな
16:デフォルトの名無しさん
22/02/19 21:45:03.99 x/upE6G9.net
人をバカにしても恥ずかしいレスは消えないよw
17:デフォルトの名無しさん
22/02/20 02:19:28.36 c79emsKu.net
>>7
実際そうだよ
生のポインタを使ってる限りはどこに所有権があるか自分で管理するしかない
Rustの考え方はC++使いからすれば羨ましいわ
18:デフォルトの名無しさん
22/02/20 05:27:00.10 aLhaBLLn.net
けんかをやめて ふたりを止めて
わたしのために 争わないで
19:デフォルトの名無しさん
22/02/20 09:25:04.73 JXXbW9ML.net
きみC#さんだよね
20:デフォルトの名無しさん
22/02/20 10:18:23.47 c+ifp9sQ.net
>>17
だからスマポで出来るやん、それ
てか欧米産の大手ゲームの解析なんかしてると普通に向こうもスパゲッティコードだらけだけどな
なんだかんだで力技ゴリ押し開発になっちゃうんだよ結局
21:デフォルトの名無しさん
22/02/20 10:23:29.96 mD/m0vxj.net
ゲームはハード性能をゴリゴリに引き出すのが正義だからスマポ程度のオーバーヘッドでも許容できないんよ
22:デフォルトの名無しさん
22/02/20 10:30:30.73 c+ifp9sQ.net
>>21
いや俺もゲーム開発しとるけどスマポどころかGC任せにするのがもうここ10年くらいは主流だぞ?(最終的にはネイティブ化されるけどそれでもゼロオーバーヘッドになる訳では全くない)
23:デフォルトの名無しさん
22/02/20 10:31:03.74 hF9eBvbm.net
え?
ゲームでもスマートポインタは普通に使うよ
24:デフォルトの名無しさん
22/02/20 10:36:14.20 mD/m0vxj.net
ああ、ゲームって最新の3Dグリグリのやつな(欧米の大手って言うからそっち想像しちゃった)
スマホゲーやブラウザゲーはまた別よ
25:デフォルトの名無しさん
22/02/20 10:37:11.73 c+ifp9sQ.net
>>24
タルコフ見て同じ事言える?
26:デフォルトの名無しさん
22/02/20 10:40:48.26 hF9eBvbm.net
ID:mD/m0vxj は知ったかぶりだね
なんのためにC++相談室スレにデタラメを書き込んでるの?
27:デフォルトの名無しさん
22/02/20 10:43:58.31 h6G+3sJT.net
共用体が良くわからないのですが、同じメモリーアドレスを複数のメンバで共用するとは
どういうことなのでしょうか?
メモリの節約と書いてあるのですが、よくわかりません。
同じ型の共用体が複数あったときに使ってないメンバ変数が勝手に消されるなんてわけないですよね
どなたか共用体と構造体の違いを教えていただければ幸いです。
(まだクラスについての知識はほとんどないです。)
28:デフォルトの名無しさん
22/02/20 10:51:16.26 lvHr33WL.net
PODで型変換するくらいしか使わんのでは
29:デフォルトの名無しさん
22/02/20 10:53:23.74 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:デフォルトの名無しさん
22/02/20 10:55:47.01 h6G+3sJT.net
え!?メモリの節約ができるの!?
でも・・・制限があるんでしょ?
って感じで気になるのです。
ただ、基底クラスとか継承っていうのがわからないんだけど、
クラスについての記述がもう少し先にあるから、まだクラスの部分について読みたくない
、クラスを学んでから共用体について学んだほうが良いのでしょうか?
31:デフォルトの名無しさん
22/02/20 10:56:42.82 h6G+3sJT.net
>>29
ありがとうございます今すぐ読みます
32:デフォルトの名無しさん
22/02/20 11:01:01.36 mD/m0vxj.net
そのレベルなら共用体なんて使わないし使うべきじゃないから読み飛ばしていいよ
一通り学習してから戻ってきな
33:デフォルトの名無しさん
22/02/20 11:02:54.57 c+ifp9sQ.net
>>30
別に直接的にメモリの節約が出来る訳ではない
>>29の例で言った通り、一つのデータに対して複数の名前を付けるだけの話なのでデータは結局一つしか同時には入れられない
なんか実用的な例ありそうだけどunionはC++だとそんな使わないし積極的に使うべきでもないからすぐには思い浮かばない
34:デフォルトの名無しさん
22/02/20 11:15:09.90 5KrZlkth.net
variantとかは中身は共用体だった気がする
35:デフォルトの名無しさん
22/02/20 11:16:50.11 uUEkIMOM.net
>>27
例えばスクリプト言語みたいに色んな型が入る変数を定義したい時に
struct {
char c;
int i;
double d;
};
みたいにするとdを使ってる時はc, iの領域が無駄だよね、そういう時に
union {
char c;
int i;
double d;
};
のようにすると領域が無駄にならない
36:デフォルトの名無しさん
22/02/20 11:24:25.42 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:デフォルトの名無しさん
22/02/20 11:25:50.54 h6G+3sJT.net
>>35
ありがとうございます。ちなみにその仕組みとかって・・・聞けたりとか・・・
38:デフォルトの名無しさん
22/02/20 11:26:58.89 h6G+3sJT.net
structだと4byte無駄になるのですね。
39:デフォルトの名無しさん
22/02/20 11:28:36.50 h6G+3sJT.net
何となくなのですが、構造体だと
メンバの中で一番大きな変数のサイズ*メンバの数
分の領域が確保されるのかな?って思ってみたりしています。
40:デフォルトの名無しさん
22/02/20 11:35:01.82 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:デフォルトの名無しさん
22/02/20 11:39:14.94 c+ifp9sQ.net
>>40
これがstructだとちゃんと4+8で12byteの構造体となる(アラインメントって概念によりそうでない事もあるけどそれはまた別で勉強したほうがいい)
test1 = 0x5;
test2 = 0x2410000000000007;
structだとさっきと同じ事をしてもtest1とtest2でメモリは共用されておらずそれぞれ独立しているため、test1は0x5、test2は0x2410000000000007となる
42:デフォルトの名無しさん
22/02/20 11:41:34.03 h6G+3sJT.net
>>40
ありがとうございます。
すごいっす、メチャすごいっす。
あまりの喜びに敬語忘れてすみません。
"共用”なのですね。
ってことは共用体はいくつかメンバ変数を用意しておいて、一個だけ使なら使ってもいいよ。
しかも、いちばん最後に代入された値が採用されるよと言うことで大丈夫でしょうか?
43:デフォルトの名無しさん
22/02/20 11:42:49.02 5KrZlkth.net
ポイントだけ聞くようにして全部聞こうとすんなアホ
44:デフォルトの名無しさん
22/02/20 11:50:02.29 hF9eBvbm.net
そもそもC++スレ
45:デフォルトの名無しさん
22/02/20 11:52:56.02 h6G+3sJT.net
>>40
おかげさまで何とか理解できました。
自分の書いた上の記述(>>41)もちょっと違ってたような気がするけど
まぁ置いておいて・・・。
本当にありがとうございます。
46:デフォルトの名無しさん
22/02/20 11:53:19.65 lvHr33WL.net
共用体とビットフィールドでウハウハよ
47:デフォルトの名無しさん
22/02/20 12:26:21.52 8UrVWzFH.net
>>20
スマートポインタを徹底すればできるが記述量が結構増えるのよ
結局面倒臭くなって使わなくなってしまった
48:デフォルトの名無しさん
22/02/20 12:30:45.48 8UrVWzFH.net
共用体はデータ量をケチる目的では使わんでしょ
(マイコンとかバイナリデータとかの)データの配置順に意味があるやつとの相互運用にしか使ったことないぞ
union A{
struct{ char low; char high;};
short data;
};
union B{
struct { int head; double body;};
char data[12];
};
49:デフォルトの名無しさん
22/02/20 12:31:01.23 VFmEI3Uz.net
スマポは使えば楽できるときと
そうでないときがあるからな
見境のないスマポ厨はただのマゾ
50:デフォルトの名無しさん
22/02/20 12:38:44.84 BLiyeQro.net
>>48
大量に確保するデータの場合1バイト2バイトが大きく影響することもあるから、データ量目的でも使うよ
51:デフォルトの名無しさん
22/02/20 12:38:51.77 5nwqcAs1.net
参照オブジェクトを処理するのに
何故か内部でスマポ使いだしたとしたら
予めそいつの代わりに謝っておいてやろう。スマポ。
52:デフォルトの名無しさん
22/02/20 12:40:31.26 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:デフォルトの名無しさん
22/02/20 12:44:49.03 BLiyeQro.net
sjis/utf8、utf16、utf32を一緒くたに扱う文字列クラスを作った時にそれぞれの型のポインタを共用体で持たせたな
キャストするより楽だったからw
54:デフォルトの名無しさん
22/02/20 12:49:58.81 EDNjM2Vr.net
>>48
それはお前の経験が足らんだけ
>>34が言うようなケースでも使うよ
55:デフォルトの名無しさん
22/02/20 13:44:10.67 MjuaBSm2.net
>>51
これ何であかんの?
56:デフォルトの名無しさん
22/02/20 13:59:07.64 uAn4231w.net
>>36
アセンブラでアライン覚えて来い青二才
57:デフォルトの名無しさん
22/02/20 15:04:19.29 aLhaBLLn.net
共用体使うとシフト演算しなくていいし、
最近のCPU(っても20年まえぐらい)から1ビット操作命令もあるし、パフォーマンスがいいと思うぜ
58:デフォルトの名無しさん
22/02/20 18:12:12.24 8IAIbIwN.net
>>54
std::variant見てきた
ただのunionラップクラスじゃねーか
59:デフォルトの名無しさん
22/02/20 19:01:05.55 uUEkIMOM.net
>>58
> ただのunionラップクラスじゃねーか
それの何が不満なんだよw
60:デフォルトの名無しさん
22/02/20 21:42:58.02 8IAIbIwN.net
ただのunionラッパーをunionの活用例かのような言い方をした >>54 に対する不満だ
61:デフォルトの名無しさん
22/02/20 21:47:59.16 uAn4231w.net
米大統領と密談した「IQ1200の金星人」ヴァリアント・ソーとは ...
62:デフォルトの名無しさん
22/02/20 22:02:46.59 uUEkIMOM.net
>>60
意味わからんw
ラッパーだと活用例じゃないとでも?
63:デフォルトの名無しさん
22/02/20 22:37:27.22 V67/tnWS.net
スマポの記述量が長い問題って皆どうしてんの?
64:デフォルトの名無しさん
22/02/20 22:52:41.23 uSEnVnLU.net
C++のstd::variantとほぼ近い、
Rustのenum(=格納付きenum=タグ付きunion)を比べると
圧倒的にRustのenumが使いやすくてRust言語の核心部分となっていることからもわかるように
C++ではその分野の言語サポートが弱いんだよな
65:デフォルトの名無しさん
22/02/20 22:54:00.38 uSEnVnLU.net
>>63
その件もRustが上手いことやってるよな
66:デフォルトの名無しさん
22/02/20 23:01:58.00 V67/tnWS.net
>>65
そうなのか
正直あんまり触ったことないんだが、そういう話なら触ってみようかな
67:デフォルトの名無しさん
22/02/20 23:24:26.58 5KrZlkth.net
Rustのことはスレ
68:違いだけど、言語機能としてどこまでサポートするかは、分かりやすさと直結してると思う C++のstd::variantの方が分かりやすいと思う人もいれば Rustのenumの方が分かりやすいと思う人もいると思う
69:デフォルトの名無しさん
22/02/20 23:44:12.87 Y4d5gioW.net
>>67
C++には十分なパターンマッチング機構がないからタグ付き共用体(Rustではenum)を便利に生かせないのが大きい
C++よりRustは記述がしやすいと言われている原因の大きな一つとなっている
70:デフォルトの名無しさん
22/02/20 23:47:42.47 5KrZlkth.net
ほんとに馬鹿ばかりだな・・・
そんな話はしてないしスレ違いだと言ってるだろ・・・
スレリンク(tech板)
71:デフォルトの名無しさん
22/02/20 23:59:35.38 uSEnVnLU.net
>>52で主にメモリ節約が目的と言っているようだが
それはC++の言語によるサポートが貧弱すぎるための特殊な悲惨な状況であって
他の言語ではむしろvariantこそがプログラミングの中心、という話ではないか
72:デフォルトの名無しさん
22/02/21 00:04:14.70 NpsKB2au.net
馬鹿には分からないかもしれないけど、嫌なら自分で作ればいいという世界なんだよ
73:デフォルトの名無しさん
22/02/21 00:06:46.53 Jx3FjySw.net
昔は全部ゼロから作ってたな
74:デフォルトの名無しさん
22/02/21 00:10:21.16 lBTJyZA6.net
>>71
それは無理
様々な言語がなぜ言語レベルでパターンマッチングなどをサポートとしているかというと
言語レベルでサポートしないと無理なことが多数あるため
C++しか書いたことがない特殊な人でなければこれを理解することができる
75:デフォルトの名無しさん
22/02/21 00:12:34.69 NpsKB2au.net
スレリンク(tech板)
76:デフォルトの名無しさん
22/02/21 00:19:21.75 NpsKB2au.net
ところで>>52の
> ところで↓でコメントにしてるエラーはなんか悔しくない?どうしてこういう仕様なんだろう?
への回答はないの?
77:デフォルトの名無しさん
22/02/21 01:59:03.04 dmBIFY6O.net
&s::aの型がint s::*な以上s::aの型はintにはならんからじゃない?
sizeofだけ許されてるのがわからん
78:デフォルトの名無しさん
22/02/21 02:21:18.10 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:デフォルトの名無しさん
22/02/21 08:22:55.36 QJQOoC8g.net
PPoEのことピッポエって読んでたらめっちゃバカにされてくやしいです。
どうしたらいいですか?
80:デフォルトの名無しさん
22/02/21 08:24:57.39 wtPLXwv8.net
ボコしたら?
81:デフォルトの名無しさん
22/02/21 19:45:02.12 K+YQY1en.net
複数のプロセスから同時に同じファイルに書き込むにはどうすればいいですか?
ofstreamで実験(a.exeとb.exeを同時に起動して、同じtxtに10行ずつ書き込み)してみましたが、
a.exeで書き込んだ内容が10行並んだ後に、b.exeで書き込んだ内容が10行並ぶような結果になりました。
書き込んだ順に並ぶようにするにはどうすればいいですか?
82:デフォルトの名無しさん
22/02/21 19:50:32.28 NpsKB2au.net
OS固有の方法を使え
83:デフォルトの名無しさん
22/02/21 19:56:04.55 gBEocJIs.net
fprintf()とかの標準ライブラリだとcloseかflushするまで書き込みは反映されない
書き込みのタイムスタンプ順を保証するとなるとかなり面倒くさい
毎回flushするとかcloseするとかしないといけない
書き込んだ内容がもう一方のプロセスに上書きされて消えたりとかの問題も出てくる
84:デフォルトの名無しさん
22/02/21 20:03:35.84 K+YQY1en.net
ありがとうございます。
保証とまでは求めてなくて、だいたい秒オーダー程度の順でぱっと見の違和感なければいいかなと思っていますのでひとまずflushを入れて実験してみます。
(多少の順番ずれは問題ないですが、上書き消滅だけは絶対問題なので)
85:デフォルトの名無しさん
22/02/21 20:06:09.78 9Efuu0ky.net
ロックしろ
86:デフォルトの名無しさん
22/02/21 20:08:56.82 Hi57Ra7S.net
・別々のファイルに吐き出しておいて後からマージ(リアルタイム性不要なら一番楽)
・書き込みの時に毎回排他ロックする(くそ遅い、書き込みが稀ならあり)
・書き込み専門のプロセスを設けてプロセス間通信(正しいけどめんどくさい)
87:デフォルトの名無しさん
22/02/21 20:22:59.51 M/x1eSML.net
>>80
書き込みプロセスを集約した方が制御はしやすいわ
88:デフォルトの名無しさん
22/02/21 21:24:26.76 NpsKB2au.net
こんなC++erばかりではもうダメだな・・・・
質問は最悪だけど、確認も回答もやばい
混ざった行が出来たり上書き消滅する日がいつか来る
89:デフォルトの名無しさん
22/02/21 21:47:29.24 2lTMmgDc.net
>>87
ロックを使っても行が混ざるのかーすごいなー
90:デフォルトの名無しさん
22/02/21 21:55:16.21 Gf4lGfIx.net
ロックの仕方によるから
極論文字単位にロックしたら混ざるし
91:デフォルトの名無しさん
22/02/21 22:05:20.94 NpsKB2au.net
真面目に相手をするなら、質問の前提を明確にしないといけないから。
聞きたいことだけ書いてきて、状況が全く分からない質問に対して、あれこれ書いても意味はなく、最初にしないといけないのはまず確認。
環境やら現象やら具体的なコード、最終的なゴールがどこか、当たり前のモノが全て抜けていて、未だに8割方見えていない。
92:デフォルトの名無しさん
22/02/21 22:27:52.22 2lTMmgDc.net
質問に対して状況を確認せず真っ先に>>81で抜けてる回答してる君がいうと説得力があるね
93:デフォルトの名無しさん
22/02/21 22:40:17.44 NpsKB2au.net
あれはいつものWIN32APIスレへの誘導しか意味してないw
.exeが出て来た時点で萎える
94:デフォルトの名無しさん
22/02/21 23:11:26.10 Vo68A3hI.net
同時には無理やろ~
95:デフォルトの名無しさん
22/02/21 23:17:32.27 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:デフォルトの名無しさん
22/02/21 23:19:40.75 NpsKB2au.net
書き忘れた。異常系なし。
97:デフォルトの名無しさん
22/02/22 08:35:20.17 4AnTGrM3.net
セマフォかミューテックス使えばいいだけやん
98:デフォルトの名無しさん
22/02/22 08:52:30.71 uvLrfhT4.net
偉そうなこと言っといて>>83の上書き禁要件ガン無視してるのは草
99:デフォルトの名無しさん
22/02/22 08:56:43.07 vnxKrxaR.net
消滅って実際あるもんかね?
unix系はなさそうな気がする
100:デフォルトの名無しさん
22/02/22 10:16:04.97 fFHtSmjB.net
標準ライブラリの仕様で上書き消滅しないって保証されてれば問題ない
保証されてなければ20プロセスぐらいからchrono::system_clockのタイムスタンプとloopcountを出力させる負荷テストしてみて判断するしかない
101:デフォルトの名無しさん
22/02/22 10:38:46.92 3Vwbzil/.net
>>99
> 保証されてなければ20プロセスぐらいからchrono::system_clockのタイムスタンプとloopcountを出力させる負荷テストしてみて判断するしかない
バカなの?
普通に排他制御すればいいだけだろ
102:デフォルトの名無しさん
22/02/22 12:32:42.83 G6nBeheJ.net
俺は最初にWIN32APIスレへの誘導の意味で、OS固有の方法と書いてるよw ソースコードは回答ではなく、本来質問時に提示されるべき叩き台を俺がわざわざ書いただけw
ソースコードが分からないアホ向けに説明しておくと、OSに書き込みが発生するのは実際にファイルに書き込むAPIを叩いたとき(/システムコールかそれに準ずるものを呼んだ時(以下略))なので、それはバッファをフラッシュするタイミングになる。
それが発生するのは普通fに文字列を書き込むときバッファが溢れるかendlの呼び出し中(ライブラリの実装に依存する)。
文字列の長さがバッファから溢れない限り、endl中のAPI呼出が重なるかどうかが問題になる。
各プロセスでAPI呼出が運悪く重なった場合、ここからは一度に書き込まれる量と、OSのファイルシステム実装に依存するが、 混ざった行が出来たり上書き消滅する可能性が生まれる。
それが問題な場合は、主にOS固有の方法でIPCかファイルロックを行う必要がある。
なお要件が明確でない状態で何かを言う必要は全くないw
103:デフォルトの名無しさん
22/02/22 13:18:13.18 /94dJWyd.net
グダグタと意味不明な長文書いておいて
> なお要件が明確でない状態で何かを言う必要は全くないw
って笑いでも取ろうとしてるのか?
104:デフォルトの名無しさん
22/02/22 13:22:26.14 uHuVwSWm.net
> 複数のプロセスから同時に同じファイルに書き込む
> 書き込んだ順に並ぶようにするには
同時に書き込んでるのに書き込んだ順が決まるわけないやろ~
105:デフォルトの名無しさん
22/02/22 13:30:20.16 Xp3JBKU/.net
何したいのか知らないけど>>85で出てるようにタイムスタンプ付けて別のファイルとして書き出した後、
メモリ上でマージするなり第三のプロセスでマージしたファイルを書き出すなりするのが一番楽だな
106:デフォルトの名無しさん
22/02/22 13:33:11.97 /94dJWyd.net
>>103
秒オーダーで揃ってりゃいいって話だから多少の前後は気にすんな
107:デフォルトの名無しさん
22/02/22 13:39:15.40 uHuVwSWm.net
ファイルOpenして書き込んですぐCloseするだけやん。
108:デフォルトの名無しさん
22/02/22 13:46:45.07 G6nBeheJ.net
ほら何もかも要件の問題だろ?w 馬鹿なんだよ質問者がw
109:デフォルトの名無しさん
22/02/22 16:11:10.10 BY2+Ruab.net
馬鹿が馬鹿を笑う地獄絵図
110:デフォルトの名無しさん
22/02/22 21:29:07.28 3uW2JHvs.net
質問のレベルが低くて恐縮ですが、クラスにおいてメンバ変数は各インスタンスに対してメモリが確保されますが、メンバ関数も各インスタンス毎にメモリ確保されるんでしたっけ?
メンバ関数はクラスで共有されるんでしたっけ?
111:デフォルトの名無しさん
22/02/22 21:44:13.67 G9HkpoRr.net
共有されてて、呼び出すときにインスタンスのポインタが渡ります。
112:デフォルトの名無しさん
22/02/22 21:53:10.29 aBkA6PYf.net
>>109
通常のメンバ関数の実体はそのクラスで1つ(共有される)でインスタンスのメモリ領域は消費しないが、
virtual関数はオーバーライド動作のためにインスタンスにポインタが確保される
113:デフォルトの名無しさん
22/02/22 22:27:23.48 Ui5AoFrq.net
>>111
ありがとうございます!
virtualはともかくメンバ関数を書く際にあまりその点は気にしなくてよさそうですね、安心しました
114:デフォルトの名無しさん
22/02/22 22:27:30.88 Ui5AoFrq.net
>>111
ありがとうございます!
virtualはともかくメンバ関数を書く際にあまりその点は気にしなくてよさそうですね、安心しました
115:デフォルトの名無しさん
22/02/22 22:31:03.90 Ee0G2C5Q.net
main(exe)とlib(dll)の両方から参照されるクラスHoge(非dll・シングルトン)のインスタンスをmainとlibで共用する方法はないですか。
軽く調べてみたらHogeをdll化するかHogeのラッパーdllを作れと出てきたのですが
作らなくても実現出来る方法があれば教えてください
116:デフォルトの名無しさん
22/02/22 22:31:52.69 Ee0G2C5Q.net
main(exe)とlib(dll)の両方から参照されるクラスHoge(非dll・シングルトン)のインスタンスをmainとlibで共用する方法はないですか。
軽く調べてみたらHogeをdll化するかHogeのラッパーdllを作れと出てきたのですが
作らなくても実現出来る方法があれば教えてください
117:デフォルトの名無しさん
22/02/22 22:32:39.84 SYhqe6to.net
virtualも継承されたクラスごとにポインタサイズの隠しフィールドができるだけで
virtual関数が増えてもクラスサイズは変わらないんじゃ?
118:デフォルトの名無しさん
22/02/22 22:38:55.24 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:デフォルトの名無しさん
22/02/22 22:39:30.53 G6nBeheJ.net
ポインタサイズじゃないよ
120:デフォルトの名無しさん
22/02/22 22:39:57.82 SYhqe6to.net
static変数じゃねーわ inline変数
121:デフォルトの名無しさん
22/02/23 01:56:47.51 vCUIsgzX.net
URLリンク(godbolt.org)
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:デフォルトの名無しさん
22/02/23 09:00:40.51 stefKGxD.net
ヒント: 仮想継承
123:デフォルトの名無しさん
22/02/23 13:46:51.78 UVDZkpPA.net
>>96
そうだねミューテックス使うね
124:デフォルトの名無しさん
22/02/23 13:49:09.36 UVDZkpPA.net
Windowsなら名前付きミューテックスでファイルのオープンからクローズまでを排他するところやが
C++の標準規格でどうなっているのかわ知らん、
125:デフォルトの名無しさん
22/02/23 14:13:27.06 UVDZkpPA.net
複数のプロセスから同一ファイルに書き込んで書き込み内容の順序(位置)を制御する方法は
1. プロセス間の同期側で順序を担保する(イベント等による通信を併用
2. ファイルのアクセス権を握ったプロセスがファイルの中身を読んで書き込み位置を決める
3. ファイルのアクセス権を握ったプロセスがファイルを追記オープンして単純に追記していく
の大きく分けて3つの方法が取れる
普通は3が多いという印象 ※ 個人の感想です
辞書化とかが必要なら専用のプロセスが適宜ファイルのアクセス権を獲得してやったらええ、
126:デフォルトの名無しさん
22/02/23 14:58:09.38 lSALbkfN.net
ちょっと処理が重なったくらいでデータが消えるようなコンピュータはまともに動かんと思うよ
127:デフォルトの名無しさん
22/02/23 15:17:24.74 A1VwjaQk.net
そんなアホなことせんでもOSが同期取ってくれるやろ…
128:デフォルトの名無しさん
22/02/23 15:43:04.84 vCUIsgzX.net
>>122-126
2日前からアホ質問者不在のまま要件不明案件でお蔵入りした質問を今更ほじくり返して質問者本人ですか?w
129:デフォルトの名無しさん
22/02/23 15:53:59.19 A1VwjaQk.net
頓珍漢な回答して相手にされないからっておれに当たるなよ。
130:デフォルトの名無しさん
22/02/23 16:03:22.40 vCUIsgzX.net
回答してないけどw >>122-126は全て本人確定かなw
131:デフォルトの名無しさん
22/02/23 16:04:56.99 A1VwjaQk.net
>>129 >120
132:デフォルトの名無しさん
22/02/23 16:14:02.97 vCUIsgzX.net
>>130
>>120も回答じゃないけどw
133:デフォルトの名無しさん
22/02/23 16:42:08.43 lSALbkfN.net
126と86は俺だけど…
134:デフォルトの名無しさん
22/02/23 16:45:52.89 UVDZkpPA.net
>>126
kwsk
複数プロセスから同一ファイルに対する同時書き込みオープンは当然できなず、後から開こうとしたプロセスはオープンに失敗する
その場合失敗したプロセスは(エラー要因を調べた上で)一定時間(例えばT秒後)後にオープンを再トライする必要がある
んまーそう作っても良いが(ファイルアクセス権獲得待ちをいつでも簡単にやめられるメリットがある)が、
失敗の度にT秒消費するというのをミューテックスを使えば短縮できる
135:デフォルトの名無しさん
22/02/23 16:51:07.27 A1VwjaQk.net
オープン失敗したら100ms開けてリトライで十分だろう。待機が嫌なら非同期で実装するだけ。
T秒消費するというが同期オブジェクト使っても変わらん。
136:デフォルトの名無しさん
22/02/23 16:54:41.39 UVDZkpPA.net
>>134
>T秒消費するというが同期オブジェクト使っても変わらん。
間違い。
同期オブジェクトを使えばプロセスAがファイルへのアクセス権を行使中、
プロセスBがアクセス権が回ってくるのを待っている状態で
プロセスAがアクセス権を放棄した瞬間にプロセスBにディスパッチされる
ことが気体できる
無駄というものが最小限で済む
137:デフォルトの名無しさん
22/02/23 16:58:57.65 lSALbkfN.net
同期オブジェクトってそんな低レベルで存在しとる概念なのかね
138:はちみつ餃子
22/02/23 17:06:44.05 o4j3GXmb.net
同期オブジェクトを機能させるためにスケジューラに負担をかけるので
待機時間が特に短いことがわかってるならスピンロックのほうが性能は出る可能性はある。
でもスピンロックを正しく実装できる気がしない。
同期のための仕組みを用意してくれてるんだからそれを使っておくのが基本的には楽だよ。
待機時間 100ms のところを 10ms とかに短縮できたところでなんだというんだ。
それが必要な場合もあるといえばあるけど、どちらがより良いかは状況による。
139:デフォルトの名無しさん
22/02/23 17:12:13.15 UVDZkpPA.net
>待機時間 100ms のところを 10ms とかに短縮できたところで
プロセスAがファイルのアクセス権を握り続けている間、
プロセスBがファイルシステムを10 ms周期でcallすることになるな!
140:デフォルトの名無しさん
22/02/23 17:17:22.47 A1VwjaQk.net
消費ってCPUリソースの話じゃないのか。
書き込みに100msの待機が問題となるようなリアルタイムな要件があるならともかく
ファイルの書き込みなんていう遅いものは非同期の実装に頭使うほうが効率的だろう。
141:デフォルトの名無しさん
22/02/23 17:21:14.59 UVDZkpPA.net
非同期の実装を最小の時間ロスで安全に行うものにするにはミューテックスによる同期が必要なわけで(以下無限ループ
142:はちみつ餃子
22/02/23 17:24:49.92 o4j3GXmb.net
スピンロックは沼なんで、
OS が用意してくれとる仕組みを使えってことで FA 。
143:デフォルトの名無しさん
22/02/23 17:26:48.01 A1VwjaQk.net
>>136
同期は機械語レベルの話じゃけんのう。
尻拭いの案件でよく見るが間違ってもCでグローバル変数でif文で切り分けとかしないでくれよ。
OSが提供する同期オブジェクト使うんだ。
144:デフォルトの名無しさん
22/02/23 17:30:05.39 lSALbkfN.net
タイミング合わせるために工夫をこらしたプログラムってのは見ていて嫌な気分になるのう
8bit機なら全部ビジーウェイトでいいんだけど
145:デフォルトの名無しさん
22/02/23 18:04:03.45 vCUIsgzX.net
>>
146:94のコードでコメントを外してビルドし、端末を2つ開いてほぼ同時にそれぞれ ./実行ファイル名 hoge1 ./実行ファイル名 hoge2 で実行してやると分かるけど、オープンはできていて書き込みも行われるよ ポーリングで見ようがロックできなければ>>101の解説どおり危険な瞬間(同時にAPIが呼ばれる瞬間)は必ず発生してしまう。 ポーリング間隔0をスピンロックとかビジーウェイトと言ってるのだと思うが、用語の使い方は置いておいて、0でも同様。
147:デフォルトの名無しさん
22/02/23 18:13:52.21 A1VwjaQk.net
8bitのCPUなんて命令の消費clockでタイミング取るとか普通やん
148:デフォルトの名無しさん
22/02/23 19:32:25.60 +QDyyf8g.net
ウェイト気にするんだったらI/O周りでガチャガチャするより書き込み要求をキューで受け付ける専門プロセス用意しろよ
149:デフォルトの名無しさん
22/02/23 19:34:41.10 lREuCbZK.net
>>117
ありがとうございます、inline変数を試してみます
150:デフォルトの名無しさん
22/02/23 19:41:23.72 lREuCbZK.net
>>120
コードは手元(スマホ)にはないので貼れないです、すみませんが日本語で理解してもらえると助かります。
クラスHogeは書いている通りシングルトンです。
よく分かっていませんがHogeは静的ライブラリ?というのでしょうか。
visual studioでいうと、
Hogeが入っているプロジェクトと
mainのプロジェクト、
dllのプロジェクトの3つがあって
mainとdllのプロジェクトの両方が「参照」でHogeが入ってるプロジェクトを依存関係?構築してます。
151:デフォルトの名無しさん
22/02/23 20:42:20.48 vCUIsgzX.net
>>148
日本語で説明できてないんだよw
今も確認が必要になってるだろ
問題は何?
シングルトンオブジェクトが、プロセス内に2つ(exe側とdll側)あること?
dllは遅延ロードするの?
152:デフォルトの名無しさん
22/02/23 20:50:56.75 vCUIsgzX.net
>>146
結局ここまで全部要件の問題ということで・・・
153:デフォルトの名無しさん
22/02/23 21:10:52.14 A1VwjaQk.net
Hogeのヘッダとlibファイルをmainとdllのプロジェクトに追加するだけの話じゃないのか。
154:デフォルトの名無しさん
22/02/23 21:37:03.52 vCUIsgzX.net
>>151
こんな感じになってるんだと思う
URLリンク(wandbox.org)
main.cpp(exeプロジェクト)
api.h(dllプロジェクト)
api.cpp(dllプロジェクト)
Sample.h(libプロジェクト)
Sample.cpp(libプロジェクト)
vc++で実行すれば分かるけど、dllとexeでインスタンスが2個出来る
IDEが作るファイルは使ってない(プリコンパイル済ヘッダ未使用vs2019で確認)
155:デフォルトの名無しさん
22/02/23 21:55:19.66 PssNo99E.net
>>148
あーすまん.dllならinline変数でもダメだわ
.libとの変数共通ならいけるんだが
156:デフォルトの名無しさん
22/02/23 22:10:26.11 vCUIsgzX.net
>>152
どうせ昼間のIDの誰かが質問者兼>>153だと思うので面倒なので補足しておく。
もし>>149の
> シングルトンオブジェクトが、プロセス内に2つ(exe側とdll側)あること?
がYesで
> dllは遅延ロードするの?
がNoなら
クラスSampleの宣言に__declspec(dllexport)を付けることで、1つにすることはできる。
ただし実体がdllに入るので、遅延ロードはできない作りになる。
157:デフォルトの名無しさん
22/02/23 22:31:49.11 PssNo99E.net
質問者ではないけど俺は.hで完結させたい人種なので「dll側かexe側に変数の実体を作らなきゃいけない」という縛りを極端に嫌ってる
dllとも変数実体を共有したいなら.h完結を諦めて
・実体生成用の1つのcppでだけ#defineでなんか定義して実体を定義させる
ぐらいしかまともな回答は思いつかん
どうせ複数dllから1つの変数を共有したいって話にもなるから
実体生成用のcppはexe側が受け持つか管理用のdll(質問者はやりたくないようだが)を作ることになるだろうな
158:デフォルトの名無しさん
22/02/23 22:49:56.05 A1VwjaQk.net
hogeの実装がどこにあるべきか決めてないとな。COMにするという手もあるな。
159:デフォルトの名無しさん
22/02/23 23:10:37.89 vCUIsgzX.net
質問者本人の匂いがプンプンするけど、全部ヘッダならそもそもlibやdll要らないでしょ
昔からstaticメンバ変数にその手のマクロが付いてるヘッダオンリーなライブラリもどきはある
管理用のdllなるものを作るにしたって、exportされるAPIとしてインスタンス生成用メンバ関数を直に紐付ける方法がないと、公開された生成方法が必要になり、シングルトンとして十分制限できない。
COMにするならもうC#で作ればいいのにと思ってしまう。
160:デフォルトの名無しさん
22/02/23 23:14:23.43 bb+gp0i+.net
Linuxには名前付きミューテックスないだっけ?
プロセス間の排他制御にflock使った思い出
161:デフォルトの名無しさん
22/02/23 23:19:02.33 kWD6+CX1.net
pthreadにあるやつが使えるからあるんでしょう
162:デフォルトの名無しさん
22/02/23 23:19:54.09 kWD6+CX1.net
mutexっていうかセマフォ使ってるかも
163:デフォルトの名無しさん
22/02/23 23:33:12.25 vCUIsgzX.net
linuxのプロセス間同期にはセマフォを使うよ
URLリンク(man7.org)
boostでやりたければこんな感じらしい
URLリンク(www.boost.org)
※最近boost使ってないのでよく知らない
164:デフォルトの名無しさん
22/02/23 23:43:27.24 bb+gp0i+.net
なるほどLinuxもセマフォは名前付きがあるのね
ありがとう!
165:デフォルトの名無しさん
22/02/23 23:44:52.39 kWD6+CX1.net
条件変数が一番好きです
166:デフォルトの名無しさん
22/02/24 02:08:55.88 9O+r6lMK.net
そのへんが全て最初から言語の型として標準で装備されていて
さらにコンパイルが通ればマルチスレッド時のデータ競合すら起きないことが保証されるRustが強いよな
167:デフォルトの名無しさん
22/02/24 02:43:58.81 tiwBzbY0.net
openMPを使いたいけど使うと言えない
168:デフォルトの名無しさん
22/02/24 03:32:22.22 +hdCiApF.net
どうやってスレ立てるの??
169:デフォルトの名無しさん
22/02/24 03:59:43.03 D634csZp.net
>>166
URLリンク(cpprefjp.github.io)
170:デフォルトの名無しさん
22/02/24 15:54:24.18 ZFLA2QwP.net
メモリ上で連続した多次元配列を動的に確保したいんですけど、どうするのがスマートなやり方ですか?
171:デフォルトの名無しさん
22/02/24 16:09:23.68 tiwBzbY0.net
多次元配列を宣言する
172:デフォルトの名無しさん
22/02/24 16:12:31.94 MBzpszCI.net
>>168
「連続した」ってとこkwsk
ハード的な事情があったりするのか?
173:デフォルトの名無しさん
22/02/24 16:25:32.45 xAP0ZjRZ.net
スマートが何処にかかるのか
174:デフォルトの名無しさん
22/02/24 16:32:30.77 cGpWV2sd.net
またスマートとか自分の希望要件すら言語化できないアホな質問来てるな・・・
いっぺん真で頭ガチャするのがスマート
175:はちみつ餃子
22/02/24 16:42:22.24 KIw+63Ii.net
「動的に確保」というのも、コンストラクトの時点で大きさが確定するというのと
後から伸長する可能性も含むというのでは事情が違う。
176:デフォルトの名無しさん
22/02/24 17:02:25.64 ZFLA2QwP.net
>>173
VLAのように実行時に全体の大きさを指定したいです
177:デフォルトの名無しさん
22/02/24 17:05:32.25 M4s9COHd.net
mallocや
178:デフォルトの名無しさん
22/02/24 17:34:08.45 cGpWV2sd.net
小出しにしてんじゃねーよw
質問者のお前が聞かれたことに答えるんじゃなくて、せめて満たすべき最低限の要件くらい自分で明確にしろと言ってるんだよw
そんなこともできなければ真でくれと言われてるのw
179:デフォルトの名無しさん
22/02/24 17:38:54.01 MBzpszCI.net
>>174
ということは最初の割り付けでサイズが確定していて
途中でresizeはできなくていいんだな?
180:デフォルトの名無しさん
22/02/24 17:40:07.73 MBzpszCI.net
あるいは、CのVLAをC++で操作できるようにしたいのか?
181:デフォルトの名無しさん
22/02/24 18:26:58.76 qnUKy4cC.net
初心者ですまんがVLAってvectorで代用できないの?
182:デフォルトの名無しさん
22/02/24 18:34:10.20 xAP0ZjRZ.net
つvalarray
183:デフォルトの名無しさん
22/02/24 19:04:00.53 7WoYZRJz.net
3次元配列なら
template<class T>
class V{
T*const ptr;
size_t s1,s2,s3;
public:
V(size_t s1,size_t s2,size_t s3):
s1(s1),s2(s2),s3(s3),
ptr(new T[s1*s2*s3]){}
T&operator()(size_t i1,size_t i2,size_t i3){
return ptr[i1*s2*s3+i2*s3*i3];
}
~V(){delete[]ptr;}
};
V<int> v(4,5,6);
v(1,2,3)=42;
みたいのでええんか?
大体こういうの自分で作るとバグらせるからあんまやりたくないけど
184:デフォルトの名無しさん
22/02/24 19:07:44.67 cGpWV2sd.net
すでにバグってる気がする
185:デフォルトの名無しさん
22/02/24 20:00:57.06 1pzXIXf6.net
boostにあるけどオーバーエンジニアリングっぽいんだよな
186:デフォルトの名無しさん
22/02/24 20:30:12.93 cGpWV2sd.net
馬鹿にされたい馬鹿が小出しにしてる以上何とも言えないw
僕ちゃんboost使いたかったけど馬鹿だからよく分からないし、条件小出しなまま複数IDで汎用な答えが欲しいのぉって言ってるだけなのが透けて見えるw
187:デフォルトの名無しさん
22/02/24 20:38:21.09 I6df84hq.net
何の情報が必要かすら分かってない初心者かもしれないんだから聞き出してやればいいのに
煽って出てくると思ってるなら考え甘いぞ、要件引き出せないようじゃ半人前
188:デフォルトの名無しさん
22/02/24 20:59:04.53 cGpWV2sd.net
ちゃんとID変えて出てきてるし煽ってないし、僕ちゃん答えは欲しいのに分不相応なプライドだけ高くて素直になれないのぉって言われてもね
189:デフォルトの名無しさん
22/02/24 21:02:22.10 j0njw0Fu.net
一方すぐ質問者にマウンティングしたがるおまえはすぐわかるなw
190:デフォルトの名無しさん
22/02/24 21:03:10.18 MBzpszCI.net
> ID:cGpWV2sd
おまえイラネ
無駄にうるせえ
191:デフォルトの名無しさん
22/02/24 21:29:39.55 cGpWV2sd.net
こんなスレにいちいち相談する初心者なんてそうそういねーよ
もし初心者なら回答欲しいんだから何言われても何某か返事する
そういうのがなく単発IDなどが煽ってくるということはつまり・・・図星ってことw
192:デフォルトの名無しさん
22/02/24 21:36:30.68 j0njw0Fu.net
ここ覗いてるのって技術系の雑談ネタとしか思ってないだろうが、
毎回、単発IDで質問して逃げてるとしたらクソ野郎だな。
学生の課題か何かだろう。おれたちは利用されてるんだ!!!
193:デフォルトの名無しさん
22/02/24 21:50:54.34 p3uXF2gK.net
利用されるのが嫌ってこと?よくわからんが。
まぁ、学校の課題でズルしても本人のためにはならないんだから勝手にしとけって感じだな。
194:デフォルトの名無しさん
22/02/24 21:59:42.81 cGpWV2sd.net
>>190 >>191
そう、お前のことだよ質問者兼回答者君
ただ学生じゃなくて社会不適合者だと思うし、毎日アホな質問しちゃぁ俺に馬鹿にされてるのに飽きないね
195:デフォルトの名無しさん
22/02/24 23:03:53.08 I6df84hq.net
妄想えっぐ、糖質っぽいな
196:デフォルトの名無しさん
22/02/25 00:16:50.60 5F5cVQmS.net
在日君なんだろうな
197:デフォルトの名無しさん
22/02/25 01:06:42.45 xX3MCg4u.net
>>192
おれみたいなじーさんがおまえのような小便垂れの小僧に質問するわけないだろ…
198:デフォルトの名無しさん
22/02/25 11:25:19.29 xlKD2LUb.net
なんで const なオブジェクトは const なメンバ関数しか呼べないの?
199:デフォルトの名無しさん
22/02/25 11:29:01.84 uD2ZWt4n.net
メンバ関数でメンバ変数が書き変わるとconstオブジェクトとして困るから
200:デフォルトの名無しさん
22/02/25 11:29:09.22 KX/JNmq+.net
中
201:が書き換わるかもしれないから
202:デフォルトの名無しさん
22/02/25 11:59:24.66 169sj97j.net
でもポインタで簡単に書き換えられるじゃん
203:デフォルトの名無しさん
22/02/25 12:14:57.98 mK/IikxE.net
意図的にconst外さなきゃconstのままだよ
何も考えずconst外すバカのことなんて知らん
204:デフォルトの名無しさん
22/02/25 18:43:59.10 xX3MCg4u.net
constが役にたった場面にあったことがない。
自分で書き換えといて「書き換わるかもしれない!!」とかどんだけ適当にコード書いてんだか。
205:デフォルトの名無しさん
22/02/25 19:05:22.20 kxjR7eze.net
constは積極的に使うことでI/Fを分かりやすくしたりできるね
書き換えない想定を明示的にして最適化しやすくする効果もある
意味的に正しいことが保証できないときにconstを使うと泣くこともあるけどw
206:デフォルトの名無しさん
22/02/25 19:11:03.22 xX3MCg4u.net
>>202
const使ったらコンパイラはどういった最適化するんだ?
207:デフォルトの名無しさん
22/02/25 19:12:37.70 pF12AA3R.net
constとprivateはテストの邪魔でしかない
使ってる奴は例外なく低脳
208:デフォルトの名無しさん
22/02/25 19:27:49.01 RMWkUPMB.net
privateはインテリセンスがすっきりしていいじゃん
209:デフォルトの名無しさん
22/02/25 19:38:04.25 kxjR7eze.net
>>203
実際にやってみろ
>>204
サンプル説明以外で可視性やconst使ってない馬鹿はエアプ
210:デフォルトの名無しさん
22/02/25 19:43:16.35 xX3MCg4u.net
自分で言い出しといて急にキレられてもな。
211:デフォルトの名無しさん
22/02/25 19:48:21.44 kxjR7eze.net
>>207
キレる?お前が調べもせずに聞いてくるから当たり前のことを言っただけだが
212:デフォルトの名無しさん
22/02/25 19:52:14.27 pF12AA3R.net
>>206
エアプは君だよ
製品レベルの緻密なテストセットをきちんと書き上げるためにはconstなしのオールpublicしかあり得ん
テストケースで様々な状態を作りだして動作確認するためには、全てを必要に応じて自由に書き換えられることが不可欠というもの
書き換え不可だのクラス専用だのの決め事は命名規則で担保するんだぞ
213:デフォルトの名無しさん
22/02/25 19:58:35.87 46L8HXzx.net
IFのシグネチャにconstついてないといちいち仕様書読まなきゃいけないから面倒くね?
char* token(char* str)とかあったら破壊的かどうか判別できん
214:デフォルトの名無しさん
22/02/25 20:00:20.50 gDL/lDyA.net
>>209
struct最強伝説キタコレ
215:デフォルトの名無しさん
22/02/25 20:04:09.41 Ttq2k6xT.net
>>211
staticおじさんの生まれ変わりだろw
216:デフォルトの名無しさん
22/02/25 20:04:09.42 kxjR7eze.net
>>209
URLリンク(github.com)
この辺のプロジェクトのソースでもいいし、chromiumのソースでもいいし、見てみたら?
製品レベルのコード見せてみろよ
217:デフォルトの名無しさん
22/02/25 20:07:48.92 xX3MCg4u.net
const使ったらどんな最適化するんだろう? 言った本人はキレて答えてくれないし。
218:デフォルトの名無しさん
22/02/25 20:12:00.77 kxjR7eze.net
>>214
お前が1+1=って言ったら俺はお前のためにわざわざ2と言う必要があんのか?
自分で調べたことの事実を示せw
219:デフォルトの名無しさん
22/02/25 20:14:10.16 aDhOSI3t.net
Rustは何も指定しないとimmutable(不変)にしちゃったから、そういう点でもわかりやすく、かつ、テストやデバッグも少数のmutableなものだけ対象にすればよくなってるね
220:デフォルトの名無しさん
22/02/25 20:15:39.58 xX3MCg4u.net
>>215
全く必要ない。
キミは自分で言い出しといて逃げる人とよく分かったから他の人に質問してるだけ。
キミはスルーしてくれていいよ。
221:デフォルトの名無しさん
22/02/25 20:16:05.93 kxjR7eze.net
>>216
Rustは無関係なので巣に帰れ
222:デフォルトの名無しさん
22/02/25 20:32:18.12 6k09Uwld.net
constを使うのがいいことがよく分かった
223:デフォルトの名無しさん
22/02/25 20:39:24.80 xX3MCg4u.net
constウイルスと言わざ
224:るをえないアホ仕様
225:デフォルトの名無しさん
22/02/25 20:57:38.37 QBj91W6D.net
だからさ、釣り針が太すぎるんだよな
226:デフォルトの名無しさん
22/02/25 21:25:13.93 4EL5U7Bc.net
constついてないコードは九分九厘ごみ
絶対に自分一人で書き上げて絶対に一生涯外に出さない保証があるなら付けなくても良い
227:デフォルトの名無しさん
22/02/25 21:34:50.33 6k09Uwld.net
本に載るほどの支持を覆すほどの権威と実例があるわけもなく
228:デフォルトの名無しさん
22/02/25 22:44:59.40 RMWkUPMB.net
メンバ関数のconst修飾とか関数の引数のconstとかはわかるけど関数内部のローカル変数にconst付けるのはよくわからんな
229:デフォルトの名無しさん
22/02/25 22:51:54.69 a/ksSb5+.net
const お会いしたらお茶しませんか?
230:デフォルトの名無しさん
22/02/25 23:04:47.69 aDhOSI3t.net
>>224
コードが読みやすくなるし間違って書き換わることもないから
どの言語でもconstやそれ相当で宣言するのが最近は一般的
JavaScriptですらconstにするのが常識となった
231:デフォルトの名無しさん
22/02/25 23:07:46.96 vOr560R7.net
ここ数年constをつけて再代入しないのが当然になってますってjavascriptの専門家に言われて殴りたくなりました
232:デフォルトの名無しさん
22/02/25 23:13:07.22 aDhOSI3t.net
JavaScript程度はブラウザのカスタマイズしたり含めて誰でも使える言語だろ
まさかC++しか使えない新人かね
233:デフォルトの名無しさん
22/02/26 00:15:34.77 VmHIkvc0.net
Pythonにはconstもprivateもない
大文字だけの名前はconst、アンダースコア始まりの名前はprivateという規約があるだけ
でもそれでみんな勝手に書き換えるべきでないと了解されてて完全に成立してる
とはいえ言語機能ではないのでテストとかでの必要に応じて規約を無視して値を変えることもできる
こういう実例を見るとわざわざコンパイラ機能として書き換え禁を強要してるconstやprivateは偏執的過ぎると思う
234:デフォルトの名無しさん
22/02/26 00:23:17.69 xDf2Ellb.net
小さいオブジェクトにconst付けるとアドレスが割り振られて最適化が阻害されるみたいな話は聞いたな
235:デフォルトの名無しさん
22/02/26 01:13:30.79 fRC8OZTs.net
日付が変わってまた湧いてるw
>>229 pythonみたいなゆるゆる言語と比較してconst/privateがないとかw
>>230 その話URLで示してw
236:デフォルトの名無しさん
22/02/26 01:14:41.41 TNmFLFGs.net
ここまでconstつけると最適化されるという例はなし。
237:デフォルトの名無しさん
22/02/26 01:39:20.96 fRC8OZTs.net
ここまで何を調べたかの記述なしw
238:デフォルトの名無しさん
22/02/26 04:01:53.50 L9ZaKHY5.net
move、右辺値参照、各種オペレータなどフルセットで対応するライブラリ的なクラスならconst対応した方が良いけど、
末端のアプリケーションにまで全部律儀にconst付けるのは面倒くさいだけだわな
239:デフォルトの名無しさん
22/02/26 04:13:27.79 fRC8OZTs.net
そんなしょうもないものならわざわざC++で組むなよw 発想がアホの極みw
240:デフォルトの名無しさん
22/02/26 06:30:02.19 BX4iLvdt.net
Rustなどは無指定デフォルト時がC++でのconst状態になってるよな
楽でいいよな
241:デフォルトの名無しさん
22/02/26 07:05:16.24 fRC8OZTs.net
>>236
Rustの話はRustスレで
242:デフォルトの名無しさん
22/02/26 08:03:06.09 w5NWCXyu.net
話題に沿ってるんだし少しくらいなら良いと思うけどね。アレルギーかよ
243:デフォルトの名無しさん
22/02/26 08:11:23.88 fRC8OZTs.net
Goスレ見てると対岸の火事とは思えないw
Rustスレは静かなのに、そこで議論できない馬鹿がずっと他言語スレでRustのヘイトを稼いでるからなw
Rustくらいみんな知ってると言うのにw
ってわけで、特に今は各言語固有スレではその言語の話だけってことw
244:デフォルトの名無しさん
22/02/26 10:47:22.97 w5NWCXyu.net
他所のスレのことは知らんけどこれをヘイト稼ぎと受け取るのは捻くれな気がするけどね
Rustのことも自分が知ってるからってみんな知ってるとかイキるのも良くない
知らない人だって当然いるだろうに
245:デフォルトの名無しさん
22/02/26 11:00:37.71 fRC8OZTs.net
ヘイト稼ぎと解釈しない方が捻くれてるだろw
今どきC++やっててRust(やそれ以外の言語)知らん方がレアだし、その程度のやつは何を言われても仕方ない
246:デフォルトの名無しさん
22/02/26 11:24:01.42 Cjy1TnYX.net
その程度とか言い出した
パソコンの大先生かな?w
247:デフォルトの名無しさん
22/02/26 11:56:13.77 w5NWCXyu.net
誰でも最初は初心者なんだけどね
ここオンラインの匿名掲示板なの忘れてない?
勝手に自分基準のレベルを周りに押し付けられてもね
そういうのは自分の納得できる閉じたコミュニティでやればいいと思う
248:デフォルトの名無しさん
22/02/26 13:03:43.12 d8NXRVNx.net
いや、悪いけど>>241はレベル低いと思うよ・・・w
249:デフォルトの名無しさん
22/02/26 13:14:24.08 qsPBexON.net
自動販売機のタバコじゃないんだけどね
もっと高級なのね
250:デフォルトの名無しさん
22/02/26 15:44:44.33 xDf2Ellb.net
Rustってまだ言語マニアくらいしか使ってなくね
そもそも案件が少なすぎるしRsutでしか提供されていないライブラリやフレームワークやSDKなんて聞いたことないし
俺が知らないだけで実はコッソリ出現してるのか???
251:デフォルトの名無しさん
22/02/26 22:06:22.23 aW9KNPN/.net
実際こうやってアレルギー反応(スレが荒れる)起こすからよその話はよそでやれってことだな
252:デフォルトの名無しさん
22/02/26 22:11:54.75 fRC8OZTs.net
荒れてねーよw
253:デフォルトの名無しさん
22/02/26 22:19:40.75 4mZJSMD8.net
>>246
色んな分野でRustがC++の立ち位置を侵食していってるよ
例えばブラウザ内だけでなく今は色んな所で使われるようになったWebAssembly(WASM)
WASMでプログラミングするための記述言語は当初C++が先行していたけど今はRustが逆転してトップになっているね
254:デフォルトの名無しさん
22/02/26 22:27:10.15 I1qWxMaG.net
constさいこー
固定文字列リテラルとか
const char* const s = "Hello World!\n";
やし
関数の仮引数は関数内で絶対変えないことにして
void foo(const char* const p); // 宣言
void foo(const char* const p_) { // 定義
const char* p = p_; // 関数内で値を変える場合
}
と書いてしまうま
255:デフォルトの名無しさん
22/02/26 22:27:29.83 I1qWxMaG.net
だいたい
スレリンク(tech板:652番)
スレリンク(tech板:659番)
と質問したら
スレリンク(tech板:661番)
やそうやし\(^o^)/
256:デフォルトの名無しさん
22/02/26 22:46:27.37 I1qWxMaG.net
テストのときにprivateメンバを弄りたいケースは確かにあって
そういう場合は次のどれかかが多いう気がする印象だが知らん ※個人の感想です
1. 長ったらしい接頭辞がついた名前のテスト用メソッドを設けてその中にテストコードを書く
リリースコードでもそのままだが呼ばれないからリンクはされない
2. 長ったらしい接頭辞がついた名前の構造体として実装して細かいテストしてclassでwrapしてリリース
3. 長ったらしい接頭辞がついた名前の普通の関数として書いて細かいテストしてそれをclassから呼ぶ
257:デフォルトの名無しさん
22/02/26 22:47:36.31 fRC8OZTs.net
>>249-251 こういうのが荒れてる状態
258:デフォルトの名無しさん
22/02/26 22:48:11.64 fRC8OZTs.net
>>252 これもな
259:デフォルトの名無しさん
22/02/26 23:14:01.86 I1qWxMaG.net
だいたいインターフェースにもconstつけちゃう
class IFoo {
int bar(const int x, const double y, const RECT z) const = 0;
double baz(std::string& buf) const = 0;
/*...*/
};
とか
260:デフォルトの名無しさん
22/02/26 23:14:57.75 I1qWxMaG.net
virtuarl ~IFoo() { }
を忘れたorz (死
261:デフォルトの名無しさん
22/02/26 23:17:36.73 TNmFLFGs.net
値渡しをconstにして何がしたいん?
262:デフォルトの名無しさん
22/02/26 23:27:30.26 w5NWCXyu.net
固定ならconstexpr使おうや
263:デフォルトの名無しさん
22/02/26 23:36:20.44 I1qWxMaG.net
>>257
文字通りconstにしたいのですヽ(`ー´)ノ
引数に再代入するのはガイジのやることなので(>>251
で関数定義でそうしたら、作業性のためにそれをコピペして極力弄らずにヘッダファイルにするから
宣言においても値渡しの引数にもconstが付くのでつ∀`;)
264:デフォルトの名無しさん
22/02/26 23:43:30.97 w5NWCXyu.net
まあ非参照型でconstついてなかったらとりあえず
ひょっとして関数内で書き換えられるんかと疑ってかかるよね
265:デフォルトの名無しさん
22/02/26 23:44:54.89 I1qWxMaG.net
>>232
IPAコーディング左方ガイド[C++言語編] (p.120)
URLリンク(www.ipa.go.jp)
>M1.11.1 参照しかしない領域は、const 型であることを示
>す宣言を行う。
(中略)
>参照するだけで変更しない変数を const 型で宣言することで、その変数を変更しないことを明
>示できる。また、処理系の最適化処理でオブジェクトサイズが小さくなる可能性もある。この
>ため、参照しかしない変数は const 型にする。
やそうや;;;
具体的には知らん
266:デフォルトの名無しさん
22/02/26 23:45:14.56 nPeFYJEF.net
引数に再代入するかどうかは呼び出し側の与り知らぬところなんで
それを公開インターフェースに乗せるのはどうかなぁ。
267:デフォルトの名無しさん
22/02/26 23:45:57.76 BX4iLvdt.net
Rustだと値渡しだけでなく参照渡しも無指定デフォルト時は書き換え不能だよな
書き換えが起こる関数へは指定して可変参照を渡す
268:デフォルトの名無しさん
22/02/26 23:48:32.78 UUNvHcAJ.net
どこぞの馬の骨とも知れないIT後進国ジャップが言う事よりも天下のGoogle様のコーディング規約を真似るほうが無難だぞ
そしてGoogleのコーディング規約によると「可能な限りconst付けまくれ」との事
実際にGoogleが公開してるライブラリはCにしろC++にしろ関数の引数から大体const付いてる、ポインタは勿論constバーガーで
269:デフォルトの名無しさん
22/02/26 23:50:44.52 I1qWxMaG.net
>>262
あずかり知らぬことならどうでもいいんじゃ……
コピペした後手作業でconstを消すとかアフォらしい漏れクラスの天才の単金は高いからな
やっぱ作る方の作業性優先で、
記憶モードだがVC++のインテリセンスは値渡しのconstは除去して提示してくれるはず……
270:デフォルトの名無しさん
22/02/26 23:58:24.50 nPeFYJEF.net
でもconst書く方の手間は惜しまないんだ
271:デフォルトの名無しさん
22/02/26 23:58:37.20 Cf/OFvAp.net
> 処理系の最適化処理でオブジェクトサイズが小さくなる可能性もある。
> int bar(const int x,
これをどうやって小さくするんだ? そもそもconstの値渡しの話だよな。
272:デフォルトの名無しさん
22/02/27 00:02:08.66 /TAxLK2K.net
>>264
へぇ~知らなかったわこれ
流石ゴーグル様やで
273:デフォルトの名無しさん
22/02/27 00:02:10.22 o7kRBzLD.net
引数で明示的に書き換え禁止にしたいということはポインタ渡しか参照渡しだよな。
アドレスしか渡してないのに最適化でオブジェクトサイズが小さくなるというのはどういう意味だろう?
274:デフォルトの名無しさん
22/02/27 00:05:12.18 o7kRBzLD.net
> 「可能な限りconst付けまくれ」
自分で設計、コーディングができなくてオープンソースをパクる側の意見だろう。
あくまでパクりすぎて訴えられて負けるググルくんの意見。
275:デフォルトの名無しさん
22/02/27 00:07:37.55 KWP91+7v.net
char*ならアドレス渡すより実値渡す方がサイズ小さくて済むとかじゃない?知らんけどね
276:デフォルトの名無しさん
22/02/27 00:14:47.59 /TAxLK2K.net
>>269
値渡しだとしても関数内で決して書き換えませんよって意思表示でconst付けるん
277:だわ 使う側はどうでもいいのかも知れないけど少なくてもメンテ側はその方が楽
278:デフォルトの名無しさん
22/02/27 00:39:11.54 GNkMbU6V.net
実質in宣言だよね
279:デフォルトの名無しさん
22/02/27 05:41:24.49 +yReYAPt.net
まだ馬鹿がconst不要とかアホなこと言って荒らしてるのか・・・
280:デフォルトの名無しさん
22/02/27 07:45:11.01 hjaMvOv0.net
もういっそのこと、constをメンバ関数宣言のデフォルトにして、volatileキーワードをメンバ関数宣言にそえないとメンバ変数の値を変更できないような仕様変更をしたほうがいいくらいだよ
281:デフォルトの名無しさん
22/02/27 07:54:46.50 XiobTp3y.net
ラムダ式の値キャプチャはデフォでconstだね
constつけたくないときはmutable
282:デフォルトの名無しさん
22/02/27 13:50:59.05 i/FBvdzu.net
勝手な憶測だけどconst付けると即値埋め込み以外にもどの変数をレジスタに入れるかって辺りの最適化が効きやすくなりそうな気はする
283:デフォルトの名無しさん
22/02/27 14:21:10.71 ai7feBss.net
class ClassA {
public:
int x, y;
ClassA(int n1, int n2) { x = n1, y = n2; }
virtual void VirFunc() = 0;
};
class ClassB :public ClassA {
public:
ClassB(int n1 = 0, int n2 = 0) :ClassA(n1, n2) { ; }
void VirFunc() { cout << "Disp1:x+y=" << x + y << std::endl; }
void Dummy() { ; }
};
void check(ClassA* obj)
{
if (typeid(*obj) == typeid(ClassB)) {
static_cast<ClassB*>(obj)->VirFunc();
}
}
int main()
{
ClassB objB(10, 20);
check(&objB);
}
284:デフォルトの名無しさん
22/02/27 14:21:28.24 ai7feBss.net
クラスの継承やtyoeidで今躓いています。
objにclassBがなんで代入出来てなんでキャストできるのかわかりません。
check関数の中の引数、ClassAのポインタにClassBで実体化したオブジェクトのアドレスを入れると言うことは
継承した部分だけを見ることで同じ型として見ているのですか?
だとしたら派生先のクラスでできたメンバ?がどうなるんだろうと言うのもわからなかったりはします。
285:デフォルトの名無しさん
22/02/27 14:22:00.29 ai7feBss.net
すみませんコードってどう上げれば良いんでしたっけ?
286:デフォルトの名無しさん
22/02/27 14:34:30.92 57HjD/n9.net
const の必要性ってこういうときにあると思ってる
struct T { int x; int y; T(int _x,int _y):x(_x),y(_y){}};
int test1(T &a){ return a.x*a.y;}
int test2(const T &a){ return a.x*a.y;}
int main() {
T a(10,5);
printf("%d",test1(a));//OK
printf("%d",test1(T(5,4)));//エラー
printf("%d",test2(a)); //OK
printf("%d",test2(T(4,6)));//OK
}
287:デフォルトの名無しさん
22/02/27 14:38:16.26 gvx2nAxT.net
>>279
想像のとおりです
なのでメンバーが減るようなキャストはまずい
288:デフォルトの名無しさん
22/02/27 14:51:04.74 ai7feBss.net
>>282
ありがとうございます。
アップキャストダウンキャストも関わっていたのですね
すぐにはわかりませんでした。
たとえばなんですけど派生クラスBは基本クラスAに別の名前を付けてかつBで新たに
加えられたメンバはBから紐づけられていて、これらをセットにして見やすくしたものが
派生クラスBになると言う感じなのです?
289:はちみつ餃子
22/02/27 15:01:31.40 ftSqTRxL.net
派生クラスのオブジェクトには基底クラスのオブジェクトが含まれる。
派生クラスの一部であるようなオブジェクト (基底やデータメンバ) をサブオブジェクトという。
290:デフォルトの名無しさん
22/02/27 16:18:03.61 ai7feBss.net
>>284
ありがとうございます。
サブオブジェクトがサブオブジェクトと言われることにつながるのですね。
291:デフォルトの名無しさん
22/02/27 16:44:15.33 +yReYAPt.net
ダウンキャストは危険で、本来無条件にやっていいものではない
なので実行時型チェックをして使っている今回は問題ないだけ
なお、static_cast<ClassB*>(obj)->VirFunc()は最近のコンパイラ(gcc11.2)だと
最適化なし時はClassA*として仮想関数呼び出しと同じ方法で呼び出す
最適化あり時はvtableがClassB::VirtFunc()かどうか確認してインライン展開したものが実行される
(万一確認失敗したら仮想関数呼び出しと同じ方法で呼び出す)
292:デフォルトの名無しさん
22/02/27 17:38:03.37 HuUTW9GQ.net
ダウンキャストをするならstatic_castではなくdynamic_castを使うべき。
見ているobjの実体がclassBじゃないなら失敗してnullptrを返してくれる。
そもそもダウンキャストが必要になること自体良い設計ではないが
auto* pb=dynamic_cast<classB*>(pobj);
if(pb){
pb->...;
}
293:デフォルトの名無しさん
22/02/27 17:46:47.65 NpJPdMJB.net
「キャストはなるべくするな、特にdynamicはコストが高い」と古文書にもあった
294:デフォルトの名無しさん
22/02/27 17:54:22.89 +yReYAPt.net
今回はそれをtypeidでやりたかったんでしょ
295:デフォルトの名無しさん
22/02/27 18:02:07.86 HfpUvsK0.net
ダイナミックダイクマ
296:デフォルトの名無しさん
22/02/27 20:42:58.79 ai7feBss.net
なんかC++が気になるので実践的な情報でもなんでもありがたいです。
C++で食べてる人と話したこともないし・・・
297:デフォルトの名無しさん
22/02/27 20:45:27.70 NpJPdMJB.net
古文書には「#defineではなくconst,enum,inlineを使うといい」ってあるよ
298:デフォルトの名無しさん
22/02/27 20:47:31.05 nGlHhzSe.net
死海文書では「constexpr, enum struct, enum class」を使うことで難を逃れたと書いてある
299:デフォルトの名無しさん
22/02/27 20:56:43.39 o7kRBzLD.net
const使えば分かる。#defineのほうがやっぱり便利だわ。
300:デフォルトの名無しさん
22/02/27 21:21:58.39 Xl3wWN+O.net
C++のenumは機能が弱いからなあ
Rustのenumみたいに任意の型の変数値を格納できるようにしてほしい
301:デフォルトの名無しさん
22/02/27 21:31:32.92 nXG/aSfD.net
>>275 >>276
その方針で全ての変数のデフォルトをC++のconst状態にしてしまったのがRustだね
代わりに値が変化する変数にだけミュータブル指定しないといけないけど
if-elseもループもブロックも値を返してくれるためほとんどの変数が変化しない
302:デフォルトの名無しさん
22/02/27 21:36:52.29 o7kRBzLD.net
char*やシンプルな構造体ならconst使うのはメリットあると思うが、
あれこれ機能が詰め込まれるクラスになると不便さ、面倒さのほうが際立つ。
多重継承並にハゲる原因になる。
303:デフォルトの名無しさん
22/02/27 22:28:50.95 hjaMvOv0.net
まーたしかにconst_castだらけになるかもしれないね
304:はちみつ餃子
22/02/27 23:37:06.31 ftSqTRxL.net
const_cast を正しく使うのは難しい。
const なオブジェクトから const を剥がして書き換えるのは未定義。
数年前に LLVM が const 指定の情報を最適化に活用する方向に舵を切ったというニュースもあった。
const ではないオブジェクトに対して const なポインタや参照を経由している場合には
const を外して書き換えるのは許されるはずだが、
それが必要になるようだと設計を見直したほうがいい。
現在のコンパイラは賢くて、 const 指定をしてなくても書き換えられる可能性がないことを見抜いて最適化することも多いんで、
const の指定自体は最適化にはそれほど寄与しないよ。
ただ、 const を前提とした設計はコンパイラにとって最適化しやすい構造である可能性はある。
① const を前提にした設計にできるもんならしたほうがいい
② そうできないなら無理に const を付けないほうがいい (後で場当たり的に const_cast で const をはがすとどこかで間違う)
305:デフォルトの名無しさん
22/02/27 23:43:44.46 o7kRBzLD.net
書き換えないコードの場合はどういう最適化がされるのかを知りたいのだが。
306:デフォルトの名無しさん
22/02/27 23:51:40.12 HuUTW9GQ.net
getterにlockを仕込む場合にgetterをconstにするべきかどうか悩む
const扱いにしてmutexに関してだけconstをはがすべきなのか
class C{
std::mutex _mtx;
int _a;
public:
int get_a(){
std::lock_guard lk(_mtx);
return _a;
}
void set_a(int a);
};
307:デフォルトの名無しさん
22/02/28 00:43:20.93 7GK6w4Z4.net
>>301
俺ならgetterにはconst付けてmutexメンバ変数にはmutable付けるね。
308:はちみつ餃子
22/02/28 00:54:54.67 R6BwoFXD.net
>>301
俺も >>302 には賛成。
mutex はあくまでも内部的な実装の都合であって、
それを mutable にしてもクラスの logical constness は維持されると判断する。
309:デフォルトの名無しさん
22/02/28 01:18:45.25 EeqSDih1.net
>>300
だからお前は何を調べたとずっと聞いてるんだがw
310:デフォルトの名無しさん
22/02/28 01:22:01.28 LWo9z6at.net
言い出した本人が逃げ出して答えないし、誰もはっきりと答えないんだからウソなんじゃね?
311:デフォルトの名無しさん
22/02/28 01:25:22.84 EeqSDih1.net
状況に依るけどmutableにするなら俺はunique_ptrとかにするかもしれない
312:デフォルトの名無しさん
22/02/28 01:42:21.31 EeqSDih1.net
>>305
言い出した本人はいるし、「お前は何を調べたとずっと聞いてる」のにしかも何度も聞いてるのに答えない=お前が逃げ続けてるからだろ?w
313:デフォルトの名無しさん
22/02/28 01:47:08.01 LWo9z6at.net
本人いたのか。自分で言い出したはいいが実はさっぱり分からないって感じか。
それはそれで仕方ない。発狂してたら余計にやっぱりウソなんだ~ってなるだけだぞ。
314:デフォルトの名無しさん
22/02/28 01:50:37.25 EeqSDih1.net
もう寝るけど、お前がただただ煽りながら発狂しちゃってる間も、毎日何某か書いてるんだがw
いつになったらお前がどこまで何を調べたのか詳細に説明してくれるのか心待ちにしてるよw
315:デフォルトの名無しさん
22/02/28 01:50:44.99 h02lB8BP.net
>>302 >>303
ありがとうございます
なるほどフィールド側でconst扱いしないモードを初めから指定すればいいのか...
316:デフォルトの名無しさん
22/02/28 01:54:51.97 LWo9z6at.net
>>309
やっぱりウソなのか。散々暴れといてしょうもない奴だな、おまえ。
317:デフォルトの名無しさん
22/02/28 01:56:18.18 h02lB8BP.net
void f(const std::vector<int>&v){
for(size_t i=0; i!=v.size(); ++i)...
}
とかで
本来v.size()を毎回呼ばなきゃいけないけどconstだから1回呼ぶだけで十分って話とかじゃないの?
まあ俺も-O2コンパイル結果を読む気力はないからエアプ扱いしてもらって構わんが
318:デフォルトの名無しさん
22/02/28 02:03:13.46 /gADsoXI.net
constなんていつでもconst_castで引っぺがせるんだから、勝手に定数畳み込みとかは出来ないし
じゃあそういうのが無いのを検知すれば出来るだろというと、そんなに賢いならconst無しの変数でも同じ事が出来るはず
結論から言うとconstは最適化に何の影響も及ぼさない
畳み込ませたい定数はconstじゃなくenumか#defineで定義するのが正解
319:デフォルトの名無しさん
22/02/28 02:14:26.59 EeqSDih1.net
複数IDで暴れとるwwwww 朝までに具体的な事例を書いてねw
環境も明記されてないコンパイルも通ってないモノでは想像で言ってるだけってことになるよw
320:デフォルトの名無しさん
22/02/28 06:31:25.23 Zh+6zBsp.net
>>312
この例は毎回v.size()呼んで遅くなりうる
それは最初に1回一時変数に受ければ解決するがそれがconstかどうかはまずパフォーマンスに影響しないだろう
もっというとこれは生のfor文の欠陥でこれからはstd::views::iotaを使っていくべき理由の1つだと思う
321:デフォルトの名無しさん
22/02/28 06:47:54.89 EeqSDih1.net
>>315
その例はconstにしようがしなかろうがインライン展開されるので最適化結果に違いはないよ
そもそも最適化しやすくなると言ってるだけで、違いがあるとまでは言ってなかったんだけどw
>>314に書いたとおり、煽るだけ君は結局「想像で言ってるだけ」なんだなw
妄想はほどほどにしてくれw
最適化コードに違いがある例が以下。マクロの定義を空にすればconstなしのコードになる。
URLリンク(godbolt.org)
#define CONST const
template<typename T>
struct s {
T value;
operator T() CONST {return value;}
};
CONST s<int> a[] = {1,2,3,4,5};
template<typename T> T func() {
T r = 1;
for (int i = 0; i < sizeof(a)/sizeof(a[0]); ++i) {
r *= a[i];
}
return r;
}
int main() {
return func<double>();
}
322:デフォルトの名無しさん
22/02/28 07:29:26.73 Zh+6zBsp.net
>>316
俺はこの話題に関して初めて書き込んだ者だが
323:デフォルトの名無しさん
22/02/28 07:34:24.42 Od0J2fCm.net
>>316
都合の良い例にしすぎだろ
324:デフォルトの名無しさん
22/02/28 07:43:08.18 EeqSDih1.net
反証は1つで十分w 具体例の1つも書けない人は黙ってようねw
325:デフォルトの名無しさん
22/02/28 08:14:09.88 Od0J2fCm.net
ああすまん、変化しない例を出してるつもりだと思ってた
そんなコードでも変化したりするのね
326:デフォルトの名無しさん
22/02/28 10:21:52.93 ftLJb++c.net
古文書には#defineは良くないってあったけど今のC++ってその辺り改善されたんですか?
327:はちみつ餃子
22/02/28 10:47:09.12 R6BwoFXD.net
>>321
ある程度は。
328:デフォルトの名無しさん
22/02/28 10:56:01.32 xzjNndYE.net
>>321
「その辺り」って何?
スコープとの相性が最悪って意味なら変わってないぞ
329:デフォルトの名無しさん
22/02/28 11:04:38.67 ftLJb++c.net
>>323
他所からパクってきたコードですが、#defineはそのまま書き換えるだけだから以下や
#define SIX 1 + 5
#define NINE 8 + 1
int main(void)
{
printf( "What you get if you multiply six by nine: %d\n", SIX * NINE );
return 0;
}
以下の関数の呼び出しなどで意図しない挙動になったりとかです
#define SquareMulti(x, y) x * x * y
SquareMulti(++a, b)
330:はちみつ餃子
22/02/28 11:14:22.32 R6BwoFXD.net
>>324
その程度なら inline や constexpr を活用するのが今は良い作法
331:デフォルトの名無しさん
22/02/28 11:19:01.97 xzjNndYE.net
>>324
マクロに関してはそういう所は変わってない
餃子が言うようにマクロ以外の手段を使うというだけ
332:デフォルトの名無しさん
22/02/28 11:20:49.97 +7QZaSxQ.net
>>321
#defineじゃないとできない/面倒なパターンが減ったという意味ならある程度はマシになってる
<numeric>とか<source_location>とかconstexpr/constevalとか
333:デフォルトの名無しさん
22/02/28 11:24:50.52 s9ebK7Me.net
>>321
#付いてるから、基本プリプロセッサ文だかんな
334:デフォルトの名無しさん
22/02/28 11:39:25.77 42wjdHim.net
スコープ付きの#defineが欲しい時ってあるよね…w
335:デフォルトの名無しさん
22/02/28 12:09:06.26 EeqSDih1.net
ねーよw
336:デフォルトの名無しさん
22/02/28 12:16:38.60 WvOgTxGl.net
#define NAMESPACE namespase
#define NS ns
NAMESPACE NS{
void f();
}
void g(){
NS::f();
}
このへんのコードをプリプロセスの段階で正しく解釈するのは無理なのがね
#pragma defines(push)
みたいのが言語標準になればいけるか?
337:デフォルトの名無しさん
22/02/28 12:32:49.89 EeqSDih1.net
馬鹿の妄想は放置して、マクロでないと困る例
#include <iostream>
#define PRINT_LOCATION() (::std::cout << __FILE__ ":" << __LINE__ << ":" << __PRETTY_FUNCTION__ << "\n")
namespace hoge {
void func() {
PRINT_LOCATION();
}
}
using namespace std;
using namespace hoge;
int main() {
PRINT_LOCATION();
func();
return 0;
}
338:デフォルトの名無しさん
22/02/28 12:41:59.91 xzjNndYE.net
友達いなさそうだな
339:デフォルトの名無しさん
22/02/28 12:49:02.69 EeqSDih1.net
そんなこと気になっちゃう程度の馬鹿よりは多そうだけど、多けりゃいいってもんでもないと思うぞw
340:デフォルトの名無しさん
22/02/28 13:48:09.49 ftLJb++c.net
多くの回答ありがとうございます
やはり可能な限り#defineは避けた方が良さそうですね
ただ#defineでもできないことや、#defineにしかできないこともあるので変に毛嫌いせず勉強を進めてこうと思います
341:デフォルトの名無しさん
22/02/28 14:03:01.00 EeqSDih1.net
例外中の例外なので、毛嫌いして全く問題なく、勉強する必要も全くないw
342:デフォルトの名無しさん
22/02/28 15:55:04.33 Yx2Q2Rjy.net
Include Guard Macro以外の#defineは忘れてもいいと思う。
343:デフォルトの名無しさん
22/02/28 17:13:33.60 HhKI/yF6.net
ほんそれ
一生ソロプレイかつCにしがみつくつもりなら構わないけど
そうじゃないなら基本的に使わないべき遺物
344:デフォルトの名無しさん
22/02/28 20:11:29.53 Zh+6zBsp.net
ほぼ同じ演算子オーバーロードを延々と書く場合とかマクロでまとめていいと思うけどね
テンプレートではどうしようもないレベルのメタプログラミングの手段として未だに有効
345:デフォルトの名無しさん
22/02/28 20:17:53.65 xrBOKM6i.net
むしろ、他言語にマクロ展開機能がないことが不満
346:デフォルトの名無しさん
22/02/28 20:19:01.14 EeqSDih1.net
そうなる仕組みもどうかと思うけど、必要悪として採用するケースが「あってもいい」という程度だよ
347:デフォルトの名無しさん
22/02/28 20:39:17.05 xzjNndYE.net
>>339
だよな
復号代入とかフルで揃えようとすると
毎回同じようなコードを延々書くからな
348:デフォルトの名無しさん
22/02/28 21:11:31.61 EeqSDih1.net
だよなじゃねーよw
本当にマクロでないとできないケースなのかすら怪しいw
349:デフォルトの名無しさん
22/02/28 21:21:08.91 TawWBZkT.net
>>339
テンプレートでできなくてマクロならできるとかそんなにはないだろ
>>340
C/C++ のマクロなんて PL/I から見たら子供騙しレベルだけどね
350:デフォルトの名無しさん
22/02/28 23:32:29.49 7SSxP2tw.net
>>340
C++に一番近い言語であるRustが多様な各種マクロを充実させているので乗り換えるのもよいかもね
マクロ以外にも非常に多くの問題が解決される
351:デフォルトの名無しさん
22/02/28 23:58:07.07 EeqSDih1.net
ゴミのような文化を踏襲してしまった残念言語のRustさんのヘイトを上げるのはやめましょうw
352:デフォルトの名無しさん
22/03/01 00:33:34.91 Sj28peWv.net
C++使ってるおれすげーみたいな