C++相談室 part160

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2022/04/15(金) 08:39:32.42ID:WMzvufu2
前スレ
C++相談室 part158
https://mevius.5ch.net/test/read.cgi/tech/1645239402/
2022/04/15(金) 08:42:10.92ID:WMzvufu2
全スレ159だったわ
タイトルだけ間違えた
2022/04/15(金) 08:46:23.30ID:wykOop5a
乙です。
2022/04/15(金) 08:50:45.87ID:xDiQzMrD
おつ
2022/04/15(金) 09:04:13.20ID:1joR/OE7
>>2
どんまい、乙
2022/04/15(金) 09:12:06.04ID:pOJAVr49
グローバル変数と静的変数は
・書き換えられうる場合は排他制御が必須
・初期化のみの場合でもその初期化の排他制御が必須
・ただし静的変数の初期化はC++11以降は自動的に排他制御されることが保証される
2022/04/15(金) 09:23:58.05ID:xDiQzMrD
まとめると、main開始してからリソース用意して適当に渡せよってことよ
原則としてグローバル変数もシングルトンも避けたほうが良い
2022/04/15(金) 12:30:29.25ID:hAkRYyug
グローバル変数を避ければシングルトンがmain開始前に呼び出されること無いだろ。
グローバル変数だけ避ければいい。
2022/04/15(金) 12:37:29.85ID:1+gF2L/G
シングルトンなんてグローバル変数と同じ
避けたほうが良い
2022/04/15(金) 13:17:57.26ID:JW7HV0lo
シングルトンの中に書き換わる変数を持っていたらデータ競合が起こりうるよな
2022/04/15(金) 15:34:09.27ID:wykOop5a
>>9
シングルトン無しでどうやってプログラム全体で共通のリソースを管理するの?
2022/04/15(金) 15:49:11.91ID:rZhfm+p8
>>11
それほんとにシングルトンのこと話してるの?
モジュール間の情報共有はシングルトンがないと無理って言ってるに等しい気がするけど
2022/04/15(金) 16:34:54.97ID:WyYUxIA+
>>11 「管理」が何のことを言ってるのかわからないけど、たぶんひきすうをつかえばいいと思うんだ。
2022/04/15(金) 16:52:25.27ID:2FVuY2vb
引数ってこういうことか?

struct singleton_t { };

singleton_t& get_singleton()
{
static singleton_t the_singleton;
return the_singleton;
}

void func1(singleton_t&);
singleton_t& func2();

int main()
{
func1(func2());
}

func2なんか使わずにfunc1の中でget_singletonを呼び出せば済むことだし
だったらthe_singletonをグローバルにするのと大差なくねって
2022/04/15(金) 19:46:49.16ID:shXIYNIj
>>12
>>9の主張「シングルトンとグローバル変数は避けたほうが良い」を受けての話ね。
当然グローバル変数も無しで、さらにシングルトン無しでどうやってグローバルなリソースを管理するのかな?と。
2022/04/15(金) 19:49:50.97ID:RJmakPbV
まあ引数で渡せばいいわけだが…
2022/04/15(金) 19:53:05.56ID:PiHpabQE
>>15
グローバル変数やシングルトンがなくていいとは言わないけど、何でひきすうで出来ないと思うの?
2022/04/15(金) 19:55:09.07ID:shXIYNIj
>>16
それ何て純粋関数型プログラミング?
2022/04/15(金) 20:05:45.76ID:gTMTzKSQ
システム全体のリソースならグローバルでいいだろ
グローバル変数を導入するメリットの方が勝つから

なんでもかんでもグローバルに置くのはやめようねというだけの話でしょ
2022/04/15(金) 20:07:59.29ID:shXIYNIj
>>19
システム全体じゃないリソースてどんなのあったっけ?
2022/04/15(金) 20:15:16.00ID:RJmakPbV
リソースって何を指してるんだろう…
2022/04/15(金) 20:19:31.51ID:RJmakPbV
まあ寿命がはっきりしないオブジェクトって嫌なもんだよ
わかってもらえるとは思わんけど
23デフォルトの名無しさん
垢版 |
2022/04/15(金) 20:45:25.17ID:aidqFE7S
前スレでクラス内部にinstanceを持たせて運用する事を質問した者です。

