X



C++相談室 part136
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ bf81-LHz9)
垢版 |
2018/06/07(木) 23:40:12.36ID:GNQuDMaA0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part135
https://mevius.5ch.net/test/read.cgi/tech/1522495206/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

■長いソースを貼るときはここへ。■
 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
0020デフォルトの名無しさん (ワッチョイ 13d2-MIhW)
垢版 |
2018/06/09(土) 19:33:13.71ID:O5NYHXm/0
最近は規格を完全に満たしたコンパイラって存在するの?
0021デフォルトの名無しさん (ワッチョイ a9f2-LHz9)
垢版 |
2018/06/09(土) 19:46:23.57ID:ar7EC0zB0
C++11は結構「満を持して」って感じだったけど、その後14だ17だとアップデートサイクルが
短くなるならCfrontに回帰してもらった方がハッピーな気がしてきた。
今のC++で技術的にどのくらいしんどいのかはわからないけど、TypeScriptやBabelなんかの
JS界隈でうまくいってるエコシステムがうらやましい。
0022デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/09(土) 19:59:17.07ID:MhKfyDgC0
>>21
> JS界隈でうまくいってるエコシステムがうらやましい。
それはお前がJSを知らず、隣の芝が青く見えるだけ。
あれは完全に屋上架屋で糞だ。C++のノリで動くと思ったら大間違い。
0024デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/09(土) 20:09:30.83ID:HrZn4m/i0
コンパイラを駆動するためのプログラミングと、実行可能形式を駆動するためのプログラミングを一度にできる、一粒で二度おいしい言語がC++である。
つまり、ビールとワインを混ぜたらとてもまずかったというお話。
0025デフォルトの名無しさん (ワッチョイ a9f2-LHz9)
垢版 |
2018/06/09(土) 20:11:55.73ID:ar7EC0zB0
>>22

TypeScriptもBabelも普通に使ってるけど?
それがうまくいってるのを見てるからこそC++もそうできたらいいと思ったんだが。
まぁ、コンパイルに時間がかかるのとデバッグがちょっと隔靴掻痒気味ってのはある。
0026デフォルトの名無しさん (ワッチョイ 6b13-LHz9)
垢版 |
2018/06/09(土) 20:19:03.73ID:nw+86khE0
>>21
つーかC++11って、みんなもう待ちくたびれて
C++0xという期限も守れなくて、
一部でC++オワコン?とか言い出してる雰囲気の中、
ああ、やっぱりあるのかという復活祭的なもんだったろ
0028デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/09(土) 20:22:20.01ID:HrZn4m/i0
>>27
何を言うか!
Javascriptが最強の完成された言語だからこそ、Typescriptが誕生できたんじゃないか!!!
0030デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/09(土) 20:25:24.52ID:HrZn4m/i0
C++がこっち方向→に糞だとすると、Javascriptは←あっち方向に糞。
0031デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/09(土) 20:25:28.19ID:MhKfyDgC0
>>25
要するに、自分が慣れている環境を持ち込みたいだけだろ。
ならJavaScript流に言えば、お前が作れ、でしかないだろ。
ご自由にOSSにすればいい。誰も使わないと思うけど。
0032デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/09(土) 20:29:08.98ID:HrZn4m/i0
歯糞耳糞を笑うというが、本物のウンコには誰も勝てなかったというお話。
0033デフォルトの名無しさん (ワッチョイ a9f2-LHz9)
垢版 |
2018/06/09(土) 20:34:01.02ID:ar7EC0zB0
>>26
結構印象が違うもんだね。
C++03が失敗気味でオワコン視された雰囲気はわかるけど、だからこそ次は失敗できない
C++11はそれなりの完成度になったと思うんだが。逆に14や17は蛇足気味のような。
0034デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/09(土) 20:34:26.33ID:HrZn4m/i0
しかしJavascriptとC++を完全に理解した俺が最強ってことだろうな。
0037デフォルトの名無しさん (ワッチョイ 6b13-LHz9)
垢版 |
2018/06/09(土) 21:28:50.56ID:nw+86khE0
>>33
いや14は重要なバグ直しでautoが安心して使えるようになったし
17はfilesystemやstring_viewにexecution(これすげー)が入って名実共にメジャー
やっぱC++03からの沈黙が異常すぎたんだよ
0038はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)
垢版 |
2018/06/09(土) 21:39:20.39ID:EdmRUNh70
>>36
常に最新を使えとまでは思わんが、さすがに C++11 は人権だと思うぞ。

