[過去ログ] C++相談室 part165 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
782: デフォルトの名無しさん (ワッチョイ e563-0why) [sage] 2025/03/23(日) 01:58:28.60 ID:IgihfQRv0(1/4) AAS
>>778
778(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ ed32-PAPZ) [sage] 2025/03/23(日) 00:18:05.56 ID:Ft35v0Bz0(1/3) AAS
>>777
私は Visual Stuio 2022 (MSVC 17) にコンパイルさせてエラーが出ないことを確認した上で書いてる。
手元に Visual Studio を入れていないのでオンラインコンパイラだけど。
コードを呼び出す側なども補うとたぶんこんなのだよね? 私が問題の理解を間違えている箇所はある?

#include <memory>

class Foo {
private:
static std::unique_ptr<Foo> m_pObj;
Foo(void) = default; // デフォルトコンストラクタはプライベート

public:
static Foo* createInstance() {
if (m_pObj == NULL) {
m_pObj = std::unique_ptr<Foo>(new Foo);
}
return m_pObj.get();
}
};

std::unique_ptr<Foo> Foo::m_pObj;

int main(void) {
auto bar = Foo::createInstance();
}
>>779
779(1): デフォルトの名無しさん (ワッチョイ ed7c-etgo) [sage] 2025/03/23(日) 00:19:16.26 ID:YXTjT4M+0(1/2) AAS
通ったが?
外部リンク:godbolt.org
お騒がせしましたサーセン;;;orz ビルドが通らないというのは私めの勘違いだった模様。
コードはそれで良いです。
そのコード(最小サンプル)、および最小サンプルにする前のコード×VS2015でもfriend宣言部分をコメントアウトしてビルドが通った 。n_

フレンド宣言friend std::unique_ptr<Foo>; を付けるに至った履歴が無いので推測ですだが
デストラクタがprivateのままだったタイミングがあったのかも……
(m_pObjが生ポインタのタイプのSingletonはデストラクタがprivateでもビルドが通る(デストラクタを呼ぶ人が居ないため)
 →この状態でm_pObjをstd::unique_ptr<Foo>に変更してビルドエラー、アクセス許可が無いとコンパイラに言われて慌ててfriend追加、だった可能性、
787: デフォルトの名無しさん (ワッチョイ e563-0why) [sage] 2025/03/23(日) 10:56:08.84 ID:IgihfQRv0(2/4) AAS
>>784
784(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ ed32-PAPZ) [sage] 2025/03/23(日) 09:32:31.18 ID:Ft35v0Bz0(2/3) AAS
元の話題からはずれる余談だけれど、静的記憶域期間を持つブロックスコープの変数は最初に通過したときに初期化されるルールがある。 (条件によるので常にではない。)
外部リンク[dcl]:timsong-cpp.github.io
なのでシングルトンパターンはこう単純化して書くことも出来る。

#include <memory>

class Foo {
Foo() = default;
public:
static Foo* createInstance() {
static std::unique_ptr<Foo> m_pObj = std::unique_ptr<Foo>(new Foo);
return m_pObj.get();
}
};

int main(void) {
auto bar = Foo::createInstance();
}
サンプルコードでは省略したけんども、Double-checked lockingの実験をしたかったノデス!
■ Double-Checked Locking is Fixed In C++11
外部リンク:preshing.com

つなみに関数内staticオブジェクト初期化(初回実行時)のスレッド安全性がどうーなっているのかは
よく知りま栓(よって採用には消極的

>>785
785(2): デフォルトの名無しさん (ブーイモ MM19-xG3a) [sage] 2025/03/23(日) 10:12:01.75 ID:i5B9IukZM(1) AAS
それunique_ptrにする意味ある?
shared_ptrなら意味わかるけど
Singletonなので誰からもshareされないし……
この場合むしろshared_ptrの方が牛刀な可能性もあるし……
なぜなら、std::shared_ptrの参照カウンタはその利用特性上
異なるスレッドから非同期にインクリメント/デクリメントされることを想定せざるおえず、
スレッド安全性担保がそこそこ重い同期オブジェクトで一方unique_ptrの所有権移動は非同期に行われることはなさげ
788: デフォルトの名無しさん (ワッチョイ e563-0why) [sage] 2025/03/23(日) 10:57:59.97 ID:IgihfQRv0(3/4) AAS
すまんこTeamsのノリで途中送信すたorz
誤: スレッド安全性担保がそこそこ重い同期オブジェクトで一方unique_ptrの所有権移動は非同期に行われることはなさげ
正: スレッド安全性担保がそこそこ重い同期オブジェクトで行われている危険性がある。一方unique_ptrの所有権移動は非同期に行われることはなさげなので多分軽量
789
(1): デフォルトの名無しさん (ワッチョイ e563-0why) [sage] 2025/03/23(日) 11:03:44.18 ID:IgihfQRv0(4/4) AAS
だいたいstd::unique_ptrとstd::shard_ptrでは前者が1個のポインタと同じサイズなのに後者は2個分ある(ヒープにとられた参照カウンタへのポインタを持つため
sizeof(shared_ptr)=16
sizeof(unique_ptr)=8
というのもあり、std::unique_ptr<T>で済むところをstd::shared_ptr<T>推しするのはいかがなものか……
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.041s