(注)前スレ:943
:ユニークポインタをシングルトンの様な仕様に置き換え
std::unique-ptr<Hoge>Temp=std::make-unique<Hoge>();

static Hoge& GetInstance(){static Hoge temp;return temp;}

上記の仕様をさらに、
template <class T>
inline T Instance;
というテンプレートinstanceで使用できるようにアドバイスを頂き、その仕様に変更したところ、運用自体は問題ないのですが、コンストラクターの呼び出し位置がおかしい感じになってしまいますた。
インラインなのでコンパイル時?(inittermという関数内部でコンストラクトが実行されている)にコンストラクターが起動されてしまう感じで、外部ライブラリを使用したコンストラクションが失敗します。
これは明示的に回避できるのでしょうか?
また、皆さんはグローバル変数等を使用するときにどういった方法を取られますか?
クラス名から呼び出せるインスタンスはかなり便利なので使っていきたいのですが……

度々申し訳ございますん。
2022/04/15(金) 21:08:51.51ID:ZOmTtyVU
実際に1個しか存在しないものはシングルトンの表現が合ってる
GPUとかな
2022/04/15(金) 21:22:11.96ID:o8nSddd2
inline変数は(MSVC16で確認する限り)1つの.dll内で同じ実体を共有する
dllをまたぐと別の実体になる

.hに書いてもリンク時に多重定義で怒られない

その言い方だとmainを呼び出す前の初期化処理で死んでる感じか
2022/04/15(金) 21:25:54.67ID:lFYUjAWg
シングルトンにしてもグローバル変数にしても排他制御が必要な点で同じだよな
2022/04/15(金) 21:31:24.48ID:o8nSddd2
コンストラクタ実体を含んだdllをロードする前にinline変数の初期化が走るというのが問題なら、
GetInstanceのテンプレート実装に逃げるか...

template<class T>
T&GetInstance(){static _back;return _back;}
int main(){
GetInstance<Hoge>().Func();
}


一応言っておくがデータをケチる目的のはずだからinline変数もGetInstanceテンプレートも「本物」のグローバル変数ではない

dllをまたいだら別の実体だ
2022/04/15(金) 22:14:55.32ID:zMpb+zG7
円周率みたいな定数ってどのライブラリのやつ使ってますか?
2022/04/15(金) 22:21:34.04ID:0DFy/IGY
<numbers>
C++20必須だが
2022/04/15(金) 23:15:01.17ID:ZOmTtyVU
古いC++ならe=exp(1.0)、π=6*asin(0.5)
2022/04/16(土) 06:56:47.86ID:cvz/IVkr
numbersって型変えた時ちゃんと直してくれるの?
2022/04/16(土) 16:00:35.82ID:36AETGkW
>>31
変数テンプレートだからこっちが型を指定する
auto x = std::numbers::pi_v<double>;