C++14 や C++17 はユーザ視点では重要なものも含まれるとは思うが、
C++11 に間に合わなかったりミスがあったりしたのを補った、
マイナーアップデートという印象は有るな。
0043はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)
垢版 |
2018/06/09(土) 22:05:12.82ID:EdmRUNh70
>>39
えっ、それって重要な機能のひとつじゃね?

ライブラリは標準になくてもなんとかなるけど、
基礎的な機能で大事なトピックがてんこ盛りなのが C++11 でしょ。

最低でも

auto
decltype
constexpr
可変長引数テンプレート

あたりは無いとつらすぎるんですけど!
0044デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/09(土) 22:20:04.89ID:MhKfyDgC0
>>38
> 常に最新を使えとまでは思わんが、さすがに C++11 は人権だと思うぞ。
そりゃ人に依るだろ。今でもCは現役なんだし。

>>43
ちなみに他言語を使わない理由は何だ?
おそらく君はインラインアセンブラとか全く使わない人だろ?
0045デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/09(土) 22:26:37.24ID:HrZn4m/i0
C++17はDoxygenを凄いことにする。
ひどい奴だ。
0046デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/09(土) 22:30:21.93ID:HrZn4m/i0
std::unique_ptrはユニポと読むんだよな?
0047はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)
垢版 |
2018/06/09(土) 22:31:54.21ID:EdmRUNh70
>>44
> ちなみに他言語を使わない理由は何だ?

Scheme スレが私の巣だと思ってるくらいには Scheme 派なんだけど、
話題が少なくて暇だからこっちに出てきてる感じ。

> おそらく君はインラインアセンブラとか全く使わない人だろ?

使わないに越したことは無いというのが基本姿勢ではあるけど、使う必要があるので使うよ。

どういう意図で言ってんのかよくわかんないんだけど、
C++11 以降に加わった機能がスゲー大事という気持ちとこれらが何か関係あるの?
0048デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/09(土) 22:44:45.79ID:HrZn4m/i0
人は皆生まれながらにC++が好きだけど、その気持ちに気づくかどうかに違いが出るんだよね。
0049デフォルトの名無しさん
垢版 |
2018/06/09(土) 22:49:33.71
がしゃーん
     がしゃーん

   △ ¥ ▲
  ( C ++ C )
  (      )
 /│  肉  │\
<  \___/  >
    ┃  ┃
   =  =
C++17だよ
自動で Doxygenを凄いことにしてくれる
ひどいやつだよ
0051デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/09(土) 23:00:19.02ID:MhKfyDgC0
>>47
俺はC++を使う利点は

・高位から低位まで同一言語でカバー出来る点

だと思っていて、逆に言えば、
高位でしか組まないのなら他高位言語を使った方がいいと思ってるんだよ。
だからC++の利点を生かす為には、

・高位の機能と低位の機能を混ぜて使う
 =スマポもラムダもナマポもインラインアセンブラも 『同時に』 使う

事が必要で、逆に、このスレに巣くっているナマポ禁止な連中には若干懐疑的なんだよ。
それなら他言語の方が生産性が高いから。
必要ならその部分だけCのDLLにすれば済む話だし。

そして最近の新機能は高位向けの物が多いから、聞いてみたわけだ。
Schemeは知らんが、他高位言語を使っているのなら済まんかった。
0052はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)
垢版 |
2018/06/09(土) 23:16:26.11ID:EdmRUNh70
>>51
高から低をカバーしてるのが良いというのは私もまったく同意見だよ。
だから、高から低をカバーと言っておきながら、高水準の部分は他言語に任せた方がいいというのはなんか矛盾してないか?

俺は「(現代の水準では) 足りてないからもっと (少なくとも C++11 で追加された分くらいは) 欲しいよな」って気持ちなわけ。
0053デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/09(土) 23:38:56.87ID:MhKfyDgC0
>>52
矛盾してない。

高水準の部分はC++は他言語に対して後れているから、
C++がそれを追加するのは妥当ではある。

