次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part137
https://mevius.5ch.net/test/read.cgi/tech/1531558382/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
C++相談室 part137
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 12c3-4saf)
2018/08/27(月) 16:02:00.94ID:vY3QDx2y0794デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 10:40:42.82ID:hWUH9Sli0 >>792
でも、以下の std::move() の実装の説明だとあなたの言ってる方が正しい気がする。
https://stackoverflow.com/questions/36206764/understanding-the-code-for-stdmove
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html#Move_Semantics
The move function really does very little work. All move does is accept
either an lvalue or rvalue argument, and return it as an rvalue
without triggering a copy construction:
template <class T>
typename remove_reference<T>::type &&move(T &&a)
{
return a;
}
It is now up to client code to overload key functions on whether
their argument is an lvalue or rvalue (e.g. copy constructor and
assignment operator). When the argument is an lvalue,
the argument must be copied from.
When it is an rvalue, it can safely be moved from.
でも、以下の std::move() の実装の説明だとあなたの言ってる方が正しい気がする。
https://stackoverflow.com/questions/36206764/understanding-the-code-for-stdmove
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html#Move_Semantics
The move function really does very little work. All move does is accept
either an lvalue or rvalue argument, and return it as an rvalue
without triggering a copy construction:
template <class T>
typename remove_reference<T>::type &&move(T &&a)
{
return a;
}
It is now up to client code to overload key functions on whether
their argument is an lvalue or rvalue (e.g. copy constructor and
assignment operator). When the argument is an lvalue,
the argument must be copied from.
When it is an rvalue, it can safely be moved from.
795デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 10:44:16.75ID:hWUH9Sli0796デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 10:49:49.55ID:hWUH9Sli0797はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/28(金) 11:07:41.28ID:7KXXqv1B0798はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/28(金) 11:11:50.31ID:7KXXqv1B0 >>789
ちょっと確認なんだけど、
テンプレート仮引数 T に対して T&& に lvalue がマッチするっていうのは、
実際には lvalue reference として機能するという意味でいいんよね?
(変形できるというのはそういう意味だよね?)
ちょっと確認なんだけど、
テンプレート仮引数 T に対して T&& に lvalue がマッチするっていうのは、
実際には lvalue reference として機能するという意味でいいんよね?
(変形できるというのはそういう意味だよね?)
799デフォルトの名無しさん (ワッチョイ 7748-aemA)
2018/09/28(金) 11:58:59.36ID:RVKB6eOl0 >>798
それ以外の何だと思うの?
それ以外の何だと思うの?
800デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 12:26:11.67ID:hWUH9Sli0 >>797
あまのじゃく?
あまのじゃく?
801はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/28(金) 12:29:12.61ID:7KXXqv1B0 >>799
「変形される」だったら勝手にやってくれるんだなーと思うんだけど、
「変形できる」という言い回しにちょっと引っかかりを感じたというふんわりした疑問なので、
具体的に別の可能性を思い浮かべたわけではないです。
「変形される」だったら勝手にやってくれるんだなーと思うんだけど、
「変形できる」という言い回しにちょっと引っかかりを感じたというふんわりした疑問なので、
具体的に別の可能性を思い浮かべたわけではないです。
802デフォルトの名無しさん (ラクッペ MM0b-2bq/)
2018/09/28(金) 14:07:40.60ID:7VsD45M6M 江添とお前らどっちがC++に詳しい
803デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 14:45:05.48ID:hWUH9Sli0 >>802
その人もここに来るかも知れないから。
その人もここに来るかも知れないから。
804デフォルトの名無しさん (ササクッテロル Sp4b-cB/m)
2018/09/28(金) 14:53:59.72ID:5bmo24w9p 江添で言えばまさにわかりやすくその辺の事情解説してくれてるだろ
今の話で江添より詳しいとかありえねー
今の話で江添より詳しいとかありえねー
805はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/28(金) 17:00:34.02ID:7KXXqv1B0806デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/09/28(金) 17:18:49.52ID:hWUH9Sli0 >>805
いずれにせよ、気持ちはうれしかったよ。
いずれにせよ、気持ちはうれしかったよ。
807デフォルトの名無しさん (ラクッペ MM0b-2bq/)
2018/09/28(金) 17:49:54.67ID:7VsD45M6M808デフォルトの名無しさん (ワッチョイ 17b3-cB/m)
2018/09/28(金) 18:34:51.41ID:2UofBC6a0809デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/28(金) 21:21:09.15ID:tCflGkAm0 もし非テンプレート関数かつ非インライン関数なvoid bar(Foo&& a)に左辺値xを渡してビルドが通る言語規格だとしたら、
tmp = xのコピー
barのビルド結果←(tmpのアドレス)
ということになってxのコピコンが呼ばれてしまうま
つまり右辺値参照がコピコン削減になるかどうかというのは関数を右辺値参照にしただけでは決まらず、
呼び出し元の条件次第なので、bar()を作る人/使う人双方の慢心を避けるためにエラーにするんだろJK
一方テンプレート関数またはインライン展開される関数なら、上のようなへタレコードに一時的になっても
すぐさまコピコン削減ができるから実質弊害が無い
ただし、そういった関数でも再帰呼び出ししたりアドレスをとったりすると上と同じ議論になるので、
再帰呼び出し/アドレスを取る操作 両方ともありえるインライン関数は>>789の例外の適用外とされ、
テンプレート関数は再帰呼び出しが有り得ないし、アドレスを取る奇特な人間も居ないだろうということで>>789の例外が設けられた
tmp = xのコピー
barのビルド結果←(tmpのアドレス)
ということになってxのコピコンが呼ばれてしまうま
つまり右辺値参照がコピコン削減になるかどうかというのは関数を右辺値参照にしただけでは決まらず、
呼び出し元の条件次第なので、bar()を作る人/使う人双方の慢心を避けるためにエラーにするんだろJK
一方テンプレート関数またはインライン展開される関数なら、上のようなへタレコードに一時的になっても
すぐさまコピコン削減ができるから実質弊害が無い
ただし、そういった関数でも再帰呼び出ししたりアドレスをとったりすると上と同じ議論になるので、
再帰呼び出し/アドレスを取る操作 両方ともありえるインライン関数は>>789の例外の適用外とされ、
テンプレート関数は再帰呼び出しが有り得ないし、アドレスを取る奇特な人間も居ないだろうということで>>789の例外が設けられた
810デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/28(金) 21:24:43.89ID:tCflGkAm0 訂正;
△: すぐさまコピコン削減ができる
○: コンパイラがすぐさまコピコン呼び出し削減最適化をかけられる
コピコン呼び出し削減最適化はこの場合データフロー解析の結果を流用したらできる
C++はgotoが使われたとき、コンストラクタが呼ばれずに使われるオブジェクトが生じないか否か確かめるために
データフロー解析はもともと必須なので、コピコン呼び出し削減最適化はC++コンパイラ書きなら誰でも出来る(多分
△: すぐさまコピコン削減ができる
○: コンパイラがすぐさまコピコン呼び出し削減最適化をかけられる
コピコン呼び出し削減最適化はこの場合データフロー解析の結果を流用したらできる
C++はgotoが使われたとき、コンストラクタが呼ばれずに使われるオブジェクトが生じないか否か確かめるために
データフロー解析はもともと必須なので、コピコン呼び出し削減最適化はC++コンパイラ書きなら誰でも出来る(多分
811デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/28(金) 21:34:28.86ID:tCflGkAm0 >>793
>const T& に rvalue がマッチするんだった。
それはある意味当然すぐる
const T& x = r; // rは右辺値
...
y = x // (*)
としたときに、コンパイラは(*)みたいな文が現れるまでは、
xへのアクセスを機械的にrへのアクセスに置き換えれば良いわけでゼロコスト
rが所有権を失ったらxのアクセスも不正となるが、これは書き換え可能なオブジェクトを
const参照をとってから書き換えた場合も似たようなもの(身からでたサビ
なのでコンパイラはやっぱ何もしなくて良い
>const T& に rvalue がマッチするんだった。
それはある意味当然すぐる
const T& x = r; // rは右辺値
...
y = x // (*)
としたときに、コンパイラは(*)みたいな文が現れるまでは、
xへのアクセスを機械的にrへのアクセスに置き換えれば良いわけでゼロコスト
rが所有権を失ったらxのアクセスも不正となるが、これは書き換え可能なオブジェクトを
const参照をとってから書き換えた場合も似たようなもの(身からでたサビ
なのでコンパイラはやっぱ何もしなくて良い
812デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/28(金) 21:36:22.95ID:tCflGkAm0 (30分前にこのスレを読んで初めて右辺値とか右辺値参照といったブツを知った初心者なので語ってみた
813デフォルトの名無しさん (ブーイモ MM7b-/SOc)
2018/09/28(金) 22:13:49.14ID:pgnHcfqPM814デフォルトの名無しさん (スップ Sd3f-brPT)
2018/09/28(金) 22:40:22.15ID:5I7m9/jNd どんな文が現れようとずっとrでいいんじゃね?
815デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/28(金) 22:45:46.54ID:tCflGkAm0816デフォルトの名無しさん (ブーイモ MM7b-/SOc)
2018/09/28(金) 22:50:40.02ID:pgnHcfqPM >>815
ウッサイ、チネ
ウッサイ、チネ
817デフォルトの名無しさん (ワッチョイ ff5b-/SOc)
2018/09/28(金) 23:48:18.05ID:AAs3crMS0818デフォルトの名無しさん (オッペケ Sr4b-N9wp)
2018/09/28(金) 23:50:49.06ID:HzE5xAmYr auto a = funcA(funcB(funcC(input)));
みたいな感じの関数の入れ子ってさ、ある関数が終わる度にその都度インスタンスを作ってコピーして次の関数に渡すということを繰り返すんだよね?
つまり、関数たちの返り値が巨大なオブジェクトだったら、このように書くことで余計に時間がかかるよね?
みたいな感じの関数の入れ子ってさ、ある関数が終わる度にその都度インスタンスを作ってコピーして次の関数に渡すということを繰り返すんだよね?
つまり、関数たちの返り値が巨大なオブジェクトだったら、このように書くことで余計に時間がかかるよね?
819デフォルトの名無しさん (ワッチョイ ff5b-/HDE)
2018/09/29(土) 00:09:10.14ID:UwfF5QN40820デフォルトの名無しさん (オッペケ Sr4b-N9wp)
2018/09/29(土) 00:13:53.80ID:X+ykKtqpr821デフォルトの名無しさん (アウアウウー Sadb-ZVm4)
2018/09/29(土) 00:22:35.94ID:4+9Po3M4a 単純なコピーよりは早くなる可能性があるってだけでは?
822デフォルトの名無しさん (ワッチョイ ff5b-/HDE)
2018/09/29(土) 00:30:08.48ID:UwfF5QN40 ちょっと誇張しすぎた。
正しくは「コピーもムーブも起らない可能性すらある」
コピーもムーブも起こらなければ、その分のオーバーヘッドは当然ないよ
正しくは「コピーもムーブも起らない可能性すらある」
コピーもムーブも起こらなければ、その分のオーバーヘッドは当然ないよ
823デフォルトの名無しさん (オッペケ Sr4b-N9wp)
2018/09/29(土) 00:36:40.21ID:X+ykKtqpr へぇ〜〜〜
ありがとうございます
まぁそこがボトルネックじゃない限り余計なこと考えない方が身のためなのかもしれませんが
ありがとうございます
まぁそこがボトルネックじゃない限り余計なこと考えない方が身のためなのかもしれませんが
824はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/29(土) 02:25:18.76ID:4F2hgYyq0 >>818-823
コピーもムーブも省略される可能性ってのは、左辺の場所でオブジェクトを直接に構築するっていう意味。
構築してからそのままコピーしてる (そして元のオブジェクトが一時的である) 場合は実際には直接構築したって同じよねという話。
コピーもムーブも省略される可能性ってのは、左辺の場所でオブジェクトを直接に構築するっていう意味。
構築してからそのままコピーしてる (そして元のオブジェクトが一時的である) 場合は実際には直接構築したって同じよねという話。
825デフォルトの名無しさん (ワッチョイ 17b3-cB/m)
2018/09/29(土) 14:26:47.44ID:7XGFV27+0 >>819
>オブジェクトにムーブコンストラクタがあって戻り値が右辺値ならコピー回避されるし
なんかムーブコンストラクタを魔法か何かと勘違いしてないか?
ムーブコンストラクタの方が重い処理してたら当然重くなるんだぞ
>オブジェクトにムーブコンストラクタがあって戻り値が右辺値ならコピー回避されるし
なんかムーブコンストラクタを魔法か何かと勘違いしてないか?
ムーブコンストラクタの方が重い処理してたら当然重くなるんだぞ
826デフォルトの名無しさん (ブーイモ MM7b-/SOc)
2018/09/29(土) 14:32:22.06ID:OnnXxjQtM827デフォルトの名無しさん (ワッチョイ 17b3-cB/m)
2018/09/29(土) 14:44:27.90ID:7XGFV27+0 むしろムーブで軽くなるのは大抵の場合ムーブによってヒープの確保、解放を
避けられるクラスだけ、だろ
ある意味そっちの方が限定して話をしてると思うが
基本をすっ飛ばすからはちみつその他誤解するやつが出てくる
避けられるクラスだけ、だろ
ある意味そっちの方が限定して話をしてると思うが
基本をすっ飛ばすからはちみつその他誤解するやつが出てくる
828デフォルトの名無しさん (ワッチョイ 5780-q1nr)
2018/09/29(土) 14:49:31.13ID:IuTgmxg/0 この機能が必要になった背景・経緯
ムーブセマンティクスは、C++03でもNRVO(特定の文脈でのコンストラクタの省略)や、 C++11で非推奨となったstd::auto_ptrで実現されていた。
しかし、NRVOがいつでも機能するわけではなかった。
また、std::auto_ptrにはコピーと同じ文法でムーブしていることなど、問題が多かった。
そのため、コピーと区別でき、統一的にムーブを表す文法が言語機能として必要とされた。
つまりこんなあぶなっかしい
unique_ptr、shared_ptr、weak_ptrとか使ってるヤツラも
クルクルパーしかいない
この程度の簡単な制御も自分で簡単に制御しきれないワケだからな
ムーブセマンティクスは、C++03でもNRVO(特定の文脈でのコンストラクタの省略)や、 C++11で非推奨となったstd::auto_ptrで実現されていた。
しかし、NRVOがいつでも機能するわけではなかった。
また、std::auto_ptrにはコピーと同じ文法でムーブしていることなど、問題が多かった。
そのため、コピーと区別でき、統一的にムーブを表す文法が言語機能として必要とされた。
つまりこんなあぶなっかしい
unique_ptr、shared_ptr、weak_ptrとか使ってるヤツラも
クルクルパーしかいない
この程度の簡単な制御も自分で簡単に制御しきれないワケだからな
829デフォルトの名無しさん (ワッチョイ 5780-q1nr)
2018/09/29(土) 14:56:25.79ID:IuTgmxg/0 しかしアホのあたらしもの好きは半端ない
頭悪いシロモノでも新しいものができたら使わないといけない病になってるからな
シロウトに多い
頭悪いシロモノでも新しいものができたら使わないといけない病になってるからな
シロウトに多い
830デフォルトの名無しさん (ワッチョイ 17b3-cB/m)
2018/09/29(土) 14:58:40.21ID:7XGFV27+0 いや、autoはともかくshared, unique, weakは危なっかしくないと思うが・・
ムーブが使えるようになってからだし
あと個人的にはcpprefjpは規格寄り過ぎてユーザー寄りじゃないと思う
cppreference.comを使うべき
ムーブが使えるようになってからだし
あと個人的にはcpprefjpは規格寄り過ぎてユーザー寄りじゃないと思う
cppreference.comを使うべき
831デフォルトの名無しさん (ワッチョイ 5780-q1nr)
2018/09/29(土) 14:59:08.11ID:IuTgmxg/0 で、こんなしょうもないことより
ホントに理解しないといけない部分がすっぽりと抜けてる
ホントに理解しないといけない部分がすっぽりと抜けてる
832はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/29(土) 16:42:03.70ID:4F2hgYyq0 C++ の (というかプログラミング言語の) ほとんどの機能は抽象化の道具。
ムーブもまた、見かけ上は代入っぽい抽象で扱えるものであっても
実態はもうちょっと速いコードにも出来る (可能性がある)。
>>828
そういう簡単な制御すら抽象化層に押し込められない方がよっぽど駄目。
クルクルパーだと思ってるならなおさら、
簡単な制御なら (いつも間違いなく) 出来ると期待すべきでない。
そんでもって大抵の人間はクソザコで、しょうもない間違いをする。
問題は道具で解決すべき。
ムーブもまた、見かけ上は代入っぽい抽象で扱えるものであっても
実態はもうちょっと速いコードにも出来る (可能性がある)。
>>828
そういう簡単な制御すら抽象化層に押し込められない方がよっぽど駄目。
クルクルパーだと思ってるならなおさら、
簡単な制御なら (いつも間違いなく) 出来ると期待すべきでない。
そんでもって大抵の人間はクソザコで、しょうもない間違いをする。
問題は道具で解決すべき。
833デフォルトの名無しさん (ワッチョイ 17b3-kFNE)
2018/09/29(土) 17:03:15.96ID:7XGFV27+0 スマポは言語の機能じゃねーよボケ
834デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/29(土) 18:38:13.57ID:GD2dD6IB0835デフォルトの名無しさん (ワッチョイ d7b3-ZVm4)
2018/09/29(土) 18:45:43.26ID:Dc4laUcM0 ムーブはゼロの発見に次ぐ、人類史上における大発見と言われてるけどな。
ノーベル賞候補の一つにもなってるし。
ノーベル賞候補の一つにもなってるし。
836デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/29(土) 18:51:41.19ID:GD2dD6IB0 std::auto_ptr<T>はもともとオブジェクトをムーブしたくて生まれたわけでは無いと思う…
確実な解放の実現が先
ムーブする仕様はあと
あとstd::auto_ptr<T>(unique_ptr<T>でも良いが)でも使わないとやってられないシチュがC++には少なくとも1つある
確実な解放の実現が先
ムーブする仕様はあと
あとstd::auto_ptr<T>(unique_ptr<T>でも良いが)でも使わないとやってられないシチュがC++には少なくとも1つある
837デフォルトの名無しさん (ブーイモ MM7b-uZyL)
2018/09/29(土) 18:56:52.23ID:oWn9MzvpM move元のオブジェクトに対するアクセスがコンパイルエラーになるんならわかるけど、そうじゃないんなら
大層な仕組みを入れなくても単に unique_ptr を言語組み込みで実装すれば済む話だったのでは?
大層な仕組みを入れなくても単に unique_ptr を言語組み込みで実装すれば済む話だったのでは?
838デフォルトの名無しさん (ラクッペ MM0b-2bq/)
2018/09/29(土) 19:32:03.30ID:YVfD+mv1M お前ら江添に負けて恥ずかしくないの?
839デフォルトの名無しさん (オイコラミネオ MM4f-IJfJ)
2018/09/29(土) 20:26:30.14ID:1/46iTAZM 全然?
840デフォルトの名無しさん (スプッッ Sd3f-brPT)
2018/09/29(土) 21:00:53.02ID:vc6gAAuZd841デフォルトの名無しさん (ブーイモ MM7b-uZyL)
2018/09/29(土) 22:03:09.07ID:oWn9MzvpM842デフォルトの名無しさん (ワッチョイ 1704-ClIk)
2018/09/29(土) 23:45:25.50ID:OLOWa9QF0 move後の元オブジェクトを破壊っていうか破棄しようって提案もあったよ。ちょっと早くなるのだとさ。
843デフォルトの名無しさん (ワッチョイ 9f23-brPT)
2018/09/30(日) 00:04:13.06ID:kBo12DYt0 >>841
ポインターならそもそも copy のコスト安いから move 要らないじゃん
ポインターならそもそも copy のコスト安いから move 要らないじゃん
844デフォルトの名無しさん (ワッチョイ 5780-q1nr)
2018/09/30(日) 00:20:38.65ID:aYXyCrkn0 それだったら最初から普通にポインタでかけよ
845デフォルトの名無しさん (ワッチョイ ff80-LozN)
2018/09/30(日) 00:57:02.37ID:GfZkWSkk0 この3冊が、神の書!
Linux プログラミング・インタフェース、Michael Kerrisk、2012
C++11/14 コア言語、江添 亮、2015
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006
Linux プログラミング・インタフェース、Michael Kerrisk、2012
C++11/14 コア言語、江添 亮、2015
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006
846デフォルトの名無しさん (アウアウウー Sadb-uZyL)
2018/09/30(日) 01:40:28.47ID:CKZYWlYLa >>843
だからmoveいらないって話でしょ
C++のムーブセマンティクスがああなったのは中途半端にスタックを使うスタイルが定着してしまっていて今更ポインタ使えというのは無理があるからで、
本来は所有権の管理さえ適切に行えるようになってさえいればムーブなんか要らんよ
だからmoveいらないって話でしょ
C++のムーブセマンティクスがああなったのは中途半端にスタックを使うスタイルが定着してしまっていて今更ポインタ使えというのは無理があるからで、
本来は所有権の管理さえ適切に行えるようになってさえいればムーブなんか要らんよ
847デフォルトの名無しさん (オッペケ Sr4b-N9wp)
2018/09/30(日) 06:43:45.01ID:C9oWPEnUr C++ Coding Standards って新品で買えないけど代わりになる書籍ありますか?
848デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/30(日) 06:48:23.20ID:d4gXl3Bi0 >>846
ポインタ使え思想はすでにC#とかなクラスが参照型な言語で実現されているが
オブジェクトの解放にガベージコレクタが要る言語になった
これはガベージコレクタ無し・所有権の無条件移動だけだと、次のようなケースで早速話が破綻するから仕方が無い
void bar(int n) {
std::unique_ptr<Foo> a(new Foo());
for (int i = 0; i < n; i++) {
func1(a, i); // func1(a, 0);で所有権がgone 以降のfunc(a, i)はaの不正アクセス
}
}
不正アクセスにならないように、実際にはこのようなfunc1()にはa.get()でポインタを渡す書き方をする
するとfunc1()以下の呼び出しは全部>>844になる
人類に逃げ場は無い
ポインタ使え思想はすでにC#とかなクラスが参照型な言語で実現されているが
オブジェクトの解放にガベージコレクタが要る言語になった
これはガベージコレクタ無し・所有権の無条件移動だけだと、次のようなケースで早速話が破綻するから仕方が無い
void bar(int n) {
std::unique_ptr<Foo> a(new Foo());
for (int i = 0; i < n; i++) {
func1(a, i); // func1(a, 0);で所有権がgone 以降のfunc(a, i)はaの不正アクセス
}
}
不正アクセスにならないように、実際にはこのようなfunc1()にはa.get()でポインタを渡す書き方をする
するとfunc1()以下の呼び出しは全部>>844になる
人類に逃げ場は無い
849デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/30(日) 06:53:57.08ID:d4gXl3Bi0 それにポインタ使え思想だと次のようなケースでBaz::m_c[i]のBar:m_b[j]の:Foo::m_aのアクセスに藻前らどんだけ間接参照するんですかと、
class Foo {
SomeClass m_a;
};
class Bar {
Foo m_b[100];
};
class Baz {
Bar m_c[100];
};
class Foo {
SomeClass m_a;
};
class Bar {
Foo m_b[100];
};
class Baz {
Bar m_c[100];
};
850デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/30(日) 07:13:40.02ID:d4gXl3Bi0 ちな>>849はm_bやm_cが配列であるため、配列アクセス時の添え字が定数なシチュでもない限り、JITでも間接参照回数を3以下にはできん
851デフォルトの名無しさん (ブーイモ MM7b-uZyL)
2018/09/30(日) 09:10:22.74ID:3yGUdTqFM852デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/30(日) 09:21:04.80ID:d4gXl3Bi0853デフォルトの名無しさん (ブーイモ MM7b-uZyL)
2018/09/30(日) 09:39:54.40ID:3yGUdTqFM >>852
自分でも分かってて揚げ足取ろうとしてるんだろうけど、コーディング時に、プログラマがオブジェクトを生成することを意図したコードを記述した時点で、な
自分でも分かってて揚げ足取ろうとしてるんだろうけど、コーディング時に、プログラマがオブジェクトを生成することを意図したコードを記述した時点で、な
854デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/30(日) 09:46:24.24ID:d4gXl3Bi0 >>853
いやスマン言い方がまずかったそういう意味ではない
確かに
>所有権を移動するかどうかはほぼ例外なくオブジェクト生成時点で予め分かってるんだから、
というのは真だが、ライブラリのインターフェースに解放が必要なオブジェクトのmoveなど認めたら有り得ないコストが生じるという話
func1()の制作者が所有権を寄越すことを強制した(そういうインターフェース仕様にしてしまった)場合、
func1()を使う人はfunc1()に所有権を渡さねばならない。この結果、
1. 呼び出し元(func1()を使う人)がaをコピーしてコピーをfunc1()に渡さねばならない
2. func1()は呼び出しの度に、aを解放する
というのが>>848のコードでn回無駄に繰り返される
これを避ける方法はあるっていやーあるが、結局func1()以下の呼び出しは全部>>844になる(か、ガベージコレクタの出番となる
人類に逃げ場は無い
いやスマン言い方がまずかったそういう意味ではない
確かに
>所有権を移動するかどうかはほぼ例外なくオブジェクト生成時点で予め分かってるんだから、
というのは真だが、ライブラリのインターフェースに解放が必要なオブジェクトのmoveなど認めたら有り得ないコストが生じるという話
func1()の制作者が所有権を寄越すことを強制した(そういうインターフェース仕様にしてしまった)場合、
func1()を使う人はfunc1()に所有権を渡さねばならない。この結果、
1. 呼び出し元(func1()を使う人)がaをコピーしてコピーをfunc1()に渡さねばならない
2. func1()は呼び出しの度に、aを解放する
というのが>>848のコードでn回無駄に繰り返される
これを避ける方法はあるっていやーあるが、結局func1()以下の呼び出しは全部>>844になる(か、ガベージコレクタの出番となる
人類に逃げ場は無い
855デフォルトの名無しさん (アウアウウー Sadb-uZyL)
2018/09/30(日) 09:52:25.65ID:CKZYWlYLa856デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/30(日) 10:03:48.10ID:d4gXl3Bi0857デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/30(日) 10:07:31.97ID:d4gXl3Bi0 いやすまん解放が不要なオブジェクトでも、所有権を移動した場合は>>854の1のコストは避けられないorz
ここは訂正
ここは訂正
858デフォルトの名無しさん (アウアウウー Sadb-uZyL)
2018/09/30(日) 10:11:13.08ID:CKZYWlYLa >>856
スマポのmoveも本体のmoveも一段間接参照が入る以外は何も変わらないって言ってるんだけど、そんなに難しい話かなあ
スマポのmoveも本体のmoveも一段間接参照が入る以外は何も変わらないって言ってるんだけど、そんなに難しい話かなあ
859デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/30(日) 10:45:39.58ID:d4gXl3Bi0 >>858
>>848、>>849は、現行C++におけるスマポのmoveと本体のmoveの優劣は問題にしていない
848を現行C++のコード風に書いたから誤解を招いたのかもしれないが、比較はあくまで現行C++と846思想の比較であって、
846の次の思想を実行に移したら>>854のコストが避けられませんよという話
1. スタックを使うスタイルはやめるべき(全部スマポであるべき)
2. 所有権の管理さえ適切に行えるようになってさえいれば(現行C++のムーブセマンティクスみたいな)ムーブなんか要らん
1は現行C++との比較において、間接参照回数に響く
2は現行C++との比較において、現行C++では避けられるコスト(>>854またはガベージコレクション)を無駄に背負い込むことになる
>>848、>>849は、現行C++におけるスマポのmoveと本体のmoveの優劣は問題にしていない
848を現行C++のコード風に書いたから誤解を招いたのかもしれないが、比較はあくまで現行C++と846思想の比較であって、
846の次の思想を実行に移したら>>854のコストが避けられませんよという話
1. スタックを使うスタイルはやめるべき(全部スマポであるべき)
2. 所有権の管理さえ適切に行えるようになってさえいれば(現行C++のムーブセマンティクスみたいな)ムーブなんか要らん
1は現行C++との比較において、間接参照回数に響く
2は現行C++との比較において、現行C++では避けられるコスト(>>854またはガベージコレクション)を無駄に背負い込むことになる
860はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/09/30(日) 10:52:02.74ID:56zUhffF0 >>858
本体のムーブも、ムーブ出来るように書いたらカスタムなスマートポインタみたいになるから、
間接参照が入っちゃうので、なおさら同じではあると思う。
でもまあ、ムーブは抽象化の方法であって、
最終的に実行されることが同じだからなくても良いってのは暴論よね。
本体のムーブも、ムーブ出来るように書いたらカスタムなスマートポインタみたいになるから、
間接参照が入っちゃうので、なおさら同じではあると思う。
でもまあ、ムーブは抽象化の方法であって、
最終的に実行されることが同じだからなくても良いってのは暴論よね。
861デフォルトの名無しさん (オッペケ Sr4b-hm9e)
2018/09/30(日) 11:10:34.99ID:f0zM7Hcdr アンダースコアとドットをこの順で必ず含む string があったとして、アンダースコアからドットまでの部分文字列を切り出す処理って一行で書ける?
substr と find_first_of と find_last_of を組み合わせる方法を考えたんだが、
アンダースコアの前を削る;
ドットの後を削る;
という2行に渡るやり方しか思い付かない
substr と find_first_of と find_last_of を組み合わせる方法を考えたんだが、
アンダースコアの前を削る;
ドットの後を削る;
という2行に渡るやり方しか思い付かない
862デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/30(日) 11:15:56.30ID:d4gXl3Bi0 ちな
>スマポのmoveも本体のmoveも一段間接参照が入る以外は何も変わらないって
これは現行C++においても違う違いがワカル男ならワカル
func1()からfunc2()にfunc1()の自動変数aをmoveするとして、かつfunc2()はインライン展開されるとすると、
func2()におけるaのメンバへのアクセスはfunc1()呼び出し時点でのスタックポインタ相対で一発でやれる
一方、aがスマポだったりすると、aのメンバへのアクセスの前に、func1()呼び出しの都度1回はスタックポインタ相対でaのアドレスを得なければならない
>スマポのmoveも本体のmoveも一段間接参照が入る以外は何も変わらないって
これは現行C++においても違う違いがワカル男ならワカル
func1()からfunc2()にfunc1()の自動変数aをmoveするとして、かつfunc2()はインライン展開されるとすると、
func2()におけるaのメンバへのアクセスはfunc1()呼び出し時点でのスタックポインタ相対で一発でやれる
一方、aがスマポだったりすると、aのメンバへのアクセスの前に、func1()呼び出しの都度1回はスタックポインタ相対でaのアドレスを得なければならない
863デフォルトの名無しさん (ブーイモ MM7b-uZyL)
2018/09/30(日) 11:27:40.54ID:fM5IaZg4M オブジェクト本体のメモリのコピーにかかるコストを考慮すればどっちもどっち
864デフォルトの名無しさん (ワッチョイ 9fa2-aemA)
2018/09/30(日) 11:54:22.15ID:u5/6mv7u0 >>861
substr じゃなくて、コンストラクタ使えばいいんじゃね
string t(s.begin() + s.find_first_of('_') + 1, s.begin() + s.find_last_of('.'));
substr じゃなくて、コンストラクタ使えばいいんじゃね
string t(s.begin() + s.find_first_of('_') + 1, s.begin() + s.find_last_of('.'));
865デフォルトの名無しさん (オッペケ Sr4b-hm9e)
2018/09/30(日) 12:29:37.73ID:f0zM7Hcdr >>864
なるほど、ためになります
なるほど、ためになります
866デフォルトの名無しさん (オッペケ Sr4b-hm9e)
2018/09/30(日) 12:35:17.89ID:f0zM7Hcdr >>864
ふと気になったのですが、このコンストラクタの挙動って他の名前の関数で実装されてないんでしょうか?
ふと気になったのですが、このコンストラクタの挙動って他の名前の関数で実装されてないんでしょうか?
868デフォルトの名無しさん (オッペケ Sr4b-hm9e)
2018/09/30(日) 13:18:31.87ID:f0zM7Hcdr >>867
何から何までありがとうございます
何から何までありがとうございます
869デフォルトの名無しさん (ワッチョイ bf9f-e6iu)
2018/09/30(日) 14:15:51.90ID:QSRvujde0 「rustにもあるし俺らも入れなきゃ」くらいの感覚で
今までのシステムとの統合性の難しさなんかほぼ考えないで入れちゃった機能だから。
c++らしいといえばらしい感覚だけど。
今までのシステムとの統合性の難しさなんかほぼ考えないで入れちゃった機能だから。
c++らしいといえばらしい感覚だけど。
870デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/09/30(日) 14:22:42.56ID:d4gXl3Bi0 std::basic_string::find()もイテレータを返すように他のコレクションとの統合性を尊重して欲しいよな
871デフォルトの名無しさん (ワッチョイ 77c7-aemA)
2018/09/30(日) 22:56:12.57ID:SdlFi6Ao0 findを実行した対象とは別のstringの同じ位置に何かしたいとき
イテレータで返されるとちょっとだけ面倒
まあ大した問題でもないんだけど
イテレータで返されるとちょっとだけ面倒
まあ大した問題でもないんだけど
872デフォルトの名無しさん (ワッチョイ bf8a-ClIk)
2018/10/01(月) 17:20:37.02ID:mKeAnbBU0 moveセマンテックが必要になった理由を理解してないのが多くて驚くばかりだな
破壊して良い中間オブジェクトとそうじゃないのとを区別するために必要なのだよ
ポインタ使えばmove必要ないとかそういう問題じゃない
破壊して良い中間オブジェクトとそうじゃないのとを区別するために必要なのだよ
ポインタ使えばmove必要ないとかそういう問題じゃない
873デフォルトの名無しさん (ワッチョイ 9f02-aemA)
2018/10/01(月) 17:40:58.61ID:qsdLJDx40 元はといえば禿が左辺値参照でもconstつければ右辺値を指せるという曲がった話を始めたのが
評判悪くてC++11でやっとやっとやっとやっとメスが入ったのが本当の理由
評判悪くてC++11でやっとやっとやっとやっとメスが入ったのが本当の理由
874はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-aemA)
2018/10/01(月) 18:05:01.87ID:hbafP85H0875デフォルトの名無しさん (ワッチョイ f7c3-2BxS)
2018/10/01(月) 18:05:54.55ID:Gge6W+rt0 Cにも欲しいわ
Cは参照ないから右辺値指示ポインタで
Cは参照ないから右辺値指示ポインタで
876デフォルトの名無しさん (ワッチョイ 9f02-aemA)
2018/10/01(月) 18:09:04.02ID:qsdLJDx40 それを言うなら、右辺値の概念を撤廃すべきでしょ
どんな値もポインタで指すことができ、
ポインタで指すことでregister指定を解除されるという変更
どんな値もポインタで指すことができ、
ポインタで指すことでregister指定を解除されるという変更
877デフォルトの名無しさん (ワッチョイ 1704-ClIk)
2018/10/01(月) 18:12:32.93ID:UY4lJdAP0 テンポラリーオブジェクトなくすと、一回必ず厳密に生成してから仕様になるので、手間増えると思う。
878デフォルトの名無しさん (ワッチョイ f7c3-2BxS)
2018/10/01(月) 18:40:21.84ID:Gge6W+rt0 右辺値がないと int i = 0; すら書けなくなるんだが
879デフォルトの名無しさん (ワッチョイ 9f02-aemA)
2018/10/01(月) 18:50:50.76ID:qsdLJDx40 なんで?
int j;
j ^= j;
int i = j;
左辺値でも問題ないじゃん
int j;
j ^= j;
int i = j;
左辺値でも問題ないじゃん
880デフォルトの名無しさん (オイコラミネオ MM4f-IJfJ)
2018/10/01(月) 18:54:00.22ID:xwh6ZD/vM >>879
苦しいねーw
苦しいねーw
881デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/10/01(月) 19:00:24.21ID:Yquio+NL0 0 以外はどうすんの。
882デフォルトの名無しさん (ワッチョイ f7c3-2BxS)
2018/10/01(月) 19:02:25.38ID:Gge6W+rt0 > j ^= j;
はい未初期化値を使ったから未定義動作で鼻から悪魔
はい未初期化値を使ったから未定義動作で鼻から悪魔
883デフォルトの名無しさん (ワッチョイ 77e3-c2ki)
2018/10/01(月) 19:04:34.50ID:Yquio+NL0 char buf[1];
int i = (int)(buf[10] - buf[0]);
で、i = 10 に初期化される。
int i = (int)(buf[10] - buf[0]);
で、i = 10 に初期化される。
884デフォルトの名無しさん (オイコラミネオ MM4f-IJfJ)
2018/10/01(月) 19:05:56.72ID:xwh6ZD/vM NaNのときはxorは未定義か、そこまで考えなかったな
885デフォルトの名無しさん (ワッチョイ 9f7c-c2ki)
2018/10/01(月) 19:06:32.55ID:uXaVofwo0886デフォルトの名無しさん (ワッチョイ bf9f-e6iu)
2018/10/01(月) 19:11:01.98ID:rJND5eoS0 そもそも=の無理やりなオーバーロードや引数に対する暗黙的なattainが問題なんだろう。
しかし元々のcのシンタックスを引き継ぎつつ、上記の問題を解決するのは不可能。
しかし元々のcのシンタックスを引き継ぎつつ、上記の問題を解決するのは不可能。
887デフォルトの名無しさん (ワッチョイ f7c3-2BxS)
2018/10/01(月) 19:14:47.64ID:Gge6W+rt0888デフォルトの名無しさん (ワッチョイ 9f02-aemA)
2018/10/01(月) 19:19:47.07ID:qsdLJDx40 >>881
別に?
int *j;
j = &10;
int i = *j;
てだけじゃん
10が左辺値だったらって話ね
char *j;
j = "\n";
int i = *j;
て話と何か違うの?
別に?
int *j;
j = &10;
int i = *j;
てだけじゃん
10が左辺値だったらって話ね
char *j;
j = "\n";
int i = *j;
て話と何か違うの?
889デフォルトの名無しさん (ワッチョイ f7c3-2BxS)
2018/10/01(月) 19:23:45.27ID:Gge6W+rt0 10が左辺値ならこれ認めるの?
10 = 42;
10 = 42;
890デフォルトの名無しさん (ワッチョイ 574e-2bq/)
2018/10/01(月) 21:57:05.81ID:92NEoPQV0 お前らがC++で作ったことあるものリスト化して
891デフォルトの名無しさん (ワッチョイ 9f02-aemA)
2018/10/01(月) 22:37:33.40ID:qsdLJDx40892デフォルトの名無しさん (ワッチョイ 9f02-aemA)
2018/10/01(月) 22:42:30.92ID:qsdLJDx40893デフォルトの名無しさん (ワッチョイ 9fbd-G9Ql)
2018/10/01(月) 23:15:35.29ID:2m3Ms8fl0 >>874
ていうか所有権などという中途半端な概念にオブジェクトの解放を担わせるのは危険か無意味かのどっちかにしかならない
最後までオブジェクトを使いたい人と、そのオブジェクトを所有する人を
コードに所有権を明示するスタイルで一致させられるケースは少ない
希ガス
ていうか所有権などという中途半端な概念にオブジェクトの解放を担わせるのは危険か無意味かのどっちかにしかならない
最後までオブジェクトを使いたい人と、そのオブジェクトを所有する人を
コードに所有権を明示するスタイルで一致させられるケースは少ない
希ガス
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【外交】元台湾総統・馬英九氏、高市首相発言に「台湾を危険にさらす」台湾海峡の問題は「両岸の中国人が自ら話し合うべき」★2 [1ゲットロボ★]
- 高市首相答弁を“引き出した”立民・岡田克也氏が改めて説明「なぜ慎重な答弁をされなかったのか。非常に残念に思っている」 ★8 [ぐれ★]
- 【次の一手】台湾問題で小林よしのり氏が私見「まさに戦争前夜」「ただちに徴兵制を敷いて、高市支持者を最前線へ」… ★5 [BFU★]
- 「母の部屋に安倍氏が表紙の機関誌が」「(安倍氏が被害者なのは)不思議に思いませんでした」山上被告の妹が証言 [おっさん友の会★]
- 【news23】小川彩佳アナ「ここまでの広がりになるということを、高市総理はどれだけ想像できていたんでしょうね」 日中問題特集で [冬月記者★]
- 【野球】大谷翔平、佐々木朗希、山本由伸らがWBC辞退なら広がる不協和音… 『過去イチ盛り上がらない大会』になる可能性も★2 [冬月記者★]
- 【高市売り】円安、止まらず!凄い勢いで暴落中。157円へ [219241683]
- 1,000万円のBMWに擦ってしまった札幌のガキ、捕らえられてガチで詰む [329329848]
- 死にたい死にたい死にたい死にたい死にたい死にたい死にたい死にたい死にたい
- 【悲報】ヤフコメ民「中国が水産物を輸入禁止にするなら、日本国民向けに安く販売すればいい。中国依存から脱するべき」 [153736977]
- 高市が首相になってから進次郎の評価が爆上がりしてる件について
- ウンコシュタイナー