デフォはdouble
namespace std::numbers {
inline constexpr double pi = pi_v<double>;
}
2022/04/16(土) 17:48:06.48ID:vYse36AQ
なおpi_v<int>はゆとり歓喜の3ではなくis_floating_pointに阻まれる模様
2022/04/16(土) 19:53:49.89ID:pxnrcQ3X
未だに円周率3とか言ってるおじいちゃんいるのか・・・
2022/04/16(土) 20:06:23.56ID:36AETGkW
ジジイを馬鹿にするのは結構だが若いなりに何か引っさげているのか?
俺は8bit機がこれから黄金期に差し掛かるあたりでお前らのような立場だった
ハッタリではなく当時のトレンド引っさげてジジイたちの死角を突くことで今の地位を得たが
口だけ達者でこれから沈みゆくだけな連中なら全然羨ましくねえぜ
2022/04/16(土) 20:44:57.02ID:YPs7FevK
世代ってより情弱ぶりを揶揄されてるのに気付かないようじゃ虚しいな
2022/04/16(土) 20:48:37.77ID:36AETGkW
そもそも誰か円周率が3だなんて主張してるか?
情弱って攻撃用ワード使って脅しかけても説得力ねえとバカにしか見えねえんだけど
2022/04/16(土) 20:50:03.87ID:9kZcaiqY
>>34
ジジイ、ジジイか‥‥
それじゃ、お前はなんだ?この餓鬼が
俺はお前さんがこの世に落っこってくる前からバグ書いてるんだ
2022/04/16(土) 20:51:51.80ID:fE0J8eTv
先輩パネーっすね
2022/04/16(土) 21:23:19.58ID:gltC/pf5
どうしてもintのπを定義しようと思ったら、4や2ってわけにはいかないから3にするしかないと思う
2022/04/16(土) 21:35:43.96ID:MoK8GTpb
どうしても偶数のπを定義しようと思ったら、4にするしかないと思う。
2022/04/16(土) 21:45:10.61ID:36AETGkW
全否定はしていない
これならジジイを馬鹿にする資格があると示しているのに
応答なしか・・・誠に残念
煽られても好意的に対応したが無駄だったか
2022/04/16(土) 22:22:53.11ID:IM94y/ni
20年前のフェイクニュースネタではしゃぐなよ
2022/04/16(土) 22:52:39.15ID:R//Q6DgO
「状況によって『およそ 3』で計算すればよい」という指導は存在する。
小学生は有効精度の概念を知らんから
どういう場合にどの程度の概算でよいのか自分で判断できんのよ。
「およそ 3」って言ったら 3 で計算するのを正解だと思っちゃうやつが少なからず出てきてしまう。

現実的な精度との兼ね合いで言ったら 3.14 で教えておくのがおおよそ手ごろなんやろね。
2022/04/16(土) 23:10:11.53ID:+A5PZLb9
喜べお前ら
こいつを追加するだけでpi_v<int>が使えるようになるぞ

template<>struct std::is_floating_point<int>:std::true_type{};
2022/04/16(土) 23:16:32.04ID:NFUA2B25
>>44
> 「状況によって『およそ 3』で計算すればよい」という指導は存在する。
指導が何を指してるのか知らんけどおよそなんてどこから出てきたんだよw
円周率3の話は 小学校学習指導要領 (平成元年3月)の下記の文言が独り歩きしたものだぞ

円周率としては3.14を用いるが、目的に応じて3を用いて処理できるよう配慮する必要がある。
https://www.mext.go.jp/a_menu/shotou/old-cs/1322329.htm
2022/04/17(日) 00:51:59.98ID:B91+2VD/
文脈的にたいして変わらない気もするけど
そんな違うものか?
2022/04/17(日) 03:44:03.45ID:GgR0k3G6
>>46
3.14だっておよそでしかない
およそ3で全然問題ないと思うね。
それより
1.6+2.4 = 4.0 と答えたら減点するアホ文系教師を文科省はなんで放置するのかね?
掛ける順番とかな。工数とかシランだろな多分
単位とかでもあほ文系小学校教師が理解してるとは到底思えない
2022/04/17(日) 08:47:30.67ID:+WDep4l2
>>48
小学校の先生が悪いんじゃない
小学校の先生を指導監督する文部省の官僚に問題があるとおもいますよ、ハノンQZ
2022/04/17(日) 10:32:47.71ID:1NqFVDwl
>>46
そこだけ見て「ゆとりも3.14で教わってる」って誤解されてるけど
一緒に3ケタの掛け算も廃止になったのが本当の大問題なんだよ
最初に「円周率とは」で一度3.14と教えた後の計算問題は全部3でやるしかなかった
51デフォルトの名無しさん
垢版 |
2022/04/17(日) 10:40:02.85ID:bm11jv7N
算数教育を破壊された影響は凄まじいな
マスゴミの煽動記事みて何人に1人の奇病なのかもわからないバカばっかりになっちまった
2022/04/17(日) 11:00:54.26ID:xNW3vj+F
現実には3で十分なわけよ
わずか数%の違いしかなく困らない
どうしても必要なら3.1でいい
これならわずか1%強の違いしかない
逆に工業で必要とする時は3.14でも足りないこともある
つまり3.14にこだわっているやつこそバカであると断言できる
53デフォルトの名無しさん
垢版 |
2022/04/17(日) 11:22:48.55ID:RqkDCOAY
コンピュータの場合、累積する誤差を少なくするよう定数を求めるのが最も重要なわけで。
統計的に3.17がπとして相応しいことがわかっています。
2022/04/17(日) 11:27:42.82ID:9gjwfasM
そら分かる子はいいよ
ほっといても算数なんてすぐ分かるやろ
数というもんの抽象性も理解できるし
かける順番にこだわることのアホさも自分で分かるやろ
でも
ひとクラス何十人のうちの算数分からん子
知能指数もボーダーの子
発達障害の子
その子らになんとかして分かってもらおうとすると
あの手この手でいろいろやってみるんやろな
55デフォルトの名無しさん
垢版 |
2022/04/17(日) 11:29:26.25ID:RqkDCOAY
共産主義じゃないんだから馬鹿な子は馬鹿な大人に育てば良い。
みんな違ってみんな良い。
2022/04/17(日) 11:30:31.73ID:n4FXzdR7
>>50
> 一緒に3ケタの掛け算も廃止になったのが本当の大問題なんだよ
だからそれもフェイクだっつーのw