ただ、俺なら他言語で組んで、CのDLLを呼ぶようにする。
それだと、他言語の進んでいる高水準機能を使えるから。
わざわざ遅れているC++に対して文句を言いながら使う意味がない。

例えば、C#がその作りになってるでしょ。
マーシャルがウザイか、C++の機能的周回遅れがウザイかってだけ。
勿論、インラインアセンブラを使いたいならC++しか解がない。
で、ナマポ禁止派はいったい何がしたいんだ?ってのが疑問で、
それだったら俺と同じでC#+CのDLLで良いじゃん、と思うわけ。
0056デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/10(日) 00:35:42.54ID:CUftH0/Q0
99.9%がスマポなら、最初からスマポがデフォの言語を使った方が捗るでしょ。
Rustでもいいし、C#やJava等のGC言語でもいいし、PythonやRubyのようなスクリプト言語でもいい。
残り0.1%をマーシャルなりしてCのDLLで。
0057デフォルトの名無しさん (ワッチョイ 135e-JdDl)
垢版 |
2018/06/10(日) 00:42:34.12ID:z8yivKF60
話をぶった切ってすんません。

複数のスレッドで

thread_local int* p;

p=new int [1000];

で確保したヒープ領域はやっぱりスレッドセーフ、じゃない、データ競合が
おきるんですか?
0058はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)
垢版 |
2018/06/10(日) 00:59:52.96ID:NuBmj+pR0
>>53
まー、生ポインタは一箇所たりとも許さんってほどの原理主義は過激だとは思うよ。
俺も生ポインタを使わないことはないし、 goto を使うことだってあるし。

ただ、「低レイヤから高レイヤまでをひとつの言語の中で扱える」というのは
「高レイヤな機能で低レイヤを隠蔽可能だ」ということであって、
低レイヤを低レイヤのままで扱うスタイルを是とするものではない。
直接的な部分ではインラインアセンブラを使うことが有っても、
その上のレイヤに持ち上げるときには必ずスマートポインタを使えってくらいの主張なら真っ当だと思う。

C++ なんてそもそもがクソなんだから、
解決のために追加された機能は積極的に使わないとやっとれんわ。
(でも好き。)
0059デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 01:03:04.42ID:WzrD1lk70
>>57
起きないです。
0060はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)
垢版 |
2018/06/10(日) 01:06:27.33ID:NuBmj+pR0
>>57
thread_local で宣言した変数は名前が同じだけでスレッドごとに違う存在だし、
それぞれのスレッドで new したならそれぞれのスレッドで配列が確保されてる。

別のスレッドの p (やそれが指す先の配列) にアクセスすれば競合が起こることは有りうるが、そうじゃないんだよね?
0061デフォルトの名無しさん (ワッチョイ 135e-JdDl)
垢版 |
2018/06/10(日) 01:11:48.03ID:z8yivKF60
>>59

ありがとうございます。これが本当ならホッとします。

でも、これって規格書に明確に記述されているのか、コンパイラがそういう仕様の
アセンブラコードを吐き出しているだけなのかわかりません。

データ競合がおきたら修羅場ですw
0062デフォルトの名無しさん (ワッチョイ 135e-JdDl)
垢版 |
2018/06/10(日) 01:14:17.08ID:z8yivKF60
>>60

ありがとうございます。

>別のスレッドの p (やそれが指す先の配列) にアクセスすれば競合が起こることは有りうるが、そうじゃないんだよね?

それはないです。
0063デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 01:21:34.27ID:WzrD1lk70
>>61
明確です。
newで確保される領域はダイナミックストレージに属します。
これは他のスレッドと同時に読み書きを行えば競合します。

thread_localで確保されたint* pはスレッドストレージに属します。
これは複数のスレッドで別のページに属します。
従って、pに対して読み書きしている分には競合しません。
0064デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/10(日) 01:24:48.36ID:CUftH0/Q0
>>58
> 低レイヤを低レイヤのままで扱うスタイルを是とするものではない。
そう。で、俺は、低位はDLLで切り出しても大して問題なく、
高位だけなら他言語を使った方が効率的、という見方。

> その上のレイヤに持ち上げるときには必ずスマートポインタを使えってくらいの主張なら真っ当だと思う。
ちなみにそもそも俺はスマポ自体に懐疑的で、

