前スレ
C++相談室 part160
https://mevius.5ch.net/test/read.cgi/tech/1649979572/
探検
C++相談室 part161
■ このスレッドは過去ログ倉庫に格納されています
2022/05/21(土) 21:23:29.59ID:kYXfaM+5
562デフォルトの名無しさん
2022/08/18(木) 04:53:19.13ID:X/mZUHYK >>561
話変わってるだろ
検査してくれるかどうかじゃなくて
> ・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるがRustではそのコストを必要としない
の話だったと思うが?
話変わってるだろ
検査してくれるかどうかじゃなくて
> ・複数の参照があるとC++では参照カウントコストのかかるshared_ptrを使う必要があるがRustではそのコストを必要としない
の話だったと思うが?
563デフォルトの名無しさん
2022/08/18(木) 05:23:06.33ID:l0miaXwd >>562
それはC++で安全を保証しようとすると
複数の参照を用いるならば常にshared_ptrの使用を必須とするしか安全を保証できないのに対して
Rustは複数の参照だけなら借用のみで安全を保証できるという話ではないか
ちなみにRustでは複数の参照ではなくもっとレアケースである複数の所有が生じた時に初めてコンパイラがRcを要求する
つまりRustでは参照と所有が明白に分離されているところが大きな違いとなる
それはC++で安全を保証しようとすると
複数の参照を用いるならば常にshared_ptrの使用を必須とするしか安全を保証できないのに対して
Rustは複数の参照だけなら借用のみで安全を保証できるという話ではないか
ちなみにRustでは複数の参照ではなくもっとレアケースである複数の所有が生じた時に初めてコンパイラがRcを要求する
つまりRustでは参照と所有が明白に分離されているところが大きな違いとなる
564デフォルトの名無しさん
2022/08/18(木) 05:36:06.77ID:X/mZUHYK >>563
安全の保証をコンパイラがやるのかプログラマーがやるのかの違いなんて議論してないよ
安全の保証をコンパイラがやるのかプログラマーがやるのかの違いなんて議論してないよ
565デフォルトの名無しさん
2022/08/18(木) 07:06:14.45ID:DhI3ZTcW C++11以降のマナーでは、ダングリングは発生しない。
設計を見直すべきでは?
旧い規格、例えばDOMを実装する場合、設計を見直すことはできない。
ところで、DOMについて、C++によるGoogle Chromeの実装は素晴らしい洞察で問題を回避している。
後学のために読んでみるとよい。
設計を見直すべきでは?
旧い規格、例えばDOMを実装する場合、設計を見直すことはできない。
ところで、DOMについて、C++によるGoogle Chromeの実装は素晴らしい洞察で問題を回避している。
後学のために読んでみるとよい。
566デフォルトの名無しさん
2022/08/18(木) 07:10:02.07ID:DhI3ZTcW 如何にして安全なスパゲッティ・コードを書くかというのがRustのアプローチなら。
C++の方法論は、「安全なスパゲッティなど存在しない、素麺にしましょう」ということ。
旧式のスパゲッティ・コードを書きたい人にとってC++は役に立たない。
C++の方法論は、「安全なスパゲッティなど存在しない、素麺にしましょう」ということ。
旧式のスパゲッティ・コードを書きたい人にとってC++は役に立たない。
567デフォルトの名無しさん
2022/08/18(木) 08:09:28.79ID:ywzuYu7m まぁ、c++でももっと積極的にスタックフレームに限定するアプローチは欲しいよね。
以前にインスタンスがスタックフレームに存在することを保証するスマート変数を作ろうとしたけど、インスタンス変数をどうしても制限できなくて挫折したことがある。
スマートポインタが必ずスタックにあるのなら、スマートポインタの参照渡しとかもっと活用できるのにね。
以前にインスタンスがスタックフレームに存在することを保証するスマート変数を作ろうとしたけど、インスタンス変数をどうしても制限できなくて挫折したことがある。
スマートポインタが必ずスタックにあるのなら、スマートポインタの参照渡しとかもっと活用できるのにね。
568デフォルトの名無しさん
2022/08/18(木) 09:11:59.95ID:msbrE3Yp スタックかどうかなんてどうでもよくねえ?
機能の問題でしょ?
機能の問題でしょ?
569デフォルトの名無しさん
2022/08/18(木) 09:19:43.25ID:X/mZUHYK570デフォルトの名無しさん
2022/08/18(木) 09:41:11.96ID:zre7odKU 自動変数が嫌いな人一定数いるよね
571はちみつ餃子 ◆8X2XSCHEME
2022/08/18(木) 10:26:05.65ID:KKIhvA0h 大抵の環境でデフォルトのスタックサイズはそれほど大きくない。
数メガバイトというのは現代的な感覚では極端に小さいようにも見える。
でもまあだいたいこれで足りるし、足りるように書くのが普通なんじゃないの。
数メガバイトというのは現代的な感覚では極端に小さいようにも見える。
でもまあだいたいこれで足りるし、足りるように書くのが普通なんじゃないの。
572デフォルトの名無しさん
2022/08/18(木) 11:28:19.94ID:p/limWqp C > Nim > C++ > Rust
573デフォルトの名無しさん
2022/08/18(木) 11:29:37.71ID:p/limWqp >>569
GC要らなくなる
GC要らなくなる
574デフォルトの名無しさん
2022/08/18(木) 11:47:13.53ID:u9P7LJR3575デフォルトの名無しさん
2022/08/18(木) 11:47:44.39ID:u9P7LJR3 >>573
そりゃ全部スタック上で済むならね...
そりゃ全部スタック上で済むならね...
576はちみつ餃子 ◆8X2XSCHEME
2022/08/18(木) 12:03:37.12ID:KKIhvA0h >>574
割り当てが足りなくなれば拡張するが、その上限の設定がデフォルトでは 8MB になっている。
割り当てが足りなくなれば拡張するが、その上限の設定がデフォルトでは 8MB になっている。
577デフォルトの名無しさん
2022/08/18(木) 12:29:58.75ID:ywzuYu7m >>569
単にスタックフレームの入れ子のライフタイムを活用したいだけだな。
単にスタックフレームの入れ子のライフタイムを活用したいだけだな。
578デフォルトの名無しさん
2022/08/18(木) 12:35:06.23ID:R9m+Nq0X ポインタたくさん使う人っておじさんですよね?
実年齢か精神年齢かはともかく
実年齢か精神年齢かはともかく
579デフォルトの名無しさん
2022/08/18(木) 12:37:54.86ID:ywzuYu7m >>577
ちょっと補足。
スマートポインタがスタックにあるのなら、shared ptr の参照とかポインタみたいなヤバイのもそこそこ安全に扱える。余計なインクリメントデクリメントも発生しなくて良くなるし。
ちょっと補足。
スマートポインタがスタックにあるのなら、shared ptr の参照とかポインタみたいなヤバイのもそこそこ安全に扱える。余計なインクリメントデクリメントも発生しなくて良くなるし。
580デフォルトの名無しさん
2022/08/18(木) 12:41:39.14ID:cnxBrL/o なんでスタックである必要があるのかまったくわからん
581デフォルトの名無しさん
2022/08/18(木) 13:27:16.43ID:C4YsUD/k582デフォルトの名無しさん
2022/08/18(木) 13:29:45.98ID:KxsikMs2583デフォルトの名無しさん
2022/08/18(木) 13:34:11.90ID:AgenDKWc >>579
一見その通りだけど
関数で参照を返したい時に、その実体が呼び出し元(かそれ以前)のスタックフレーム上なのか、
それとも消え去る現在のスタック上なのか、安全を保証するために区別する情報が必要となる
そのためにはライフタイムをもっと明確化すればよく、参照が指す実体がスタック上でより深く(か同じ)ことを保証できればよい
すると更に大きな利点が生じる
実体がスタック上に無くてヒープ上に有っても、それを管理するスマポ相当がスタック上にあればライフタイムは同じとなるからだ
結局、スタック上かヒープ上かよりも、ライフタイムを明確化することが重要であると分かる
以上を言語仕様に組み込んだのがRust
一見その通りだけど
関数で参照を返したい時に、その実体が呼び出し元(かそれ以前)のスタックフレーム上なのか、
それとも消え去る現在のスタック上なのか、安全を保証するために区別する情報が必要となる
そのためにはライフタイムをもっと明確化すればよく、参照が指す実体がスタック上でより深く(か同じ)ことを保証できればよい
すると更に大きな利点が生じる
実体がスタック上に無くてヒープ上に有っても、それを管理するスマポ相当がスタック上にあればライフタイムは同じとなるからだ
結局、スタック上かヒープ上かよりも、ライフタイムを明確化することが重要であると分かる
以上を言語仕様に組み込んだのがRust
584デフォルトの名無しさん
2022/08/18(木) 13:54:28.67ID:cnxBrL/o585はちみつ餃子 ◆8X2XSCHEME
2022/08/18(木) 14:09:16.33ID:KKIhvA0h 私もそう思う。 C++ でも明確で、解釈の余地はほぼない。
その上で知ってても人は間違うというところは問題で、チェックを自動化できるように整理したという Rust の功績は大きくはある。
ルール自体の差は C++ と Rust でそれほど大きくはない。
その上で知ってても人は間違うというところは問題で、チェックを自動化できるように整理したという Rust の功績は大きくはある。
ルール自体の差は C++ と Rust でそれほど大きくはない。
586デフォルトの名無しさん
2022/08/18(木) 14:18:54.74ID:PTM9RcdX C++のライフタイムはプログラマーにとっては明確でもコンパイラにとっては明確でない
そのためC++では参照の安全性をコンパイラが保証することができない
そして複雑化した時に人間(プログラマー)はミスを無くすことが出来ない
そのためC++で書かれた多くのソフトウェアで常に穴が発生し続けている
そのためC++では参照の安全性をコンパイラが保証することができない
そして複雑化した時に人間(プログラマー)はミスを無くすことが出来ない
そのためC++で書かれた多くのソフトウェアで常に穴が発生し続けている
587デフォルトの名無しさん
2022/08/18(木) 15:34:56.12ID:KxsikMs2 unique_ptrやshared_ptrを使えば良いだけではないかな?
588はちみつ餃子 ◆8X2XSCHEME
2022/08/18(木) 16:15:40.31ID:KKIhvA0h >>587
C++ のスマートポインタはやっぱり後付け感はある。
Teratail とかの質問サイトを見てたら (コンパイル時にエラーに出来ない形で) 使い方を間違ってセグフォしてたりするのはちょくちょく有る。
コンパイラがガッツリと検査してくれる Rust はありがたいよ。
C++ のスマートポインタはやっぱり後付け感はある。
Teratail とかの質問サイトを見てたら (コンパイル時にエラーに出来ない形で) 使い方を間違ってセグフォしてたりするのはちょくちょく有る。
コンパイラがガッツリと検査してくれる Rust はありがたいよ。
589デフォルトの名無しさん
2022/08/18(木) 16:20:56.69ID:885GVGvO 無能な働き者の軌道修正には良いかもな
590デフォルトの名無しさん
2022/08/18(木) 16:27:29.27ID:9oKj6z2J 桐蔭トリプルプレーだよ
591デフォルトの名無しさん
2022/08/18(木) 16:37:31.46ID:AkD9iM7C たまにはweak_ptrのことも思い出して下さい
592デフォルトの名無しさん
2022/08/18(木) 16:59:01.63ID:4Dlj1ckV >>587
unique_ptrやshared_ptrの使い忘れや使い方ミスなどをしてもコンパイラはエラーとすることができないためC++は安全性を保証できない
他にもget()して得たポインタを関数などに渡した後にそのライフタイムを逸脱しないかなどの保証もできない
全ては人間頼みとなるため多数の穴が生じてきた
unique_ptrやshared_ptrの使い忘れや使い方ミスなどをしてもコンパイラはエラーとすることができないためC++は安全性を保証できない
他にもget()して得たポインタを関数などに渡した後にそのライフタイムを逸脱しないかなどの保証もできない
全ては人間頼みとなるため多数の穴が生じてきた
593デフォルトの名無しさん
2022/08/18(木) 19:33:28.16ID:74ku3J2B 性能厨としては何でもスタックフレームに置いて集積度を高くしたいところ。レジスタの効率とかキャッシュヒット率とか変わるだろうし。
Rustのスタックへのこだわりはいいんだけど、無駄に抽象化しているから余計に複雑になっている感じを受ける。
Rustのスタックへのこだわりはいいんだけど、無駄に抽象化しているから余計に複雑になっている感じを受ける。
594デフォルトの名無しさん
2022/08/18(木) 21:49:54.60ID:SUTQRi3H C++のスマポは言語機能じゃないから書き方長くてだるいし
外部ライブラリは当然ナマポ使ってるから結局その辺でセグフォの危険を排除できないし
オウムみたいにスマポでいいじゃん連呼してるやつは本当に使ったことあんのか?
外部ライブラリは当然ナマポ使ってるから結局その辺でセグフォの危険を排除できないし
オウムみたいにスマポでいいじゃん連呼してるやつは本当に使ったことあんのか?
595デフォルトの名無しさん
2022/08/18(木) 21:58:35.30ID:KxsikMs2 >>592
使えば?と私は提案してるので「使い忘れ」は論外として
「使い方ミス」はどんなミスでしょうか?
ミスのしようがないほど単純だと思います
Rustのコンパイル時にチェックしようという設計は
もちろん良いと思いますよ
使えば?と私は提案してるので「使い忘れ」は論外として
「使い方ミス」はどんなミスでしょうか?
ミスのしようがないほど単純だと思います
Rustのコンパイル時にチェックしようという設計は
もちろん良いと思いますよ
596デフォルトの名無しさん
2022/08/18(木) 22:02:08.08ID:KxsikMs2597デフォルトの名無しさん
2022/08/18(木) 22:07:53.92ID:0oaFEclW スマポにハンドルを突っ込む方法はないですかねえ‥‥
598デフォルトの名無しさん
2022/08/18(木) 22:12:02.34ID:3gZlWdNz >>596
君のような勘違い自信過剰な人がうっかりミスを起こして問題を引き起こしてきた
チェックを人間に依存している限りミスは必ず発生する
ソース記事
https://xtech.nikkei.com/atcl/nxt/column/18/00692/042700054/
グーグルによればAndroidに存在した深刻なセキュリティー脆弱性の70%近くがメモリー安全に関するバグに起因するという。
同様にマイクロソフトも、同社製品に存在したセキュリティー脆弱性の70%がメモリー安全に関するバグに起因すると述べている。
C/C++を使う限りセキュリティー脆弱性を根絶するのは不可能と
君のような勘違い自信過剰な人がうっかりミスを起こして問題を引き起こしてきた
チェックを人間に依存している限りミスは必ず発生する
ソース記事
https://xtech.nikkei.com/atcl/nxt/column/18/00692/042700054/
グーグルによればAndroidに存在した深刻なセキュリティー脆弱性の70%近くがメモリー安全に関するバグに起因するという。
同様にマイクロソフトも、同社製品に存在したセキュリティー脆弱性の70%がメモリー安全に関するバグに起因すると述べている。
C/C++を使う限りセキュリティー脆弱性を根絶するのは不可能と
599デフォルトの名無しさん
2022/08/18(木) 22:16:42.90ID:SUTQRi3H 使われないシステムってバグ出ないんだよね
600デフォルトの名無しさん
2022/08/18(木) 22:17:29.31ID:KxsikMs2601デフォルトの名無しさん
2022/08/18(木) 22:21:49.94ID:KxsikMs2 >>598
$ wget 'https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.19.1.tar.xz'
$ tar xJf linux-5.19.1.tar.xz
$ find linux-5.19.1 -name *.rs | wc -l
0
2021年4月30日の記事だけどまだコミットがないようだが?
Rustのsuffixってひょっとしてrsじゃない?
$ wget 'https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.19.1.tar.xz'
$ tar xJf linux-5.19.1.tar.xz
$ find linux-5.19.1 -name *.rs | wc -l
0
2021年4月30日の記事だけどまだコミットがないようだが?
Rustのsuffixってひょっとしてrsじゃない?
602デフォルトの名無しさん
2022/08/18(木) 22:29:53.88ID:6c/4Q98o >>600
それは貴方がアホだからミスに気付いていない可能性、使われないからバグが未発見なだけの可能性、単純なことしかしていないだけの可能性、…
複雑化すると、どんなにベテランでも、多数の人々がコードをチェックしていても、メモリ管理ミスが現実に起きている現実を受け入れましょ
それは貴方がアホだからミスに気付いていない可能性、使われないからバグが未発見なだけの可能性、単純なことしかしていないだけの可能性、…
複雑化すると、どんなにベテランでも、多数の人々がコードをチェックしていても、メモリ管理ミスが現実に起きている現実を受け入れましょ
603デフォルトの名無しさん
2022/08/18(木) 22:43:58.49ID:KxsikMs2604デフォルトの名無しさん
2022/08/18(木) 22:54:56.26ID:MfNSDyn2 誰もお前なんかに興味無い訳だが
605デフォルトの名無しさん
2022/08/18(木) 23:09:02.07ID:KxsikMs2606デフォルトの名無しさん
2022/08/18(木) 23:31:07.48ID:RTRtwr2z どんな複雑なケースでも一度もミスをしたことがない!今後も絶対にミスをしない!
と言ってる人を信頼できるわけがない
と言ってる人を信頼できるわけがない
607デフォルトの名無しさん
2022/08/18(木) 23:38:25.32ID:KxsikMs2608デフォルトの名無しさん
2022/08/18(木) 23:42:25.87ID:KxsikMs2 本当にunique_ptrやshared_ptrでミスするかい?
信じられないほど単純なクラスだと思うけど
>>592の「使い方ミス」って何なの?
getで中身取り出して云々は割とあり得るんだろーけど
それはunique_ptrやshared_ptrの外の出来事だし
信じられないほど単純なクラスだと思うけど
>>592の「使い方ミス」って何なの?
getで中身取り出して云々は割とあり得るんだろーけど
それはunique_ptrやshared_ptrの外の出来事だし
609デフォルトの名無しさん
2022/08/18(木) 23:58:49.20ID:B1ZNmtqG もちろんgetを使った時点でスマポ管轄外となり保証が全く無くなるが
スマポ自体における使い忘れや使い間違いなども色々とあるぜ
例えば
C++11スマートポインタで避けるべき過ち Top10
https://postd.cc/top-10-dumb-mistakes-avoid-c-11-smart-pointers/
スマポ自体における使い忘れや使い間違いなども色々とあるぜ
例えば
C++11スマートポインタで避けるべき過ち Top10
https://postd.cc/top-10-dumb-mistakes-avoid-c-11-smart-pointers/
610デフォルトの名無しさん
2022/08/19(金) 00:27:49.36ID:SM6rQCcv >>609
有難う!読んでみたよ!過ちを列挙すると以下の通り
>過ちその1: uniqueptrで十分なところにsharedptrを使う
>過ちその2: shared_ptrで共有されたリソース/オブジェクトをスレッドセーフにしない
>過ちその3: 自動ポインタ(auto_ptr)を使う
>過ちその4: sharedptrの初期化にmakesharedを使わない
>過ちその5: オブジェクト(生ポインタ)を作成してすぐにshared_ptrに割り当てない
>過ちその6: shared_ptrで使用されている生ポインタを削除してしまう
>過ちその7: ポインタの配列にshared_ptrを使用する際にカスタムデリータを使用しない
>過ちその8: 共有ポインタを使用する時に循環参照を回避しない
>過ちその9: unique_ptr.release()で返された生ポインタを削除しない
>過ちその10: weak_ptr.lock()を呼び出す際に、有効か否かを確認しない
俺については4はmake_sharedを知らなかった時期にはやってたけど知ってからはないね
3はunique_ptrがstdに入って全部リプレースした
あとは過去にも犯さず使用しできてるよ
みんなはどうだい?
有難う!読んでみたよ!過ちを列挙すると以下の通り
>過ちその1: uniqueptrで十分なところにsharedptrを使う
>過ちその2: shared_ptrで共有されたリソース/オブジェクトをスレッドセーフにしない
>過ちその3: 自動ポインタ(auto_ptr)を使う
>過ちその4: sharedptrの初期化にmakesharedを使わない
>過ちその5: オブジェクト(生ポインタ)を作成してすぐにshared_ptrに割り当てない
>過ちその6: shared_ptrで使用されている生ポインタを削除してしまう
>過ちその7: ポインタの配列にshared_ptrを使用する際にカスタムデリータを使用しない
>過ちその8: 共有ポインタを使用する時に循環参照を回避しない
>過ちその9: unique_ptr.release()で返された生ポインタを削除しない
>過ちその10: weak_ptr.lock()を呼び出す際に、有効か否かを確認しない
俺については4はmake_sharedを知らなかった時期にはやってたけど知ってからはないね
3はunique_ptrがstdに入って全部リプレースした
あとは過去にも犯さず使用しできてるよ
みんなはどうだい?
611デフォルトの名無しさん
2022/08/19(金) 00:34:39.73ID:aSCRajpd getを使ってしまったらthe endなわけだけど
getの使用を皆無で頑張ってるん?
getの使用を皆無で頑張ってるん?
612デフォルトの名無しさん
2022/08/19(金) 00:47:36.81ID:SM6rQCcv613デフォルトの名無しさん
2022/08/19(金) 01:36:44.63ID:Iq0pX04r614デフォルトの名無しさん
2022/08/19(金) 01:38:01.85ID:M+KL048w なんでポインタ使うんですか?
615デフォルトの名無しさん
2022/08/19(金) 02:09:43.59ID:SM6rQCcv >>613
その書いている「参照」ってのはC++の参照ではないですよね?
関数にT型のオブジェクトを引数として渡すとき
関数がシーケンシャルに実行されるなら原則としてT &で渡す
中身が無効値である可能性があるならunique_ptr <T> &で渡す
関数が並行に実行されるならshared_ptr <T>を渡す
その書いている「参照」ってのはC++の参照ではないですよね?
関数にT型のオブジェクトを引数として渡すとき
関数がシーケンシャルに実行されるなら原則としてT &で渡す
中身が無効値である可能性があるならunique_ptr <T> &で渡す
関数が並行に実行されるならshared_ptr <T>を渡す
616デフォルトの名無しさん
2022/08/19(金) 03:25:13.02ID:oQfRblXd T&渡した時にそれが他へ転用され保持されて生き残り続ける可能性を考慮しないの?
617デフォルトの名無しさん
2022/08/19(金) 05:39:15.80ID:HCuI/gXC 静的試験を絶対視するなーんにも分かっとらんやつが推すほどイメージが悪くなるな
618デフォルトの名無しさん
2022/08/19(金) 07:27:50.77ID:QMISJLeV619デフォルトの名無しさん
2022/08/19(金) 08:01:50.73ID:slQGFe9J620デフォルトの名無しさん
2022/08/19(金) 08:25:03.05ID:SM6rQCcv >>616
は? 詳しく
は? 詳しく
621デフォルトの名無しさん
2022/08/19(金) 08:45:24.08ID:xzucV8hS >>597
constructor destructor関数オブジェクトを用意すれば良かったんじゃなかったっけ?smart ptrの典型的な応用例だから、調べりゃすぐ出てくるよ。
constructor destructor関数オブジェクトを用意すれば良かったんじゃなかったっけ?smart ptrの典型的な応用例だから、調べりゃすぐ出てくるよ。
622デフォルトの名無しさん
2022/08/19(金) 08:56:07.71ID:HCuI/gXC >>619
ふーんチェックなのかpgr
ふーんチェックなのかpgr
623デフォルトの名無しさん
2022/08/19(金) 10:22:48.97ID:51hioa9S >>617
俺も以前はそう思っていたんだけど
わずかな補助情報を人間が与えるだけで
Rustコンパイラが静的試験してくれて
人間にとって面倒かつ慎重さを必要とする作業から解放してくれるのを知って考えが変わった
例えて言うなら
動的型付け言語を使っていたところを
わずかな型情報を人間が与えるだけで
静的型付け言語のコンパイラが静的試験をしてくれるようになったのと似てる
俺も以前はそう思っていたんだけど
わずかな補助情報を人間が与えるだけで
Rustコンパイラが静的試験してくれて
人間にとって面倒かつ慎重さを必要とする作業から解放してくれるのを知って考えが変わった
例えて言うなら
動的型付け言語を使っていたところを
わずかな型情報を人間が与えるだけで
静的型付け言語のコンパイラが静的試験をしてくれるようになったのと似てる
624はちみつ餃子 ◆8X2XSCHEME
2022/08/19(金) 11:08:02.29ID:FT/EuRcZ 昔とはソフトウェアの規模感が違う。
そしてプログラミングするのがプログラミングの専門化とは限らない領域が増えた。
(いわゆるエンドユーザー・コンピューティング)
職業的なプログラマにしてもプログラミングの専門化というよりは
別分野のそれぞれの専門化が道具としてのプログラムを作るというような場合も多い。
プログラミングのルールや作法を行きわたらせることは出来ないよ。
検査を強くするのは時代的な背景としても自然に思える。
動的な検査でも静的な検査でもいいが、
C/C++ は検査せずに未定義に突入するのがあまりにも簡単すぎる。
そしてプログラミングするのがプログラミングの専門化とは限らない領域が増えた。
(いわゆるエンドユーザー・コンピューティング)
職業的なプログラマにしてもプログラミングの専門化というよりは
別分野のそれぞれの専門化が道具としてのプログラムを作るというような場合も多い。
プログラミングのルールや作法を行きわたらせることは出来ないよ。
検査を強くするのは時代的な背景としても自然に思える。
動的な検査でも静的な検査でもいいが、
C/C++ は検査せずに未定義に突入するのがあまりにも簡単すぎる。
625デフォルトの名無しさん
2022/08/19(金) 11:09:58.15ID:HCuI/gXC >>623
ナマポひとつロクに扱いきれないスキルと
動的チェックなんて恥ずかしげもなく言っちゃう
バカ用言語があんたにとって有難いのは分かったよ
ここはC++相談室
C++という土俵に立っている者の場だ
落ちこぼれて逃げ出したやつの遠吠えは
誰も聞きたがってない
どっか行け、邪魔なんだよ
ナマポひとつロクに扱いきれないスキルと
動的チェックなんて恥ずかしげもなく言っちゃう
バカ用言語があんたにとって有難いのは分かったよ
ここはC++相談室
C++という土俵に立っている者の場だ
落ちこぼれて逃げ出したやつの遠吠えは
誰も聞きたがってない
どっか行け、邪魔なんだよ
626デフォルトの名無しさん
2022/08/19(金) 11:17:41.46ID:HCuI/gXC 自分のミスを道具のせいにするやつ
そういえば法案のミスをワープロのせいにするバカ役人がいたな
こういう手合いは一事が万事
そういえば法案のミスをワープロのせいにするバカ役人がいたな
こういう手合いは一事が万事
627デフォルトの名無しさん
2022/08/19(金) 11:44:22.83ID:SM6rQCcv >>616が何を言いたいのか今もって分からない
悩む
悩む
628デフォルトの名無しさん
2022/08/19(金) 11:53:43.76ID:SM6rQCcv 一般用語の参照を使ってると思われるあたり
この人(>>613)はC++の参照を知らないレベルだと思うんだよね
C++に関してはほぼ知識がないまま
受け売りでRustが生ポインタを廃止?した利点を主張している
(私もRustのコードは書いたことがないんだけども)
この人は何がしたいんだろうか?
この人(>>613)はC++の参照を知らないレベルだと思うんだよね
C++に関してはほぼ知識がないまま
受け売りでRustが生ポインタを廃止?した利点を主張している
(私もRustのコードは書いたことがないんだけども)
この人は何がしたいんだろうか?
629デフォルトの名無しさん
2022/08/19(金) 11:59:22.84ID:6kbXcgP9 OSのAPIなりその他雑多なライブラリなりでポインタ要るからなあ・・・
630デフォルトの名無しさん
2022/08/19(金) 12:19:36.97ID:HCuI/gXC 動的型付け・・・あー、もしかして動的型宣言のことかな?
だとすると具体的に何言語のことを言ってるんだろう?
Bにはそんなもんないし・・・
だとすると具体的に何言語のことを言ってるんだろう?
Bにはそんなもんないし・・・
631デフォルトの名無しさん
2022/08/19(金) 12:44:26.95ID:BT0K6AVq 昔構造体を値で渡したらポインタにしろっておっさんに怒られたっけ
速度を気にしないんだったらコピーでええのに糞めんどくさかったわ
速度を気にしないんだったらコピーでええのに糞めんどくさかったわ
632デフォルトの名無しさん
2022/08/19(金) 12:47:51.92ID:zzLlPl0v 馬鹿が二人ほど恥を晒しております
633デフォルトの名無しさん
2022/08/19(金) 12:51:04.37ID:FysKbdqv634デフォルトの名無しさん
2022/08/19(金) 13:06:02.28ID:HCuI/gXC635デフォルトの名無しさん
2022/08/19(金) 13:47:12.04ID:FysKbdqv >>634
あまりにも無知すぎて話にならないな
wikipediaでも何でもいいから勉強して出直して来い
動的な型と動的型付けの区別は最低限つけろ
静的型付け言語の中には動的な型と呼ぶものもあるが
静的型付けと動的型付けは基本的に排反の関係だ
あまりにも無知すぎて話にならないな
wikipediaでも何でもいいから勉強して出直して来い
動的な型と動的型付けの区別は最低限つけろ
静的型付け言語の中には動的な型と呼ぶものもあるが
静的型付けと動的型付けは基本的に排反の関係だ
636デフォルトの名無しさん
2022/08/19(金) 13:54:09.00ID:SM6rQCcv >>616が何を言いたいのか今もって分からない
悩む
悩む
637デフォルトの名無しさん
2022/08/19(金) 14:06:18.12ID:zzLlPl0v その一文がわからないようなレベルの奴がメモリ管理で全く失敗ないとか言ってんだもん
みんな呆れてんだよ
みんな呆れてんだよ
638デフォルトの名無しさん
2022/08/19(金) 14:08:38.12ID:SM6rQCcv639デフォルトの名無しさん
2022/08/19(金) 14:09:02.63ID:HCuI/gXC640デフォルトの名無しさん
2022/08/19(金) 14:28:41.00ID:SM6rQCcv641デフォルトの名無しさん
2022/08/19(金) 14:40:23.82ID:FysKbdqv642デフォルトの名無しさん
2022/08/19(金) 16:45:49.60ID:SM6rQCcv643デフォルトの名無しさん
2022/08/19(金) 17:07:32.80ID:rkGmDNWr 栄光在天
聖恩心から感謝申し上げます。
日ごろは激しい摂理の中、プログラム業ごくろうさまです。
さて、C++のコピーコンストラクタおよび代入演算子オーバーロードの質問でございますが、メンバ変数全てを関数定義内部で書き出すととてつもない量になってしまいます。
class Hoge
{
Hoge& Operator =(const Hoge&r);
int hage=0;
char sage=0;
std::unique-ptr<Hagehage> pHagehage;
etc…
Etc…
Eat…
};
Hoge& Hoge::operator=(const Hoge&r)
{
hage=r.hage;
sage=r.sage;
pHagehage=std::make-unique<Hagehage>(r);
Etc etc……
}
メンバにユニークポインタがあるので書き出さないとダメな感じになっちゃうのですが……量がががが(>_<)
これらにおいて、何か楽になるような裏技はありますか?
それとも一つづつ足していかなければならないのでしょうか?
もしかしたらコンパイラやIEDの部門で行うべき変な質問かなとも思いますが……何かやり方やティップがありましたら教えていただければ……
相対的に有田退治にもなります!
聖恩心から感謝申し上げます。
日ごろは激しい摂理の中、プログラム業ごくろうさまです。
さて、C++のコピーコンストラクタおよび代入演算子オーバーロードの質問でございますが、メンバ変数全てを関数定義内部で書き出すととてつもない量になってしまいます。
class Hoge
{
Hoge& Operator =(const Hoge&r);
int hage=0;
char sage=0;
std::unique-ptr<Hagehage> pHagehage;
etc…
Etc…
Eat…
};
Hoge& Hoge::operator=(const Hoge&r)
{
hage=r.hage;
sage=r.sage;
pHagehage=std::make-unique<Hagehage>(r);
Etc etc……
}
メンバにユニークポインタがあるので書き出さないとダメな感じになっちゃうのですが……量がががが(>_<)
これらにおいて、何か楽になるような裏技はありますか?
それとも一つづつ足していかなければならないのでしょうか?
もしかしたらコンパイラやIEDの部門で行うべき変な質問かなとも思いますが……何かやり方やティップがありましたら教えていただければ……
相対的に有田退治にもなります!
644はちみつ餃子 ◆8X2XSCHEME
2022/08/19(金) 17:19:48.26ID:FT/EuRcZ >>643
メンバを
Hoge& Operator=(const Hoge&r)=default;
というように宣言すればデフォルトの定義が実装される。
全てのメンバに対して代入演算子を適用したのと同じことになる。
(もちろん全てのメンバを代入するという挙動で駄目な場合は自分で書くしかしょうがない。)
メンバを
Hoge& Operator=(const Hoge&r)=default;
というように宣言すればデフォルトの定義が実装される。
全てのメンバに対して代入演算子を適用したのと同じことになる。
(もちろん全てのメンバを代入するという挙動で駄目な場合は自分で書くしかしょうがない。)
645デフォルトの名無しさん
2022/08/19(金) 17:31:34.37ID:HCuI/gXC >>641
そのレスには動的な型についての言及がないな
誤魔化したいわけね、返事ありがとう
動的型宣言という言葉は存在しないと言いながら
動的型付けとは【意味が違う】とはどういうことだ?
存在しないものは比較できないはずだぞ
operator<=>でSFINAEだなpgr
そのレスには動的な型についての言及がないな
誤魔化したいわけね、返事ありがとう
動的型宣言という言葉は存在しないと言いながら
動的型付けとは【意味が違う】とはどういうことだ?
存在しないものは比較できないはずだぞ
operator<=>でSFINAEだなpgr
646デフォルトの名無しさん
2022/08/19(金) 17:35:12.15ID:HCuI/gXC >>624-629には沈黙か
大草原
大草原
647はちみつ餃子 ◆8X2XSCHEME
2022/08/19(金) 17:39:10.42ID:FT/EuRcZ >>643
そもそも代入演算子は特に指定しなくても定義されるはずだな。
(ただし基底とメンバの全てが代入可能であるとき。)
class foo {
public:
int x, y, z;
foo(int x, int y, int z) : x(x), y(y), z(z) {}
foo(void) : x(0), y(0), z(0) {}
};
int main(void) {
foo x(1, 2, 3), y;
y=x; // 代入できる
}
そもそも代入演算子は特に指定しなくても定義されるはずだな。
(ただし基底とメンバの全てが代入可能であるとき。)
class foo {
public:
int x, y, z;
foo(int x, int y, int z) : x(x), y(y), z(z) {}
foo(void) : x(0), y(0), z(0) {}
};
int main(void) {
foo x(1, 2, 3), y;
y=x; // 代入できる
}
648デフォルトの名無しさん
2022/08/19(金) 19:46:49.43ID:FysKbdqv649デフォルトの名無しさん
2022/08/19(金) 19:50:44.27ID:HCuI/gXC >>648
勝ったーwww
勝ったーwww
650デフォルトの名無しさん
2022/08/19(金) 19:52:29.50ID:kYAWbXnu >>648
負けちゃったね・・・(´・ω・`)
負けちゃったね・・・(´・ω・`)
651デフォルトの名無しさん
2022/08/19(金) 20:42:25.54ID:rkGmDNWr >>644
>>647
規制されてしまいましたが643でございます。
メンバにユニークポインタがある場合は代入演算子とコピコンは削除された関数とされてしまい、コピーが実行できません(涙
ユニークポインタは明示的に複製されないとだめなのはわかるので、仕様には文句があるべくもないのですが……
例えばの話、データ型にint char等のメンバが100個あったとして、ユニークポインタのユーザー定義型が1個紛れ込むだけで、すべてのメンバを書き出しをしなければいけないのでしょうか?
みなさんはちゃんと書きだしているのですか?と疑問に思ったので・・・
まあユニークポインターを含むデータ型をコピーしない運用をなさっているのだと思うのですが、わたしは使ってしまいます(怒)
そこで、なにか裏技のような方法がないのかなとお聞きしてみた次第であります(`・ω・´)ゞ
>>647
規制されてしまいましたが643でございます。
メンバにユニークポインタがある場合は代入演算子とコピコンは削除された関数とされてしまい、コピーが実行できません(涙
ユニークポインタは明示的に複製されないとだめなのはわかるので、仕様には文句があるべくもないのですが……
例えばの話、データ型にint char等のメンバが100個あったとして、ユニークポインタのユーザー定義型が1個紛れ込むだけで、すべてのメンバを書き出しをしなければいけないのでしょうか?
みなさんはちゃんと書きだしているのですか?と疑問に思ったので・・・
まあユニークポインターを含むデータ型をコピーしない運用をなさっているのだと思うのですが、わたしは使ってしまいます(怒)
そこで、なにか裏技のような方法がないのかなとお聞きしてみた次第であります(`・ω・´)ゞ
652デフォルトの名無しさん
2022/08/19(金) 20:46:36.71ID:xBNdlDtB653デフォルトの名無しさん
2022/08/19(金) 21:01:24.21ID:rkGmDNWr >>652
メンバ変数 std::unique_ptr<My_Uniq> my_uniq; において
this->my_uniq=std::make_unique<My_Uniq>(*(right_arg.my_uniq.get()));
とコピーできるのはシンプルなのですが……
struct hoge
{
hoge& operator=(const hoge& r);
int a=0,b=0,c=0;
char d=0,e=0,f=0;
std::string g,h,q;
std::unique_ptr<MyHage> pMHage;
};
といった構造体において、
hoge& hoge::operator=(const hoge& r)
{
//メンバ全部かかなきゃいけない( ;∀;)
}
という感じになってしまうのが困るというか……もっと楽できないかなと思いまして(´;ω;`)
メンバ変数 std::unique_ptr<My_Uniq> my_uniq; において
this->my_uniq=std::make_unique<My_Uniq>(*(right_arg.my_uniq.get()));
とコピーできるのはシンプルなのですが……
struct hoge
{
hoge& operator=(const hoge& r);
int a=0,b=0,c=0;
char d=0,e=0,f=0;
std::string g,h,q;
std::unique_ptr<MyHage> pMHage;
};
といった構造体において、
hoge& hoge::operator=(const hoge& r)
{
//メンバ全部かかなきゃいけない( ;∀;)
}
という感じになってしまうのが困るというか……もっと楽できないかなと思いまして(´;ω;`)
654デフォルトの名無しさん
2022/08/19(金) 21:08:44.41ID:xBNdlDtB655デフォルトの名無しさん
2022/08/19(金) 21:14:52.11ID:rkGmDNWr656デフォルトの名無しさん
2022/08/19(金) 21:36:17.81ID:rkGmDNWr 643です
解決しました
皆様ご親切にありがとうござい甘いた
ラップしてオペレーター実装すればいいだけだったとは……
こんなので悩んでるの私だけではないだろうか
解決しました
皆様ご親切にありがとうござい甘いた
ラップしてオペレーター実装すればいいだけだったとは……
こんなので悩んでるの私だけではないだろうか
657652
2022/08/19(金) 23:10:05.19ID:SM6rQCcv >>656
携帯だったので書けなかったけどこんな感じで
template <typename T>
class deeep_copy_unique_ptr: private std::unique_ptr <T>
{
using Base_ = std::unique_ptr <T>;
public:
explicit deeep_copy_unique_ptr (T *p = nullptr): Base_ (p) {}
deeep_copy_unique_ptr (const deeep_copy_unique_ptr <T> &p): Base_ (std::make_unique <T> (*p)) {}
deeep_copy_unique_ptr &operator = (const deeep_copy_unique_ptr <T> &p) {Base_::operator = (std::make_unique <T> (*p)); return *this;}
using Base_::operator *;
};
携帯だったので書けなかったけどこんな感じで
template <typename T>
class deeep_copy_unique_ptr: private std::unique_ptr <T>
{
using Base_ = std::unique_ptr <T>;
public:
explicit deeep_copy_unique_ptr (T *p = nullptr): Base_ (p) {}
deeep_copy_unique_ptr (const deeep_copy_unique_ptr <T> &p): Base_ (std::make_unique <T> (*p)) {}
deeep_copy_unique_ptr &operator = (const deeep_copy_unique_ptr <T> &p) {Base_::operator = (std::make_unique <T> (*p)); return *this;}
using Base_::operator *;
};
658デフォルトの名無しさん
2022/08/20(土) 17:45:23.06ID:K3rnpbr9659デフォルトの名無しさん
2022/08/20(土) 17:53:55.99ID:zyxn7VyM ハンドルごとに異なるデストラクタを指定すればよいのでは?
何が難しいのかソースで示してくれませんか?
何が難しいのかソースで示してくれませんか?
660デフォルトの名無しさん
2022/08/20(土) 17:54:26.62ID:ThG9yriU661はちみつ餃子 ◆8X2XSCHEME
2022/08/20(土) 18:23:11.87ID:ktmIW8Jj >>658
ポインタ以外のリソース一般を扱うための unique_resource クラスの提案は出ている。
一部の処理系では使えるようになっているし、ポータブルな実装があるので導入してみてもいいかもね。
このような提案が出ているのは逆に言えばスマートポインタではハンドルを上手く扱えないということでもある。
ポインタ以外のリソース一般を扱うための unique_resource クラスの提案は出ている。
一部の処理系では使えるようになっているし、ポータブルな実装があるので導入してみてもいいかもね。
このような提案が出ているのは逆に言えばスマートポインタではハンドルを上手く扱えないということでもある。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 経団連会長、日中は建設的対話を 経済3団体が高市首相と初会談も日中関係は話題に登らず… [BFU★]
- 中国で「クレしん」公開延期 対日報復、エンタメに波及 [蚤の市★]
- 【映画】『クレヨンしんちゃん』 中国で公開延期 対日報復、エンタメに波及 [冬月記者★]
- Xのネトウヨは大体高齢独身。40過ぎて独身だと例外なく狂うって本当だったんだなと思う [805596214]
- 生活保護だけど30万円のPCの椅子買おうか迷ってる
- 日経時間外、5万円割れ 垂直落下始まる [402859164]
- 有識者「高市総理が発言を撤回したり、辞職するしかないと言っている人は、それで日中関係が今まで通りになると思ってる?」 [834922174]
- 女の子に生まれ変わったらやりたいこと🍓🍫💄❤ [856698234]
- ウッドデッキで調子こいてたやついたじゃん