(1)内容の「A数と計算」の(3)及び(4)については、乗数や除数が3位数である場合の指導は、2位数までの考え方を基にして児童に考え出させるようにするとともに、複雑な計算を避けるものとする。

だからこれに従うと円周率は3.1となるはず
これと上に書いた「目的に応じて3で計算」を(多分わざと混ぜて)某学習塾が
『ウッソー!?円の面積を求める公式 半径×半径×3!?』
『円周率を3.14ではなく、「およそ3」として円の求積計算を行います』
って広告打ったのが元凶と言われてる
57デフォルトの名無しさん
垢版 |
2022/04/17(日) 11:34:11.45ID:RqkDCOAY
円周率なんて生きてく上で必要ない。
2022/04/17(日) 11:50:12.40ID:0uPuuShy
なんのスレやねん
59デフォルトの名無しさん
垢版 |
2022/04/17(日) 14:31:08.08ID:gu8d6tY+
お礼と報告が大変遅くなりましたがID:aidqFE7S でございます。
この度は有用なアドヴァイス大変ありがたく承っております。

>>25
mainで走らせている実処理の前に、インライン変数のコンストラクタが起動しているので、リンカ?の際に記述と同時に外部結合?させているのではないかとしか推察できませんでした……
質問が理解できていないかもしれないのですが東方初学者ですので何卒。

>>27
受け渡しを省略したいという助平心でございます……
この記述で動作確認しました。
ありがとうございます!


テンプレートは食わず嫌いでしたが、使ってみると奥深いものですね。
関数定義にstatic T& Instance();と記述したらちゃんと内部結合?になっていました。凄い。

本物のグローバル変数とはdllを跨いでも使える変数なのでしょうか?
dellについて少し調べたのですがよくわかりませんでした。
クラス内部の静的変数はプログラムのどこからでも一位だと思っていましたが、外部結合のstaticは役割が違うのかしら。
もうちょっと調べてみます。
ありがとうござまいした。
2022/04/17(日) 14:39:47.64ID:smuc31S1
>>59
使えるよ、シンボルが見えるなら。
でも疎結合の方が絶対に良いので使わんほうがいいよ
2022/04/17(日) 15:27:41.39ID:98II7f1E
試したことないけどあれって全く関係ないdllからアドレス指定して値書き換えたり出来るの?
2022/04/17(日) 15:35:49.78ID:smuc31S1
リンクできてれば大丈夫よ
マネージドなやつが混ざってたらやらん方がええかもね
2022/04/17(日) 16:23:54.03ID:wFJvf5tq
このスレ永久に同じ奴の自演でループしてるな
いつも同じ間違いで止まってるし
2022/04/18(月) 00:21:25.50ID:6Qt778/v
msvcのstd::lerp妙に遅かったから実装見たらめっちゃ厳重に引数チェックしてた
秒間何億回も呼び出す用途想定してないのか実装がまずいのか…とりあえず自分で書き直したわ
65デフォルトの名無しさん
垢版 |
2022/04/18(月) 07:14:50.33ID:t3NwdXGg
デバッグビルド?
2022/04/18(月) 07:52:49.52ID:wKhqv1yX
引数が有限でない場合の処理が入ってるからだろ
そもそもそんなものを使おうとする方がどうかしてる
2022/04/18(月) 08:47:21.12ID:UwAS9GUd
どんなチェックするとそんな負担になるの?
2022/04/18(月) 09:07:36.22ID:Mq4dF/46
場合分けはしているが、仕様に対して過不足ない実装だと思う。
https://github.com/microsoft/STL/blob/472161105d596192194d4715ccad307c6c163b4a/stl/inc/cmath#L1234-L1326
2022/04/18(月) 09:18:05.41ID:Dpn9nQkn
>>68
明らかに無駄だな
無チェックな関数を提供すべき