・スマポじゃないとやってられないのはシャローコピーを永続化させるときくらいで、
 C++でこの使い方をすることはほぼない。
 (部分的シャローコピーでオブジェクト毎の生存期間に差が出て、
 さらにそれがデータ依存しており、プログラム側で確定させるのが面倒なとき。
 (半分満たす)例:このスレのレス配列があったとして、
 特定のIDのみ、ポップアップ用にシャローコピーで抜き出す場合。
 ただしこの場合はポップアップ後も次のポップアップ用に全体配列を保持する為、
 シャローコピーの永続化はせず、寿命管理は全体配列単位となり、スマポじゃなくても苦労しない。
 というより、正直、該当ケースを思いつけない)

なんだな。
要は、オブジェクトの生存期間をコード上で静的に確定させられないときにはスマポは強力だが、
俺には該当ケースがないんだな。
というか、お前ら何に使ってるんだ?
面倒なだけなら、GC言語の方が楽だしいいと思うんだが。
0065デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 01:30:29.54ID:WzrD1lk70
で結局ユニポでいいんだよな?
0079デフォルトの名無しさん (ブーイモ MM05-dEMp)
垢版 |
2018/06/10(日) 13:26:42.87ID:SJAMvsgqM
>>71
生存期間がシンプルすぎるからunique_ptrが入らないっていうのは賛同できないわー。
将来デストラクタが複雑になって誰かがdeleteする経路をすっ飛ばしてreturnしてしまうかもしれんし、使えるところは使っておけばいいじゃない。
何を気にしてunique_ptrさけてるの?
0080デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/10(日) 13:28:20.49ID:CUftH0/Q0
>>70
それで何が嬉しいんだ?

ついでに質問しておこう。
君はCのような自前でリソース管理をしなければならない言語でリソース管理をしたことがあるか?


あと、これはC++er全般に対してだが、
shared_ptrが絶対に必要なケースってのは何だ?
unique_ptrで後述A,B以外の使い方Dがあるか?(なおCは予約語)
0081デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/10(日) 13:29:15.80ID:CUftH0/Q0
Cでのリソース管理戦略は非常に単純で、おそらく以下の2つしかない。

A. 作成者が責任を持って破棄する。
B. 投げ捨て。基本的に所有権を渡し、末端(付近)で破棄する。

Aが基本パターンになる。
Bは例えば描画用の一時データ等の場合で、
この場合、使用するのは「描画ルーチン『だけ』」であり、それ以降は不要だと自明だから、
・「描画ルーチン」までの途中経路での使用は原則禁止
 (厳密には、「描画ルーチン」呼び出し以降の使用は禁止で、
 呼び出し以前は改変等を加えてもいい=この例なら、描画スケールの改変等)
・「描画ルーチン」内で必ず破棄
となる。
ただしあまり気にしないのならBも使わず、Aだけで組んでも問題ない。(というか多分そっちが主流か?)
描画の例であれば、描画終了後は普通はかなり速やかに親関数まで帰ってくるので、
親関数側でfreeするA方式でも大差ないからだ。

対して、OOP的に実装した場合、例えばゲームの敵キャラの生成/消滅を管理するとして、
この場合は「描画ルーチン」のように
「静的に明示的に生成/消滅の両方を内包する親関数」が規定出来ないので、
A方式は事実上使えず、Bで対応するしかない。だから上記を書き直せば、以下となる。

A. 「作成/使用の両方を静的に管理下に持つ親関数」を規定出来る場合、(=構造化プログラミング)
 その親関数内で確保し、親関数のスコープ終了と共に破棄する。
B. 上記親関数を規定出来ず、「作成」「使用」場所が明示的な場合、(=OOP)
 「作成」後は基本的に所有権を譲渡し、「使用」後に破棄する。
0082デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/10(日) 13:29:42.93ID:CUftH0/Q0
既に言ったように、Cの戦略は多分この2つだ。というか、正確に言うと、これ以外での管理は無理だ。
そしてこれはC++では以下のようになる。

A. 自動変数上のunique_ptrに確保、関数呼び出しでは所有権の移転はしない
 =生成場所のスコープ終了と共に破棄、それ以外の破棄はない
B. unique_ptrに確保し、自関数を抜ける前に『必ず』誰かに所有権を移転する
 自関数が対象関数(上記例なら描画関数)であれば、移転相手がいないので破棄する

