※前スレ
C++相談室 part154
https://mevius.5ch.net/test/read.cgi/tech/1610096040/
テンプレここまで
探検
C++相談室 part155
■ このスレッドは過去ログ倉庫に格納されています
2021/03/24(水) 12:07:15.39ID:R+oM8cup
139デフォルトの名無しさん
2021/04/09(金) 11:44:34.26ID:B1MFSAev C++11でのstd::swapは、次のようなコードになっているそうですが、
仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
仮にt1のポインタ的なメンバにnullptr的なものが代入されない場合、
(2)でt1への代入に置いて何が起きるのか心配です。
質問の仕方を変えるならば、
share_ptrは参照カウンタ方式ですのでカウンタのアップ/ダウンは正確でなければ
なりませんが、以下の例では、いったいどの行のどの演算子(またはどの部分)で
カウントアップ/カウントダウンされるんでしょうか。
template<typename T> void swap(T& t1, T& t2) {
T temp = std::move(t1); // (1), or T temp(std::move(t1));
t1 = std::move(t2); // (2)
t2 = std::move(temp); // (3)
}
仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
仮にt1のポインタ的なメンバにnullptr的なものが代入されない場合、
(2)でt1への代入に置いて何が起きるのか心配です。
質問の仕方を変えるならば、
share_ptrは参照カウンタ方式ですのでカウンタのアップ/ダウンは正確でなければ
なりませんが、以下の例では、いったいどの行のどの演算子(またはどの部分)で
カウントアップ/カウントダウンされるんでしょうか。
template<typename T> void swap(T& t1, T& t2) {
T temp = std::move(t1); // (1), or T temp(std::move(t1));
t1 = std::move(t2); // (2)
t2 = std::move(temp); // (3)
}
140デフォルトの名無しさん
2021/04/09(金) 11:45:42.89ID:B1MFSAev >>139
誤:仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
正:(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
誤:仮に、もし(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
正:(1)が終わった直後にt1の中のポインタ型やshared_ptr<A>のメンバに
nullptr的なものが代入されるんでしょうか。
141デフォルトの名無しさん
2021/04/09(金) 11:58:14.49ID:O38yN+C3 >>138
C++03にもstd::binary_searchあるぞ
C++03にもstd::binary_searchあるぞ
142はちみつ餃子 ◆8X2XSCHEME
2021/04/09(金) 12:00:21.75ID:foJJo5gI >>139
> nullptr的なものが代入されるんでしょうか。
この場合はされる。
ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
> いったいどの行のどの演算子(またはどの部分)で
> カウントアップ/カウントダウンされるんでしょうか。
= がその役割を持っている。
ムーブコンストラクタとムーブ代入演算子によってカウントされる。
> nullptr的なものが代入されるんでしょうか。
この場合はされる。
ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
> いったいどの行のどの演算子(またはどの部分)で
> カウントアップ/カウントダウンされるんでしょうか。
= がその役割を持っている。
ムーブコンストラクタとムーブ代入演算子によってカウントされる。
143デフォルトの名無しさん
2021/04/09(金) 12:02:12.29ID:B1MFSAev >>140
どうやら、
(1) の中央の = では、TからTへの move-constructorが呼び出され、
(2)や(3) の中央の = では、TからTへの move-assignment operatorが呼び出される、
ということのようですが、
Tのmove-contructorやmove-assingment operatorは、ユーザーの実装次第で、
ユーザーがそれらを明示的に書かなかった場合の「デフォルトの定義」は
現在もまだ論争中で、標準的な仕様が決まってない、ということらしいですね。
間違っていれば指摘してください。
どうやら、
(1) の中央の = では、TからTへの move-constructorが呼び出され、
(2)や(3) の中央の = では、TからTへの move-assignment operatorが呼び出される、
ということのようですが、
Tのmove-contructorやmove-assingment operatorは、ユーザーの実装次第で、
ユーザーがそれらを明示的に書かなかった場合の「デフォルトの定義」は
現在もまだ論争中で、標準的な仕様が決まってない、ということらしいですね。
間違っていれば指摘してください。
144デフォルトの名無しさん
2021/04/09(金) 12:11:46.34ID:fGHst4+7145デフォルトの名無しさん
2021/04/09(金) 12:20:57.67ID:QYkH8yRN >>143
以下のサイトによれば、「標準的な仕様は決まっている」ようです:
drafet C++11 standareのsection 12.8のparagraph 15に
implicitly-defined copy/move constructor は、
「a memberwise copy/move of its bases and members」
であると書いてあるそうですから:
https://stackoverflow.com/questions/18290523/is-a-default-move-constructor-equivalent-to-a-member-wise-move-constructor
The implicitly-defined copy/move constructor for a non-union class X performs a memberwise copy/move of its bases and members. [ Note: brace-or-equal-initializers of non-static data members are ignored. See also the example in 12.6.2. —end note ] The order of initialization is the same as the order of initialization of bases and members in a user-defined constructor (see 12.6.2). Let x be either the parameter of the constructor or, for the move constructor, an xvalue referring to the parameter. Each base or non-static data member is copied/moved in the manner appropriate to its type:
if the member is an array, each element is direct-initialized with the corresponding subobject of x;
if a member m has rvalue reference type T&&, it is direct-initialized with static_cast(x.m);
otherwise, the base or member is direct-initialized with the corresponding base or member of x.
Virtual base class subobjects shall be initialized only once by the implicitly-defined copy/move constructor (see 12.6.2).
以下のサイトによれば、「標準的な仕様は決まっている」ようです:
drafet C++11 standareのsection 12.8のparagraph 15に
implicitly-defined copy/move constructor は、
「a memberwise copy/move of its bases and members」
であると書いてあるそうですから:
https://stackoverflow.com/questions/18290523/is-a-default-move-constructor-equivalent-to-a-member-wise-move-constructor
The implicitly-defined copy/move constructor for a non-union class X performs a memberwise copy/move of its bases and members. [ Note: brace-or-equal-initializers of non-static data members are ignored. See also the example in 12.6.2. —end note ] The order of initialization is the same as the order of initialization of bases and members in a user-defined constructor (see 12.6.2). Let x be either the parameter of the constructor or, for the move constructor, an xvalue referring to the parameter. Each base or non-static data member is copied/moved in the manner appropriate to its type:
if the member is an array, each element is direct-initialized with the corresponding subobject of x;
if a member m has rvalue reference type T&&, it is direct-initialized with static_cast(x.m);
otherwise, the base or member is direct-initialized with the corresponding base or member of x.
Virtual base class subobjects shall be initialized only once by the implicitly-defined copy/move constructor (see 12.6.2).
146デフォルトの名無しさん
2021/04/09(金) 12:39:59.46ID:QYkH8yRN >>142
>ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
>標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
>メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
なるほど。
行(1)の場合、
1. 右辺でstd::move()をt1に行った段階では(実行段階で)マシン語は全く実行されない。
2. 中央の = は、move-constructor と解釈され、Tのmove-constructorが呼び出される。
3. Tの暗黙定義のmove-constructorは、メンバ同士のmove-construcotrなので、
メンバに shared_ptr<A> a があると、shared_ptr<A>のmoveコンストラクタが呼び出される。
そして、shared_ptr<A>のmoveコンストラクタは、実行後に「src側(from側)」をnullptr相当の
状態にしてしまう。
ということのようですね。
>ムーブセマンティクス一般においてはムーブ後の抜け殻は「無効なオブジェクト」なのでアクセスに対して保証がないことがあるが、
>標準ライブラリのスマートポインタについては所有権を移動させた後にそれが空であり
>メンバ関数 get で nullptr が返ることも、 nullptr と == で比較して真であることも保証される。
なるほど。
行(1)の場合、
1. 右辺でstd::move()をt1に行った段階では(実行段階で)マシン語は全く実行されない。
2. 中央の = は、move-constructor と解釈され、Tのmove-constructorが呼び出される。
3. Tの暗黙定義のmove-constructorは、メンバ同士のmove-construcotrなので、
メンバに shared_ptr<A> a があると、shared_ptr<A>のmoveコンストラクタが呼び出される。
そして、shared_ptr<A>のmoveコンストラクタは、実行後に「src側(from側)」をnullptr相当の
状態にしてしまう。
ということのようですね。
147デフォルトの名無しさん
2021/04/09(金) 12:42:08.46ID:QYkH8yRN >>146
逆に言えば、Tのメンバに、A *pA; のような生ポインタがあると、
Tの暗黙のmoveコンストラクタ/move代入演算子では、恐らく、
「src側(from側)」にはnullptrが代入されない(??)ので、非常に困った
問題を招くかも知れないと?
逆に言えば、Tのメンバに、A *pA; のような生ポインタがあると、
Tの暗黙のmoveコンストラクタ/move代入演算子では、恐らく、
「src側(from側)」にはnullptrが代入されない(??)ので、非常に困った
問題を招くかも知れないと?
148デフォルトの名無しさん
2021/04/09(金) 12:44:10.41ID:QYkH8yRN149デフォルトの名無しさん
2021/04/09(金) 12:45:44.21ID:iOouO9yu 生ポ入りクラスに暗黙move関数定義できたっけ?
150デフォルトの名無しさん
2021/04/09(金) 18:46:49.83ID:WYvZUx+H c++についてうんちく垂れるやつに限って仕事ができない
そんなうんちくどうでもいいから、さっさと作れよって思われてる先輩いるわ
そんなうんちくどうでもいいから、さっさと作れよって思われてる先輩いるわ
151デフォルトの名無しさん
2021/04/09(金) 19:06:14.56ID:PF0aPDJN >>150
プログラマは怠惰であれ、を地で行ってるんだろう
プログラマは怠惰であれ、を地で行ってるんだろう
152デフォルトの名無しさん
2021/04/09(金) 19:55:10.43ID:O38yN+C3 >>144
> わざわざ誰が書いたかわからないようなものより自作できるなら自作するだろ
おまえは一生二度とライブラリもOSも使うな
ベアメタルだけで食っていけ
それができたら、おまえに付いてくる者たちが顕れるだろう
できなければ人知れず消えるだけだ
どうなりたいかは、お前の人生だ
俺がどうしろとは言えない
> わざわざ誰が書いたかわからないようなものより自作できるなら自作するだろ
おまえは一生二度とライブラリもOSも使うな
ベアメタルだけで食っていけ
それができたら、おまえに付いてくる者たちが顕れるだろう
できなければ人知れず消えるだけだ
どうなりたいかは、お前の人生だ
俺がどうしろとは言えない
153デフォルトの名無しさん
2021/04/09(金) 20:38:18.09ID:8YMfBGcF >>150
またお前か。さっさとプログラミング覚えろよ
またお前か。さっさとプログラミング覚えろよ
154デフォルトの名無しさん
2021/04/09(金) 23:03:48.36ID:mQjFjskh std::binary_search()は戻り値とかなんとboolや
こんなのよかちゃんと位置を返してくれるstd::lower_bound()の方がよっぽど使いでがある
ちなstd::lower_bound()が2分探索か線形探索かは使うイテレータの条件次第
こんなのよかちゃんと位置を返してくれるstd::lower_bound()の方がよっぽど使いでがある
ちなstd::lower_bound()が2分探索か線形探索かは使うイテレータの条件次第
155デフォルトの名無しさん
2021/04/09(金) 23:08:01.53ID:mQjFjskh std::lower_bound()が線形探索だと断言してくださる香ばしいblogも世の中にはあるが
https://rsk0315.hatenablog.com/entry/2019/09/10/173708
これがまつがいであることは比較関数の中でprintf()でもしたらたちどころにワカル
https://rsk0315.hatenablog.com/entry/2019/09/10/173708
これがまつがいであることは比較関数の中でprintf()でもしたらたちどころにワカル
156デフォルトの名無しさん
2021/04/09(金) 23:29:26.43ID:mQjFjskh ゴメソリンク先は必ずしも断言はしていなくって、std::set<T>にstd::lower_bound()を適用する例か、
これのイテレータはrandom-access iteratorでないから確かに線形探索になる
これのイテレータはrandom-access iteratorでないから確かに線形探索になる
157デフォルトの名無しさん
2021/04/10(土) 02:28:09.12ID:+Yr/nSyJ158デフォルトの名無しさん
2021/04/10(土) 13:02:03.74ID:62UJIlpX159デフォルトの名無しさん
2021/04/10(土) 13:04:24.60ID:ziRUnSTY160デフォルトの名無しさん
2021/04/11(日) 21:20:47.36ID:aRgjPq06 コンパイラはともかくリンカに計算負担をかけるのはバカな設計だなと思うわ。
161デフォルトの名無しさん
2021/04/11(日) 21:31:53.64ID:X3ahc6YE >>160 何の設計の話?
162デフォルトの名無しさん
2021/04/11(日) 22:03:18.21ID:oDlLzjRc 暗黙のmoveがnullptr代入してくれないとか生ポあるクラスに暗黙のctor定義してくれるのか、とか
学ぶ順番間違えて勘違いしてるやつ上の方にいるけど
そもそも生ポの扱いに言語が介入するんならdtorでdeleteしてくれるのか、とか考えつかないのかね・・
学ぶ順番間違えて勘違いしてるやつ上の方にいるけど
そもそも生ポの扱いに言語が介入するんならdtorでdeleteしてくれるのか、とか考えつかないのかね・・
163デフォルトの名無しさん
2021/04/11(日) 22:28:21.28ID:AbYQFAoI 質問者はポインタ型とshared_ptrについて聞いてたのに、shared_ptrのことしか答えなかった餃子が悪い。
謝れ!俺に
謝れ!俺に
164デフォルトの名無しさん
2021/04/12(月) 13:47:17.66ID:SAslKmLH 指定ソフトのFWを許可するAPI教えてくださいよ
165はちみつ餃子 ◆8X2XSCHEME
2021/04/12(月) 15:59:50.47ID:8pnQviW4 そうか。
166デフォルトの名無しさん
2021/04/12(月) 18:14:36.03ID:jbHGiSQO 皆さま御機嫌よう、ちょっと質問させてください
class hogeの内部でenum class fugaを定義し、
そのfugaをclass hogehoge でメンバ変数として使用したいのですが、
hogehoge のヘッダーにはなるべくhoge をインクルードさせたくありません。
もちろんfuga変数はヘッダーに置いて使用したいのですが……
前方宣言でfugaを宣言してもhoge::fugaと互換?が無いため代入が出来ません。
キャストで戻したりして使っているのですがこれならintでもいいかなと……
クラス内クラスの前方宣言は難しいのでしょうか?
何か方法がありましたら教えていただきたく……
class hoge{
enum class fuga{
one,two,three,SUM
};
};
//ヘッダーはソースにインクルードしたい
class hogehoge{
hoge::fuga mfuga;
};
こんかかんじで使いたいのですがエラーになってしまいsまずorz
class hogeの内部でenum class fugaを定義し、
そのfugaをclass hogehoge でメンバ変数として使用したいのですが、
hogehoge のヘッダーにはなるべくhoge をインクルードさせたくありません。
もちろんfuga変数はヘッダーに置いて使用したいのですが……
前方宣言でfugaを宣言してもhoge::fugaと互換?が無いため代入が出来ません。
キャストで戻したりして使っているのですがこれならintでもいいかなと……
クラス内クラスの前方宣言は難しいのでしょうか?
何か方法がありましたら教えていただきたく……
class hoge{
enum class fuga{
one,two,three,SUM
};
};
//ヘッダーはソースにインクルードしたい
class hogehoge{
hoge::fuga mfuga;
};
こんかかんじで使いたいのですがエラーになってしまいsまずorz
167デフォルトの名無しさん
2021/04/12(月) 18:58:57.80ID:jbHGiSQO enum classはグローバルに置いた方がいいんでしょうか?
任意のクラス内部で規定したいenumが見た目も便利だと思ったのでなるべく入れ子にしたかったのですが
任意のクラス内部で規定したいenumが見た目も便利だと思ったのでなるべく入れ子にしたかったのですが
168デフォルトの名無しさん
2021/04/12(月) 19:30:43.48ID:e7ZnlCa0 >>167
hoge をインクルードしないところで hoge::fuga を使いたいということは
fuga は hoge にそれほど強く結びついていないということで、外に出すのが妥当なのでは?
外に置いたうえで hoge 内で using fuga = outer_fuga とでもすれば、見た目は損なわれないだろうし。
hoge をインクルードしないところで hoge::fuga を使いたいということは
fuga は hoge にそれほど強く結びついていないということで、外に出すのが妥当なのでは?
外に置いたうえで hoge 内で using fuga = outer_fuga とでもすれば、見た目は損なわれないだろうし。
169デフォルトの名無しさん
2021/04/12(月) 19:43:07.58ID:jbHGiSQO170デフォルトの名無しさん
2021/04/12(月) 19:43:19.37ID:jbHGiSQO ありがとうございました
171デフォルトの名無しさん
2021/04/13(火) 19:17:47.93ID:CekyfU50 std::sortがセーフソートかどうかって決まってないんですね?
172デフォルトの名無しさん
2021/04/13(火) 19:20:46.00ID:dUpGrFVX セーフソートとは何なのか、決まってないですね。
173デフォルトの名無しさん
2021/04/13(火) 19:49:36.98ID:3ATJKALM 安定ソートのことならstd::stable_sortを使え
174デフォルトの名無しさん
2021/04/13(火) 20:39:25.63ID:E/HY6RLS std::stable_sort<T>はどうしてもstd::sort<T>より遅い
からstd::stable_sort<T>で安定ソートするテクニックが存在するし需要がある
からstd::stable_sort<T>で安定ソートするテクニックが存在するし需要がある
175デフォルトの名無しさん
2021/04/13(火) 20:57:29.81ID:E/HY6RLS もちろんタダでというわけにはいかずn個のTのソーティングに対しn個の整数型の配列が別途必要だがとにかくできる
176デフォルトの名無しさん
2021/04/13(火) 20:58:57.72ID:E/HY6RLS まつがえたorz
誤: std::stable_sort<T>
正: std::sort<T>
誤: std::stable_sort<T>
正: std::sort<T>
177デフォルトの名無しさん
2021/04/13(火) 21:07:31.95ID:E/HY6RLS 計算量の仕様からすると何だかんだ言って
std::stable_sort<T>の中身はマージソートで、
std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
ぐらいしかありえない
std::stable_sort<T>の中身はマージソートで、
std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
ぐらいしかありえない
178デフォルトの名無しさん
2021/04/13(火) 21:10:52.16ID:CekyfU50 みなさんありがとうございます
安定ソートのことでした
安定ソートのことでした
179デフォルトの名無しさん
2021/04/14(水) 05:40:12.90ID:OwJGUJdo > std::stable_sort<T>の中身はマージソートで、
これはまあそんなもうだろうけど
> std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
なんでここまで限定するんだ?
これはまあそんなもうだろうけど
> std::sort<T>の中身はイントロソートとクイックセレクトとクイックソートの複合技
なんでここまで限定するんだ?
180デフォルトの名無しさん
2021/04/14(水) 06:51:50.47ID:1+2DD+HN https://cpprefjp.github.io/reference/algorithm/sort.html
>C++11以降: O(N log N) (N == last - first) 計算量での比較
>クイックソートは平均計算量がO(N Log N)だが、最悪計算量がO(n^2)である。そのため、C++03の計算量要件には合致するが、C++11の要件には合致しない
>C++11以降: O(N log N) (N == last - first) 計算量での比較
>クイックソートは平均計算量がO(N Log N)だが、最悪計算量がO(n^2)である。そのため、C++03の計算量要件には合致するが、C++11の要件には合致しない
181デフォルトの名無しさん
2021/04/14(水) 06:52:54.28ID:mDTOVFC3 ubuntuでの開発環境って何があるんでしょうか?
openglなのでc++を使うことになると思うんですが、c++はideとしてvscodeでいいですよね
guiは何が一般的なんでしょうか?
openglなのでc++を使うことになると思うんですが、c++はideとしてvscodeでいいですよね
guiは何が一般的なんでしょうか?
182デフォルトの名無しさん
2021/04/14(水) 07:20:31.68ID:OwJGUJdo > この関数には、特定のアルゴリズムで実装すべきという規定はない
183デフォルトの名無しさん
2021/04/14(水) 07:23:57.67ID:OwJGUJdo 古典的なソート議論はユニプロセッサ前提
今どきの並列化の流れに必ずしも当てはまるとは思えない
今どきの並列化の流れに必ずしも当てはまるとは思えない
184デフォルトの名無しさん
2021/04/14(水) 07:27:25.07ID:B6LD9tEC boost::sort::pdqsort(), boost::sort::block_indirect_sort() あたりならヘッダーだけで並列ソートできる
185デフォルトの名無しさん
2021/04/14(水) 09:23:48.49ID:hYFflu6b >>181
GUIなんか使わないのが一般的だよ
開発環境にわざわざC++とLinuxを選ぶような人は自分用アプリにGUIなんて組み込まないだろうし、
他人に使わせるならどうせWindowsでテストしなきゃいけないからLinuxなんて時間の無駄だ
OpenGLだったらOpenGLの描画結果を表示するウィンドウとターミナルでいい
GUIなんか使わないのが一般的だよ
開発環境にわざわざC++とLinuxを選ぶような人は自分用アプリにGUIなんて組み込まないだろうし、
他人に使わせるならどうせWindowsでテストしなきゃいけないからLinuxなんて時間の無駄だ
OpenGLだったらOpenGLの描画結果を表示するウィンドウとターミナルでいい
186デフォルトの名無しさん
2021/04/14(水) 10:52:22.55ID:OwJGUJdo 自分用アプリねえ
俺の定規ウインドウなんてGUIだけど
俺の定規ウインドウなんてGUIだけど
187デフォルトの名無しさん
2021/04/14(水) 11:09:58.93ID:lMgtIJ1Q 定規ww
188デフォルトの名無しさん
2021/04/14(水) 12:59:06.52ID:mDTOVFC3189デフォルトの名無しさん
2021/04/14(水) 16:06:34.29ID:qBzPSYhh 定規がとても気になる
190デフォルトの名無しさん
2021/04/14(水) 16:25:09.90ID:qBzPSYhh ぐぐったら沢山出てきた
頭が悪くて理解出来ないけど需要あるんだね
頭が悪くて理解出来ないけど需要あるんだね
191デフォルトの名無しさん
2021/04/14(水) 17:07:15.14ID:X49CrYgb unique_ptr<hoge> 自体が型名なんでしょうか?
class unique_ptr<hoge>で前方宣言してもいいのかな?
class unique_ptr<hoge>で前方宣言してもいいのかな?
192デフォルトの名無しさん
2021/04/14(水) 18:15:29.38ID:OwJGUJdo 明示的な具現のつもりなら構文が違うね
193デフォルトの名無しさん
2021/04/14(水) 18:22:49.87ID:X49CrYgb 素人なんで自分の説明が難あると思うんだけど自分なりに精一杯説明すると、
ヘッダー部の引数にclass unique-ptr<hoge>& uhogeを載せて、
ソース部にhoge.hをインクルードして定義する感じでつかいたんだけども……
試してみたけど動くんだけどなんか怖い
想像ではunique-ptr<class hoge>が前方宣言だと思ってたもので……
どこをどう調べればいいのかだけでも教えていただければ……
ヘッダー部の引数にclass unique-ptr<hoge>& uhogeを載せて、
ソース部にhoge.hをインクルードして定義する感じでつかいたんだけども……
試してみたけど動くんだけどなんか怖い
想像ではunique-ptr<class hoge>が前方宣言だと思ってたもので……
どこをどう調べればいいのかだけでも教えていただければ……
194はちみつ餃子 ◆8X2XSCHEME
2021/04/14(水) 18:34:21.63ID:VF/LllcQ >>191
テンプレートのインスタンス化は暗黙にやってくれるので基本的にはする必要がない。
どうしても宣言したいのなら
extern class unique_ptr<hoge>;
と書くことは可能。
ただし、このように宣言した場合には暗黙のインスタンス化は抑制されるので、
別の場所で明示的インスタンス化をしておく必要がある。
テンプレートの展開はその仕組み上、各翻訳単位ごとにやった上でリンク時に統合されるというクソみたいなことになってるので、
コンパイル時間を抑制したいなどの理由でこういった変なことになってる。
テンプレートのインスタンス化は暗黙にやってくれるので基本的にはする必要がない。
どうしても宣言したいのなら
extern class unique_ptr<hoge>;
と書くことは可能。
ただし、このように宣言した場合には暗黙のインスタンス化は抑制されるので、
別の場所で明示的インスタンス化をしておく必要がある。
テンプレートの展開はその仕組み上、各翻訳単位ごとにやった上でリンク時に統合されるというクソみたいなことになってるので、
コンパイル時間を抑制したいなどの理由でこういった変なことになってる。
195デフォルトの名無しさん
2021/04/14(水) 18:51:48.53ID:X49CrYgb ユニークポインタ自体の大きさが、ポインタだから4バイトくらいに統一されているのかな?
型テンプレートがどんな型でも、定義部分で明示してあればポインタ長のメモリをアロケートされているから、宣言自体はある程度の許容範囲があるということなのかな?
理解が違ってたらすいません
型テンプレートがどんな型でも、定義部分で明示してあればポインタ長のメモリをアロケートされているから、宣言自体はある程度の許容範囲があるということなのかな?
理解が違ってたらすいません
196デフォルトの名無しさん
2021/04/14(水) 19:01:58.75ID:IrZTmcl1197デフォルトの名無しさん
2021/04/14(水) 19:39:51.01ID:udtyfuhd 前方宣言というのはあくまで「こういう名前のこういう奴が(どっかに)いますよ」って言ってるだけ
実体がどんなサイズでどんな値やメンバやなんやかんやを持ってるかとかには関知しない
実体がどんなサイズでどんな値やメンバやなんやかんやを持ってるかとかには関知しない
198はちみつ餃子 ◆8X2XSCHEME
2021/04/14(水) 21:35:38.45ID:VF/LllcQ >>196
> 明示的インスタンス化しておけばコンパイル時間抑制できるの?
ちがうちがう。
extern のほう (宣言) が暗黙のインスタンス化を抑制するからコンパイル時間が短縮されることが期待できる。
でも、インスタンス化を抑制するんだからどこか別の翻訳単位に実体が存在する必要はあって、
それに明示的インスタンス化を使えるようになってるって話。
> 明示的インスタンス化しておけばコンパイル時間抑制できるの?
ちがうちがう。
extern のほう (宣言) が暗黙のインスタンス化を抑制するからコンパイル時間が短縮されることが期待できる。
でも、インスタンス化を抑制するんだからどこか別の翻訳単位に実体が存在する必要はあって、
それに明示的インスタンス化を使えるようになってるって話。
199デフォルトの名無しさん
2021/04/14(水) 22:23:18.21ID:IrZTmcl1 あーなるほどね、thx
200デフォルトの名無しさん
2021/04/14(水) 22:43:29.65ID:B6LD9tEC 今時コンパイル時間を稼ぐとかどうなの
201デフォルトの名無しさん
2021/04/14(水) 23:07:25.20ID:IrZTmcl1 リッチにテンプレート使いまくって一本ソフト書いてみ
まぁわかりやすいのはspiritとかのET使ったやつ、それを複数のソースファイルで使いまくればわかる
さらに言えば自分でそういうライブラリ書いて少しの変更でほぼフルビルドかかるのを体験すればわかるやろ
まぁわかりやすいのはspiritとかのET使ったやつ、それを複数のソースファイルで使いまくればわかる
さらに言えば自分でそういうライブラリ書いて少しの変更でほぼフルビルドかかるのを体験すればわかるやろ
202デフォルトの名無しさん
2021/04/15(木) 00:02:44.73ID:5MHywbxF >>200
今時コンパイル時間を気にしないほうが頭悪いわ。
今時コンパイル時間を気にしないほうが頭悪いわ。
203デフォルトの名無しさん
2021/04/15(木) 00:26:49.07ID:daBkAWQM いまいちメタプの必要性が理解できん
コンパイル時に決定してる値しか計算できないんでしょ
3の階乗は計算できるけど、ユーザーから入力された値の階乗は計算出来ないって・・・
だったらはなから6ってハードコーディングしとけ
コンパイル時に決定してる値しか計算できないんでしょ
3の階乗は計算できるけど、ユーザーから入力された値の階乗は計算出来ないって・・・
だったらはなから6ってハードコーディングしとけ
204はちみつ餃子 ◆8X2XSCHEME
2021/04/15(木) 00:38:40.10ID:FEj8Wx1j205デフォルトの名無しさん
2021/04/15(木) 00:54:46.36ID:3EsQmY5s >>203
こういう書き方出来たら便利なのにな、とかを無理矢理実現できるというロマンはある
(マクロと似たようなもんだが
プロパティみたいなことも一応出来るし
ただまぁ・・・労力に見合うか、というと散々だわマジで。
持て囃すようなものでは決してない(他人のふんどしでドヤりたい連中が持て囃してるだけ
こういう書き方出来たら便利なのにな、とかを無理矢理実現できるというロマンはある
(マクロと似たようなもんだが
プロパティみたいなことも一応出来るし
ただまぁ・・・労力に見合うか、というと散々だわマジで。
持て囃すようなものでは決してない(他人のふんどしでドヤりたい連中が持て囃してるだけ
206デフォルトの名無しさん
2021/04/15(木) 00:59:45.76ID:5MHywbxF >>203
まあ実際ビルドシステムを自分で構築するかコンパイラにやらせるかの違いしかない。
フーリエ変換の係数みたいなものを事前に設定するとかは少し便利かもね。
それなりに手計算すると大変だけれどそこまで本格的に計算時間がかからないような
事前計算できて使いまわせるようなものが念頭にあるんだろうが、まあそんなないわな。
まあ実際ビルドシステムを自分で構築するかコンパイラにやらせるかの違いしかない。
フーリエ変換の係数みたいなものを事前に設定するとかは少し便利かもね。
それなりに手計算すると大変だけれどそこまで本格的に計算時間がかからないような
事前計算できて使いまわせるようなものが念頭にあるんだろうが、まあそんなないわな。
207はちみつ餃子 ◆8X2XSCHEME
2021/04/15(木) 01:11:57.17ID:FEj8Wx1j 状況に応じてコードジェネレータを用意するよりはマシってくらいか。
208デフォルトの名無しさん
2021/04/15(木) 22:12:02.69ID:mdNAsIkh >>182
具体的に
具体的に
209デフォルトの名無しさん
2021/04/16(金) 05:29:55.48ID:EjuTOEDD >>208
?
?
210デフォルトの名無しさん
2021/04/16(金) 06:24:07.51ID:zpAq69hN >>209
?!
?!
211はちみつ餃子 ◆8X2XSCHEME
2021/04/16(金) 12:18:05.12ID:I3AyWR5p ヴィクトル・ユーゴーかよ。
212デフォルトの名無しさん
2021/04/17(土) 08:00:06.17ID:1dxAtZcl condition_variableってなんでこんなに面倒なんだ
winなら、イベントの方が高速だし楽で懐疑起床も起きないし
winなら、イベントの方が高速だし楽で懐疑起床も起きないし
213デフォルトの名無しさん
2021/04/17(土) 08:06:00.96ID:3mxJ/fRx214デフォルトの名無しさん
2021/04/17(土) 08:13:31.45ID:nI8O4VG/215デフォルトの名無しさん
2021/04/17(土) 08:49:19.47ID:1dxAtZcl216デフォルトの名無しさん
2021/04/17(土) 10:51:59.94ID:WHLcQryV おすすめ本ってありますか?
C言語のプログラムを、文法などカンニングしながら書けるレベルです。
C言語のプログラムを、文法などカンニングしながら書けるレベルです。
217デフォルトの名無しさん
2021/04/17(土) 13:30:52.06ID:l53+7OwH cppreference.comの何が不満かによる
218デフォルトの名無しさん
2021/04/17(土) 14:51:21.11ID:ohP60UMx それだけ読んで理解した奴なんておらんやろ。
219デフォルトの名無しさん
2021/04/17(土) 17:33:14.75ID:3mxJ/fRx プログラミングにカンニングという概念はない
常にオンラインヘルプなので正確な仕様を確認しながら作業するのがプログラミングの常なので、
カンニング(仕様確認、他人の書いたコードをチラ見してコーディング規約ぶ追従)は仕事の一部
常にオンラインヘルプなので正確な仕様を確認しながら作業するのがプログラミングの常なので、
カンニング(仕様確認、他人の書いたコードをチラ見してコーディング規約ぶ追従)は仕事の一部
220デフォルトの名無しさん
2021/04/17(土) 17:41:48.19ID:3mxJ/fRx 訂正
プログラミングにカンニングという概念はない
常にオンラインヘルプなどで正確な仕様を確認しながら作業するのがプログラミングの常なので、
カンニング(仕様確認、他人の書いたコードをチラ見してコーディング規約に追従)は仕事の一部
明確なコーディング規約がない場合にはなおのこと、カンニングが重要になる
プログラミングにカンニングという概念はない
常にオンラインヘルプなどで正確な仕様を確認しながら作業するのがプログラミングの常なので、
カンニング(仕様確認、他人の書いたコードをチラ見してコーディング規約に追従)は仕事の一部
明確なコーディング規約がない場合にはなおのこと、カンニングが重要になる
221デフォルトの名無しさん
2021/04/17(土) 18:08:39.80ID:LyWUtAnN RTTIなんかカンニングだろって個人的に思う
222デフォルトの名無しさん
2021/04/17(土) 19:10:13.22ID:3mxJ/fRx condition_variableに似た関数SleepConditionVariableCS()がWin32APIにも用意されてるけど、直感的で使いやすいのはcondition_variableでしょ
https://docs.microsoft.com/en-us/windows/win32/sync/using-condition-variables
https://docs.microsoft.com/en-us/windows/win32/sync/using-condition-variables
223デフォルトの名無しさん
2021/04/18(日) 10:59:46.23ID:lylRPiha 質問なのですが教えてくだちい
Q1. 64 bit符号付整数の積の結果をオーバーフロー無しで(128 bit等で)で得る方法
※ 64 bit整数を2^32進数2桁とみなして筆算する処理より速い方法キボン
SSE4.1可
Q2. (Q1にうまいやり方が無い場合)64 bit符号付整数の積がオーバーフローしたことを検知する方法
Q3. 多倍長整数(例えば8要素のunsigned longの配列として表された符号無し整数0〜2^256-1)
を10で割る方法orz
Q1. 64 bit符号付整数の積の結果をオーバーフロー無しで(128 bit等で)で得る方法
※ 64 bit整数を2^32進数2桁とみなして筆算する処理より速い方法キボン
SSE4.1可
Q2. (Q1にうまいやり方が無い場合)64 bit符号付整数の積がオーバーフローしたことを検知する方法
Q3. 多倍長整数(例えば8要素のunsigned longの配列として表された符号無し整数0〜2^256-1)
を10で割る方法orz
224デフォルトの名無しさん
2021/04/18(日) 11:05:45.65ID:lylRPiha Q2は現状a*bの前に std::abs(a) <= std::numeric_limit<int64_t>::max / std::abs(b) という判定をやっているのですが
もっと速いやつ(除算不要のやつ)キボン、
もっと速いやつ(除算不要のやつ)キボン、
225デフォルトの名無しさん
2021/04/18(日) 13:15:25.56ID:aOZ5UqSE226デフォルトの名無しさん
2021/04/18(日) 14:35:23.87ID:HGo0FTuj winならMultiply128、gccやclangなら__int128ってのが使えるみたいだけど
227デフォルトの名無しさん
2021/04/18(日) 15:14:50.22ID:regwJJSX 競技プログラミングではよくある質問
228デフォルトの名無しさん
2021/04/18(日) 17:15:30.07ID:B2k51TVB >>223
特定の環境ならアセンブラでやっちゃえば?
ちなみに環境は?
昔その辺の演算は良くやった
Q3は10の逆数を求めておいてかけ算命令でやるのが良いけど
多売長は何進数?
10で割るだけの為にバッファスキャンはもったいない
何かの演算とセットに出来ない?
もしやりたいことが2進多倍長の10進数化なら
もっと良い方法がある
特定の環境ならアセンブラでやっちゃえば?
ちなみに環境は?
昔その辺の演算は良くやった
Q3は10の逆数を求めておいてかけ算命令でやるのが良いけど
多売長は何進数?
10で割るだけの為にバッファスキャンはもったいない
何かの演算とセットに出来ない?
もしやりたいことが2進多倍長の10進数化なら
もっと良い方法がある
229デフォルトの名無しさん
2021/04/18(日) 17:17:36.41ID:B2k51TVB 環境 (CPU, OS)
多倍長の構成 (整数?指数部あり?2進?10進?変則?)
最終的に何がやりたいか
この辺がわかれば色々と教えられる
多倍長の構成 (整数?指数部あり?2進?10進?変則?)
最終的に何がやりたいか
この辺がわかれば色々と教えられる
>>223
>>225 も多倍長演算ですか、じゃ、私も私の多倍長演算を
https://mevius.5ch.net/test/read.cgi/tech/1434079972/37
>Q3. 多倍長整数を10で割る方法
であれば上のリンク先の line:383 から、std::ostream &operator<<(std::ostream &stream, mpz_base_class c) にて、ちょこっと工夫したつもりです、剰余は下位から確定する点では普通、ですので順序を逆にするのはアレかもしれませんが
>>225 も多倍長演算ですか、じゃ、私も私の多倍長演算を
https://mevius.5ch.net/test/read.cgi/tech/1434079972/37
>Q3. 多倍長整数を10で割る方法
であれば上のリンク先の line:383 から、std::ostream &operator<<(std::ostream &stream, mpz_base_class c) にて、ちょこっと工夫したつもりです、剰余は下位から確定する点では普通、ですので順序を逆にするのはアレかもしれませんが
231デフォルトの名無しさん
2021/04/18(日) 18:08:23.13ID:lylRPiha232デフォルトの名無しさん
2021/04/18(日) 18:32:04.62ID:2o2Y05bZ 多倍長÷32bitを除算命令を用いてやるのはアホ
233デフォルトの名無しさん
2021/04/18(日) 18:34:03.31ID:lylRPiha >>232
kwsk
kwsk
234デフォルトの名無しさん
2021/04/18(日) 19:14:51.87ID:2o2Y05bZ ヒント
除算は遅い
除算は逆数の乗算
定数の除算のコンパイル結果
除算は遅い
除算は逆数の乗算
定数の除算のコンパイル結果
235デフォルトの名無しさん
2021/04/18(日) 21:49:11.94ID:lylRPiha (聞くんじゃなかった…
236デフォルトの名無しさん
2021/04/18(日) 22:02:51.07ID:lylRPiha ちゅか10で割るのは10の剰余を知りたいからなのだというのは
言ってなかったわサーセン、orz
多倍長整数の10進数表現を得るために、多倍長整数を10で割って剰余を求める必要があった
この目的には誤差の見積や処置が面倒な方法はNGでありかつ
10進数化とかどうせ表示の時しか使わないのでこの割り算自体はそうメチャクチャチューニングする必要は
ありませぬ(と後出し
言ってなかったわサーセン、orz
多倍長整数の10進数表現を得るために、多倍長整数を10で割って剰余を求める必要があった
この目的には誤差の見積や処置が面倒な方法はNGでありかつ
10進数化とかどうせ表示の時しか使わないのでこの割り算自体はそうメチャクチャチューニングする必要は
ありませぬ(と後出し
237デフォルトの名無しさん
2021/04/18(日) 22:16:10.35ID:lylRPiha もしガチで全く除算を使わずに10進数に変換せよと言われたら
5*10^n、2*10^n、1*10^nを作ってnがデカい順に元の数と比較して引いていく、
ぐらいしかなさげ
知らんけど
5*10^n、2*10^n、1*10^nを作ってnがデカい順に元の数と比較して引いていく、
ぐらいしかなさげ
知らんけど
238デフォルトの名無しさん
2021/04/19(月) 00:09:37.42ID:cH3u5yp0 >>223
トンチンカンなこと聞いてたらすみませんが、Q1って多倍長整数を文字列で持ってカラツバ法とか高速フーリエ変換で計算するやり方だと「遅い」んですか?
トンチンカンなこと聞いてたらすみませんが、Q1って多倍長整数を文字列で持ってカラツバ法とか高速フーリエ変換で計算するやり方だと「遅い」んですか?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 [蚤の市★]
- 【地震】青森県で震度6強 長周期地震動も 津波注意報すべて解除 ★7 [ぐれ★] [ぐれ★]
- 【広島】「万引きした人を追跡」コンビニ店員の男性(46)を果物ナイフで刺したか 中国籍の少年(17)を殺人未遂容疑で現行犯逮捕 [ぐれ★]
- トランプ大統領 エヌビディア製AI半導体の中国輸出許可 安全保障重視の方針転換 [蚤の市★]
- 【サッカー】58歳カズ「オファーが来ている」 J3福島と近日中にも交渉 早ければ年内にも決断 [征夷大将軍★]
- 【悲報】高市早苗の擬人化がXで大バズりwwwwwwwwwwww [455031798]
- 高市が早くあの発言を撤回しないと、中国からもっと大きな制裁が飛んでくるぞ [805596214]
- 【動画】ファッションモデルまんこ、裸でランウェイを歩く。これがファッションだと言われて [749674962]
- 【画像】髙市さん「無職のシンママ支援を手厚くするため、世帯年収900万円以上の控除をカットします🙂」 [881878332]
- 早大名誉教授「高市内閣の高支持率はデータ操作か、支持している日本人がアホなのか」👈核心を突いてしまう [868050967]
- こんぺこ!こんぺこ!こんぺこ!🐰🏡