チェック不要な自明な使い方で速く動くことがあるべき姿
もし必要ならば自分でチェックすれば良いしチェック用関数を提供してもよい
2022/04/18(月) 09:44:52.69ID:Mq4dF/46
>>69
どれが (言語仕様上) 必要ない部分なのか具体的に示して。 俺には見つけられない。
それとも言語仕様が過剰であるという意味?
71デフォルトの名無しさん
垢版 |
2022/04/18(月) 09:53:11.17ID:t3NwdXGg
配列の範囲チェックと似たような話だろ
2022/04/18(月) 09:56:20.66ID:OY9HJtti
一般的に渡ってきた引数に対してチェックをせず処理する関数と厳重にチェックしてから処理する関数の二つを提供すればいいんじゃない?
もちろん後者はチェックしてから前者を呼び出すことになる
チェック不要が自明な時や何度も呼び出す時は前者で十分
2022/04/18(月) 10:05:07.63ID:s/nYZOWf
しかしニッチな機能だね
使うときは使うんだろうけど、これをあえて標準で用意するのは不思議
74デフォルトの名無しさん
垢版 |
2022/04/18(月) 10:06:44.44ID:t3NwdXGg
スクロールバーやプログレスバーで使いそう
過去にそのあたりのコード書いた当時あったらなって
2022/04/18(月) 10:30:18.10ID:Mq4dF/46
>>72
一般論としてはそうだが、論点はそこじゃない。
MSVC の std::lerp は定義域のチェックをやっていない。
なので >>69 の言う「チェック」は引数の妥当性のチェックのことではない。
2022/04/18(月) 11:30:20.45ID:wKhqv1yX
>>73
たいていの用途で必要なのは
const auto _Candidate = _ArgA + _ArgT * (_ArgB - _ArgA);
だけだからなぁ
誰がなんのためにこれを入れようと思ったのかよくわからんね
77デフォルトの名無しさん
垢版 |
2022/04/18(月) 12:37:29.31ID:s8zWy/Nc
using L=numeric_limits<double>;
a=L::max();b=L::lowest();

この場合お前らの言う「最小限の実装」だと結果がNaNになったりするぞ
オーバーフローとか切り捨て/切り上げとかに気を使わなくていいように標準でこういうのが用意されてるんだよ
2022/04/18(月) 16:42:06.25ID:6Qt778/v
>>76
その式の形だとFMA命令に最適化されて良さそうだな
2022/04/18(月) 17:19:17.33ID:pd6PCcNf
そもそも何億回も呼び出すなら<math>のfma(...)使うんじゃねえの
<cmath>はどんな引数つっこまれても何とか対処しなきゃならんのが絶対条件
80デフォルトの名無しさん
垢版 |
2022/04/18(月) 19:27:11.79ID:DmcgzGUS
using L=numeric_limits<double>;
a=L::max();b=L::lowest();

この場合お前らの言う「最小限の実装」だと結果がNaNになったりするぞ
オーバーフローとか切り捨て/切り上げとかに気を使わなくていいように標準でこういうのが用意されてるんだよ
81デフォルトの名無しさん
垢版 |
2022/04/18(月) 20:05:50.33ID:t3NwdXGg
>>79
sqrt(-1.0)でcomplex返さにゃならんの?
2022/04/19(火) 04:23:27.96ID:M6r3Rc52
nanだのinfだの>>81だのをグチャグチャとチェックしたがる奴は無能
最初からそういうのが発生しないように計算するべき
83デフォルトの名無しさん
垢版 |
2022/04/19(火) 06:18:55.90ID:0L/+n52g
ゼロ除算とかね
2022/04/19(火) 14:44:51.44ID:0UVfIqO/
libc遅いだの愚痴りながら低レイヤーのコード書いてる時が正直一番楽しい
85デフォルトの名無しさん
垢版 |
2022/04/19(火) 14:50:47.69ID:0L/+n52g
人によるけどね
俺もマシン寄りのところが好き
2022/04/19(火) 23:13:42.68ID:fQcWHs5l
MC++Dが20年前に発売されたってすげーな
アンドレイって天才だろ
2022/04/20(水) 19:24:03.82ID:q+GeEjNV
移住して快適な掲示板