だからはっきり言えば、Cのナマポは事実上C++のunique_ptrの使い方しか出来ないし、してない。
C++erがスマポ(キリッなのは、上記C流のリソース管理を知らない=無知だからでしかない。
繰り返すが、Cは最初からunique_ptrしかないのと等しい。
ここがC->C++の連中と、C++しか知らない馬鹿との違いだ。

これに対して、shared_ptrは上記制限を解除するものだ。
だからshared_ptrを使えば新しいプログラミングパラダイムを発見出来る可能性はある。
これは何だ?
俺にはこれがイマイチ思いつかない。

いわゆる構造化プログラミングで、関数を入れ子で呼んでいく場合、必ずAは適用可能だ。
これがCが今までのさばっている理由でもある。
OOP的に組む場合はBが基本戦略となり、必ず誰かが明示的に「生成」し、
同様に、必ず誰かが明示的に「破棄」するので、これまた問題ない。

だから今のところCで間に合っているのも事実だ。
リソース管理が「面倒だ」というのは分かるとしても、
「難しい」というのは根本的に組み方を間違っているからだ。
GC言語しか知らない馬鹿共が知らないのは当たり前だとしても。

shared_ptr等が必要なプログラミングパラダイムが発見され、
それに対応する方法がなければ、お前らの望み通り、Cも死ぬしかない。何かないのか?
或いは上記A,B以外のunique_ptrの使い方Dがあるか?(なおCは予約語)
0083デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 13:30:26.90ID:WzrD1lk70
例外安全性の確保でウッカリさんするくらいなら使った方が良い。
0086デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/10(日) 13:35:21.57ID:CUftH0/Q0
>>68,79
そもそもpimpl自体が要らんだろ。
あれはC++のコンパイラが単純に仕様変更

・ヘッダにはprivate関数は書く必要がありません

すればいいだけの話で、そもそも「名前空間は開いていますが、クラスは閉じています(キリッ」を、
「ヘッダのクラスは開いていますが、実装のクラスは閉じています(キリッ」にすればいいだけ。

編集上の都合でソースが汚れるとか、全く馬鹿な話だろ。
気づけよ。
0089デフォルトの名無しさん (ワッチョイ 13bd-T1fc)
垢版 |
2018/06/10(日) 13:37:46.22ID:pLs6h5jj0
pimplに近いテクニックとしてC言語の頃から絶縁テクニックというものがあるが
それをやると大概静的解析ツールが横暴な量の警告メッセージを吐いてきやがるので却下
pimplも多分同じ結果に…
0090デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 13:39:41.44ID:WzrD1lk70
Javascriptを使って感じるC++の有利な点は仕様の明確さだろう。
Javaは重いと言われユーザーに嫌われる言語のひとつだが、開発者はベンチマークを提示しC++の20倍速いと言う。
しかしユーザーは実際に重くて困っているだろう。
ブラウザも同じ問題を抱えていて、当然Javascriptも重いとユーザーは感じている。
0091デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 13:45:01.51ID:WzrD1lk70
Microsoft社はソフトウェアの使用状況を監視させてほしいとユーザーにお願いする。
IMEの誤変換データや、プログラムのクラッシュ時の情報などだ。
これらは、開発者とユーザーの間の意識の乖離を埋める可能性がある。
ユーザーの重いと開発者の軽いのような。
オープンソースに対するアドバンテージがここにあるのかもしれない。
0094デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 13:49:25.02ID:WzrD1lk70
Visual StudioはCMakeに対応したし、Microsoft社はオープンソースとの付き合い方をやっと学んだようだ。
0096デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 13:54:17.23ID:WzrD1lk70
pimplを多用するライブラリの一つにQtがある。
C++はテンプレートによって拡張性を担保できる言語だ。
一方、拡張性はライブラリのユーザーにとってわかりやすさを損なう。
IDEとの結合において、pimplによる公開は一つのテクニックかもしれない。
0097デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 13:55:31.45ID:WzrD1lk70
ところでpimplってぽいんぷるって読むんだよな?
0099デフォルトの名無しさん (ワッチョイ d17f-LHz9)
垢版 |
2018/06/10(日) 14:01:14.71ID:O8pZIlTr0
RAIIは?
0100デフォルトの名無しさん (ブーイモ MM05-dEMp)
垢版 |
2018/06/10(日) 14:03:24.78ID:SJAMvsgqM
>>82
cで参照カウント使ってる例なんていくらでもあると思うけど。例えばキャッシュとか。
参照カウントを自前で書けばいいからshared_ptrはいらないって言ってるわけではないよね?
0101デフォルトの名無しさん (ワッチョイ 13bd-T1fc)
垢版 |
2018/06/10(日) 14:25:32.87ID:pLs6h5jj0
キャッシュは不意のアクセスに備える目的のやつだから
今誰もアクセスすなくなったからといって即開放(例: キャッシュラインをinvalidate)したら意味半減くね…?
というわけで、参照カウントの使用例としては不適切くね…??

それはそうとして、
資源の開放タイミングをスマポに頼るのは負けというC言語スキー氏には概ね同意だが
プログラマーが後始末タイミングをどうしても決められないシチュは存在するからスマポは要る
GCのように、開放タイミングを決めるのが未来のプログラマーなケースがそれ
0102デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/10(日) 14:32:47.18ID:CUftH0/Q0
>>95
いい突っ込みだ。
今の実装だと、最低限プライベートの全サイズは要るのか。
Javaとかどうしてんだろうな?

現実的な解としては、
privateフィールドについてはコンパイラが自動的にpimpl的に間接参照に切り替えだな。
どうせpimplにする気だったのなら速度的にも大差ない。

いずれにしても、今の時代、コンパイラに合わせてコードを書くのは間違いで、
人間に合わせてコンパイラが努力するのが正しい。
0103はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)
垢版 |
2018/06/10(日) 14:34:08.96ID:NuBmj+pR0
>>80
ワイはオッサンやで。 C++98 が出来る前から C も C++ も使ってるというか、
マイコンで BASIC とアセンブラが主流だった時代の人だで。

そのときは何にも疑問に思わなかったけど、
今どきのモダンな仕組みを知ってしまったら、
昔の牧歌的なリソース管理なんて本当にしたくねぇという気持ちなんだよ。
(かといって使い慣れたパラダイムから離れるのも面倒くさい。 オッサンなので。)

>>81-82
そこで unique_ptr を使うことに疑問を持つことが意味わからんのだが。
まさにそういう風に使うためのもんだし、
その例で unique_ptr への懐疑を説明されてももう俺には何にも言えねぇ。
0105デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/10(日) 14:45:42.60ID:CUftH0/Q0
>>100
> 参照カウントを自前で書けばいいからshared_ptrはいらないって言ってるわけではないよね?
そういうわけではない。
ただ、参照カウントを自前で書いても大して苦労しないのも事実だが。


> 例えばキャッシュとか。
これはいい例に見えるが、実はちょっと違う。

まず、これは「生存期間にデータ依存性がある為、上位関数からではde.lete出来ない」例ではある。
ただ、実際にキャッシュを実装すると、

1. non_sharedのキャッシュの場合、要するにLRU判定で捨てるときにそのままdeleteすれば良いだけ。
2. shared_cacheの場合、例えばCPUのキャッシュのエミュレーションを行う場合、
 書き込みで他CPUのキャッシュを無効化するとか、その手の上位側の制御が必ず必要で、
shared_ptrだけでサクッと実装、ってことにはならない。

だから、Cで実装してもC++のスマポで実装しても、実は手間があまり変わらない。
それではおいしくないんだよ。
勿論、「書き込み無し」とかだと、破棄の制御をしなくていい分C++の方が楽に実装出来るが。
つまるところ、shared_ptrは、
手抜きデタラメ実装する場合は凄く便利だが、ガチで実装する場合にはあまり恩恵がないんだ。
とりあえず、キャッシュの場合はそう。

ってのが>>101の意見でもあると思うが。
0106デフォルトの名無しさん (ワッチョイ 13bd-T1fc)
垢版 |
2018/06/10(日) 14:47:27.38ID:pLs6h5jj0
>>104
キャッシュは、存在すればアクセスのレイテンシーが短縮されるというラッキーをクライアントに提供するだけのしくみ
よって、キャッシュ上のデータというのは基本いつ消してもシステムにとって致命傷にはならず、
かつ可能な限りキャッシュ上に残存するように普通は設計する
参照カウンタが0より大きいからキャッシュ上のデータを消してはいけないという法は無い

一方、仮に>>104で言いたいのがアクセスしている最中に消したらアカン、という話なのであれば、
それは排他制御の話題であってそれも参照カウントとは関係無く言える話やし…
0107デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/10(日) 14:48:15.03ID:CUftH0/Q0
>>101
スマポは未来のプログラマーが解放することを「文法的に」示す意味しかない。

例えば、mallocも同様だが、
当然ナマポが返ってきて、それを解放するのは未来のプログラマー責任になっている。
要するに「そういう使い方」を規定すれば済むだけなんだよ。
0108デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 14:56:39.55ID:WzrD1lk70
unique_ptrが必要ないというのは、C++を使ったことがないってことだから、C++を使ってる人に対して、unique_ptrを使うべきでないと意見しても意味がない。
必要だから使ってるんだし。
0109デフォルトの名無しさん (ワッチョイ d19f-NuDx)
垢版 |
2018/06/10(日) 15:01:32.09ID:CUftH0/Q0
>>103
俺はunique_ptrは「C的リソース管理を文法的に示す」意味しかないと見てる。

反対する意味もないが、積極的に使う意味もない。
元々そうとしか組めないし、既にコードはそうなってるから。
だからunique_ptrに書き換えろってのは、相当にウザイ。
他言語だとforeachをforに書き換えろとか、あれと同じじゃないかな。

たぶんLinusもこれなんだよ。
C++の奴は新しい文法でやることに意義を感じているようだが、
それによってソースコードの構造が改善されるかというと、全くそうじゃない。
むしろ、おかしくなることの方が多いわけでね。pimplとかもそうでしょ。

> 昔の牧歌的なリソース管理なんて本当にしたくねぇという気持ちなんだよ。
これがよく分からん。
というか俺はリソース管理したくないから当然のごとくGC言語を使っているわけで、
そこまでしてC++に拘る理由が分からん。
スマポ使えというなら、うるせえGC言語使え、と返したい。
0110デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 15:08:27.48ID:WzrD1lk70
Cより開発効率が高く、Javaよりユーザーにベネフィットを提供できる。
そういった観点から、広く使われるソフトウェアの開発にC++を採用するのは理にかなっている。
JavaにしろC#にしろ、GUIライブラリがころころ変わるのは、エンドユーザーが受け入れないからだろう。
そう、馬鹿なユーザーはJavaやC#の利点を気にかけないのだ、自分のことしか考えない利己主義め!
なぜ重いソフトウェアを使うべきなのか、ユーザーをキチンと教育する必要がある。
あるいはC++を選ぶ。
0111デフォルトの名無しさん (ワッチョイ 13bd-T1fc)
垢版 |
2018/06/10(日) 15:19:42.39ID:pLs6h5jj0
>>107
>スマポは未来のプログラマーが解放することを「文法的に」示す意味しかない。
スマポでできて、free()ではできないことがあるからその言い分は違うくね?
いやまあ>>101でGCとしか言わなかったのは言葉足らずだったので今条件を追加するが、
こちらが実装上の都合で用意するオブジェクトの数と、未来のプログラマーに対して見せかけるオブジェクトの数が相違するケースでは
どうしてもスマポ的な手段に訴える(オブジェクト自身に開放タイミングを決めさせる)必要があるんじゃー!

例えば画像データみたいに巨大故に必要無い限りコピーしたくないんだけどそんな事情をライブラリ利用者から隠蔽したいケース
あるいは、やっぱGC自体が行う本来のガベージコレクション業務タイミングを決める方法とか、
(GCがシステムに1個しか無いのに対して、ユーザーは潜在的に多数でありGCの存在を関知せずに使ってくれる

一方、「必ずfree()せよ」という仕様には、malloc()したヒープ1個の開放以上の意味を持たせられない
0112デフォルトの名無しさん (ワッチョイ 81b3-8neN)
垢版 |
2018/06/10(日) 15:24:27.83ID:WzrD1lk70
std::unique_ptrを使用したくない局面では、テンプレート仮引数Allocatorを用意するべきである。
つまり、ほとんどの場合、std::unique_ptrが有用である。
■ このスレッドは過去ログ倉庫に格納されています

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