NEXT2ch
3ch
45ch
明和水産
  
などへ
88デフォルトの名無しさん
垢版 |
2022/04/20(水) 20:22:28.34ID:Cwlkz3kl
二度と帰ってくるなよ
2022/04/20(水) 21:01:40.29ID:q+GeEjNV
居座るなら二度と文句言うなよ
2022/04/20(水) 22:15:36.38ID:4qIYThBV
>>89
早速帰ってきてて草
2022/04/21(木) 08:12:05.34ID:lT6JRJu8
今どき戻り値intでエラーコードとか使うなよCの書き方じゃねぇかとか思ってた
だけどC++17のvariantでエラーコード返したり、optional使ってエラー表現してるコードを見てちょっと感心した
しかしとはいえこういうやり方と例外ぶん投げるやり方ってどっちがいいんだろう?ググっても割りと論争あってよくわからんかった
2022/04/21(木) 08:41:18.15ID:uyGzUV2B
>>91
制御フローを変更する必要がある場合は例外、それ以外(エラーもフローの一部の時)はoptionalでいいんじゃない?
例外は性能ペナルティーあるし、あんまり使うものじゃないと思うわ。

例えばメモリ確保失敗とかはプログラムの続行が難しいから、安全に終了するメモリ異常時の終了フローに移行できるよう例外を使うといいかと。
2022/04/21(木) 09:00:35.99ID:9qc6sZDy
一部で悪名高い例外はマルチスレッドでこそ重宝すると思うんだが
2022/04/21(木) 09:09:09.66ID:3fppYdMF
例外はやばいエラーと普通のエラーを分けて欲しいわ
後者はあんまり遠くへ飛ばんでほしい
95デフォルトの名無しさん
垢版 |
2022/04/21(木) 09:18:47.88ID:TFObbQ1T
異常系は例外、準正常系はエラー
という方針がええな
2022/04/21(木) 09:50:55.00ID:uYH/mfeQ
ここだけの話ちゃんとした例外処理書かれたコード読んだ事がない
2022/04/21(木) 11:09:48.62ID:Ex423fK8
例外って、移行の処理を全く出来なくね
try{
a();
b();
c();
}
catch(...)
{
}

a()がコケても、何がしかの条件をかえてb()いこうを実行したいときなんて不便
try tryなんてやりだしたら、各関数の戻り値をifで判断しているのと同じだし
98デフォルトの名無しさん
垢版 |
2022/04/21(木) 11:15:18.89ID:Nb12Wot+
言い出したらキリないからだろ
a()がコケたあとC()から再開とか無数にあるから
try {
a();
b();
c();
}
catch(std::exception& e)
{
if(dynamic_cast<f*>(&e))
{
if(dynamic_cast<g*>(&e))
{
b();
}
c();
}
}
2022/04/21(木) 11:17:35.59ID:9+GFB0OX
例外処理でどこまでカバーするかってのは初期には色々と検討されてる。
でも結局のところ「あきらめて終わる」「条件を変えてやり直しする」が圧倒的多数で
その他は言語機能としてサポートする必要ないレベルのレアケースだと判断された。

>>97
そういう場合は諦めて try をネストしたり連鎖したりしてなんとかしろってことだ。
少なくとも言語仕様をより複雑にするほどではない。
2022/04/21(木) 11:31:04.81ID:3fppYdMF
>>97
まあ分岐じゃなくて脱出を目的にするのが筋で、そういう制御はしない
王道ルートを一本バシッと決めないと
2022/04/21(木) 11:51:54.97ID:Ex423fK8
>>100
それなら
if(!a()) goto ERROR;
でよくね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況