C++相談室 part136

次スレを立てる時は本文の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

2はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/08(金) 00:54:25.36ID:ynCi559O0
2get

STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

---- テンプレ ここまで ----

4デフォルトの名無しさん2018/06/08(金) 02:27:58.00
C++解ると豪語していた人が後日茂みで戉だらけの死体で発見される例が後を絶ちません
C++解るは何か宗教的禁忌の呪詛なのだと思います

青い鳥に「C++を完全に理解した」と語りかけると
もれなく狂人が群がってきて引き裂かれます

構文、ライブラリ、パラダイム毎のテクニック、イディオムの一部を覚えて解った気になるなはどの言語でも同じね

>>3
このテンプレ貼り付けるの面白いんか

C++を完全に理解するには40年の下積みが必要

C++77をやっと理解しました

10デフォルトの名無しさん (バッミングク MMb5-uWQQ)2018/06/09(土) 15:22:59.44ID:Ee9G7X6vM
c++11とか14とか17って何ですか?

11デフォルトの名無しさん (ワッチョイ 1334-KXLn)2018/06/09(土) 15:30:37.98ID:VwmpqUVo0
ggrks

12デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/09(土) 16:23:33.39ID:HrZn4m/i0
C++完全に理解したわ。

13 ◆QZaw55cn4c (ワッチョイ d360-EqDK)2018/06/09(土) 16:34:50.30ID:BV3WmSRm0
>>12
おお凄いですね!
初学者が手をつけるといい分野を教えてください

14デフォルトの名無しさん (ワッチョイ f3e9-Cil2)2018/06/09(土) 17:23:15.68ID:mgwk6Vqj0
C++完全理解ってすげー
入門本ですら辞書の様に分厚いのに

15デフォルトの名無しさん (ワッチョイ 9381-LHz9)2018/06/09(土) 17:26:24.12ID:ei3u8diB0
覇王になれます

16デフォルトの名無しさん (ワッチョイ 6b13-LHz9)2018/06/09(土) 17:43:50.55ID:nw+86khE0
コンパイラの中の人や
規格票の中の人なんかね

17デフォルトの名無しさん (ワッチョイ 1334-KXLn)2018/06/09(土) 17:49:33.99ID:VwmpqUVo0
C++界のラオウ

18デフォルトの名無しさん2018/06/09(土) 18:49:15.24
>>12の家に江添が向かうぞー!

19デフォルトの名無しさん (ワッチョイ a98a-Duqg)2018/06/09(土) 18:51:01.10ID:P8wz6R/X0
12による攻略本を待てば良いのか?

20デフォルトの名無しさん (ワッチョイ 13d2-MIhW)2018/06/09(土) 19:33:13.71ID:O5NYHXm/0
最近は規格を完全に満たしたコンパイラって存在するの?

21デフォルトの名無しさん (ワッチョイ a9f2-LHz9)2018/06/09(土) 19:46:23.57ID:ar7EC0zB0
C++11は結構「満を持して」って感じだったけど、その後14だ17だとアップデートサイクルが
短くなるならCfrontに回帰してもらった方がハッピーな気がしてきた。
今のC++で技術的にどのくらいしんどいのかはわからないけど、TypeScriptやBabelなんかの
JS界隈でうまくいってるエコシステムがうらやましい。

22デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/09(土) 19:59:17.07ID:MhKfyDgC0
>>21
> JS界隈でうまくいってるエコシステムがうらやましい。
それはお前がJSを知らず、隣の芝が青く見えるだけ。
あれは完全に屋上架屋で糞だ。C++のノリで動くと思ったら大間違い。

23デフォルトの名無しさん (ワッチョイ 9b7f-abwI)2018/06/09(土) 20:08:13.77ID:4etfJVE40
ラムダとか型推論とか
やわらか言語のお遊びだと思ってたのにいまじゃこの有り様だよ

24デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/09(土) 20:09:30.83ID:HrZn4m/i0
コンパイラを駆動するためのプログラミングと、実行可能形式を駆動するためのプログラミングを一度にできる、一粒で二度おいしい言語がC++である。
つまり、ビールとワインを混ぜたらとてもまずかったというお話。

25デフォルトの名無しさん (ワッチョイ a9f2-LHz9)2018/06/09(土) 20:11:55.73ID:ar7EC0zB0
>>22

TypeScriptもBabelも普通に使ってるけど?
それがうまくいってるのを見てるからこそC++もそうできたらいいと思ったんだが。
まぁ、コンパイルに時間がかかるのとデバッグがちょっと隔靴掻痒気味ってのはある。

26デフォルトの名無しさん (ワッチョイ 6b13-LHz9)2018/06/09(土) 20:19:03.73ID:nw+86khE0
>>21
つーかC++11って、みんなもう待ちくたびれて
C++0xという期限も守れなくて、
一部でC++オワコン?とか言い出してる雰囲気の中、
ああ、やっぱりあるのかという復活祭的なもんだったろ

27デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/09(土) 20:19:57.28ID:MhKfyDgC0
>>25
C++にそれらがないのは、C++にはそれらが必要とされてないからだよ。
要するに全てはJavaScriptが糞すぎるから始まったことでしかない。
それがいいと思うのも自由だが。

28デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/09(土) 20:22:20.01ID:HrZn4m/i0
>>27
何を言うか!
Javascriptが最強の完成された言語だからこそ、Typescriptが誕生できたんじゃないか!!!

29デフォルトの名無しさん (ワッチョイ a98a-Duqg)2018/06/09(土) 20:23:02.20ID:P8wz6R/X0
金箔貼っても糞は糞

30デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/09(土) 20:25:24.52ID:HrZn4m/i0
C++がこっち方向→に糞だとすると、Javascriptは←あっち方向に糞。

31デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/09(土) 20:25:28.19ID:MhKfyDgC0
>>25
要するに、自分が慣れている環境を持ち込みたいだけだろ。
ならJavaScript流に言えば、お前が作れ、でしかないだろ。
ご自由にOSSにすればいい。誰も使わないと思うけど。

32デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/09(土) 20:29:08.98ID:HrZn4m/i0
歯糞耳糞を笑うというが、本物のウンコには誰も勝てなかったというお話。

33デフォルトの名無しさん (ワッチョイ a9f2-LHz9)2018/06/09(土) 20:34:01.02ID:ar7EC0zB0
>>26
結構印象が違うもんだね。
C++03が失敗気味でオワコン視された雰囲気はわかるけど、だからこそ次は失敗できない
C++11はそれなりの完成度になったと思うんだが。逆に14や17は蛇足気味のような。

34デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/09(土) 20:34:26.33ID:HrZn4m/i0
しかしJavascriptとC++を完全に理解した俺が最強ってことだろうな。

35デフォルトの名無しさん2018/06/09(土) 20:49:52.86
同じ糞なら書かなきゃソンソン

36 ◆QZaw55cn4c (ワッチョイ d360-EqDK)2018/06/09(土) 20:54:24.20ID:BV3WmSRm0
>>33
>C++03が失敗気味でオワコン
え…それは本当ですか?
C++03 で生きていこうと思っていたんですが…

37デフォルトの名無しさん (ワッチョイ 6b13-LHz9)2018/06/09(土) 21:28:50.56ID:nw+86khE0
>>33
いや14は重要なバグ直しでautoが安心して使えるようになったし
17はfilesystemやstring_viewにexecution(これすげー)が入って名実共にメジャー
やっぱC++03からの沈黙が異常すぎたんだよ

38はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/09(土) 21:39:20.39ID:EdmRUNh70
>>36
常に最新を使えとまでは思わんが、さすがに C++11 は人権だと思うぞ。

C++14 や C++17 はユーザ視点では重要なものも含まれるとは思うが、
C++11 に間に合わなかったりミスがあったりしたのを補った、
マイナーアップデートという印象は有るな。

39 ◆QZaw55cn4c (ワッチョイ d360-EqDK)2018/06/09(土) 21:48:34.35ID:BV3WmSRm0
>>38
スマートポインタの恩恵は享受しようと思いますが、右辺値参照はよく理解できません…

40デフォルトの名無しさん (ワッチョイ 6b13-LHz9)2018/06/09(土) 21:51:27.43ID:nw+86khE0
>>39
テンポラリ=constと短絡されていたが
実はそうではなかった
禿すらも気付くのが遅れた
それが&&

41デフォルトの名無しさん (ワッチョイ 6b13-LHz9)2018/06/09(土) 21:52:38.94ID:nw+86khE0
キーワードclassは結局いらなかった
newは忌み子だった

禿がどういう方面で過ちを犯したか
何となく察することができるだろう

42デフォルトの名無しさん (ワッチョイ 09c3-5Ttc)2018/06/09(土) 22:02:43.49ID:v0cqkdT30
newで帰ってくるのがunique_ptrにならねえかなあ

43はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/09(土) 22:05:12.82ID:EdmRUNh70
>>39
えっ、それって重要な機能のひとつじゃね?

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

最低でも

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

あたりは無いとつらすぎるんですけど!

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

>>43
ちなみに他言語を使わない理由は何だ?
おそらく君はインラインアセンブラとか全く使わない人だろ?

45デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/09(土) 22:26:37.24ID:HrZn4m/i0
C++17はDoxygenを凄いことにする。
ひどい奴だ。

46デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/09(土) 22:30:21.93ID:HrZn4m/i0
std::unique_ptrはユニポと読むんだよな?

47はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/09(土) 22:31:54.21ID:EdmRUNh70
>>44
> ちなみに他言語を使わない理由は何だ?

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

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

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

どういう意図で言ってんのかよくわかんないんだけど、
C++11 以降に加わった機能がスゲー大事という気持ちとこれらが何か関係あるの?

48デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/09(土) 22:44:45.79ID:HrZn4m/i0
人は皆生まれながらにC++が好きだけど、その気持ちに気づくかどうかに違いが出るんだよね。

49デフォルトの名無しさん2018/06/09(土) 22:49:33.71
がしゃーん
     がしゃーん

   △ ¥ ▲
  ( C ++ C )
  (      )
 /│  肉  │\
<  \___/  >
    ┃  ┃
   =  =
C++17だよ
自動で Doxygenを凄いことにしてくれる
ひどいやつだよ

50デフォルトの名無しさん (ワッチョイ 13eb-EKWA)2018/06/09(土) 22:50:39.46ID:5LGGM5BC0
よく知らないのだけど、いったいC++17でDoxygenに何が起こるんだ・・・

51デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/09(土) 23:00:19.02ID:MhKfyDgC0
>>47
俺はC++を使う利点は

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

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

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

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

そして最近の新機能は高位向けの物が多いから、聞いてみたわけだ。
Schemeは知らんが、他高位言語を使っているのなら済まんかった。

52はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/09(土) 23:16:26.11ID:EdmRUNh70
>>51
高から低をカバーしてるのが良いというのは私もまったく同意見だよ。
だから、高から低をカバーと言っておきながら、高水準の部分は他言語に任せた方がいいというのはなんか矛盾してないか?

俺は「(現代の水準では) 足りてないからもっと (少なくとも C++11 で追加された分くらいは) 欲しいよな」って気持ちなわけ。

53デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/09(土) 23:38:56.87ID:MhKfyDgC0
>>52
矛盾してない。

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

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

例えば、C#がその作りになってるでしょ。
マーシャルがウザイか、C++の機能的周回遅れがウザイかってだけ。
勿論、インラインアセンブラを使いたいならC++しか解がない。
で、ナマポ禁止派はいったい何がしたいんだ?ってのが疑問で、
それだったら俺と同じでC#+CのDLLで良いじゃん、と思うわけ。

54デフォルトの名無しさん (ワッチョイ 13eb-EKWA)2018/06/10(日) 00:22:20.01ID:qtmE4clR0
C#やってるとテンプレート欲しくなるじゃん

55デフォルトの名無しさん (ワッチョイ 09c3-5Ttc)2018/06/10(日) 00:27:04.31ID:k6CFzDb+0
ナマポが本当に必要な所では存分に使えばいいと思うよ
ただし普通は99.9%くらいはそうじゃないからスマポを使え

56デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 00:35:42.54ID:CUftH0/Q0
99.9%がスマポなら、最初からスマポがデフォの言語を使った方が捗るでしょ。
Rustでもいいし、C#やJava等のGC言語でもいいし、PythonやRubyのようなスクリプト言語でもいい。
残り0.1%をマーシャルなりしてCのDLLで。

57デフォルトの名無しさん (ワッチョイ 135e-JdDl)2018/06/10(日) 00:42:34.12ID:z8yivKF60
話をぶった切ってすんません。

複数のスレッドで

thread_local int* p;

p=new int [1000];

で確保したヒープ領域はやっぱりスレッドセーフ、じゃない、データ競合が
おきるんですか?

58はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/10(日) 00:59:52.96ID:NuBmj+pR0
>>53
まー、生ポインタは一箇所たりとも許さんってほどの原理主義は過激だとは思うよ。
俺も生ポインタを使わないことはないし、 goto を使うことだってあるし。

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

C++ なんてそもそもがクソなんだから、
解決のために追加された機能は積極的に使わないとやっとれんわ。
(でも好き。)

59デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 01:03:04.42ID:WzrD1lk70
>>57
起きないです。

60はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/10(日) 01:06:27.33ID:NuBmj+pR0
>>57
thread_local で宣言した変数は名前が同じだけでスレッドごとに違う存在だし、
それぞれのスレッドで new したならそれぞれのスレッドで配列が確保されてる。

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

61デフォルトの名無しさん (ワッチョイ 135e-JdDl)2018/06/10(日) 01:11:48.03ID:z8yivKF60
>>59

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

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

データ競合がおきたら修羅場ですw

62デフォルトの名無しさん (ワッチョイ 135e-JdDl)2018/06/10(日) 01:14:17.08ID:z8yivKF60
>>60

ありがとうございます。

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

それはないです。

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

thread_localで確保されたint* pはスレッドストレージに属します。
これは複数のスレッドで別のページに属します。
従って、pに対して読み書きしている分には競合しません。

64デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 01:24:48.36ID:CUftH0/Q0
>>58
> 低レイヤを低レイヤのままで扱うスタイルを是とするものではない。
そう。で、俺は、低位はDLLで切り出しても大して問題なく、
高位だけなら他言語を使った方が効率的、という見方。

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

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

なんだな。
要は、オブジェクトの生存期間をコード上で静的に確定させられないときにはスマポは強力だが、
俺には該当ケースがないんだな。
というか、お前ら何に使ってるんだ?
面倒なだけなら、GC言語の方が楽だしいいと思うんだが。

65デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 01:30:29.54ID:WzrD1lk70
で結局ユニポでいいんだよな?

66デフォルトの名無しさん (ワッチョイ f3e9-Cil2)2018/06/10(日) 02:24:33.75ID:ojvu+L980
俺には分からない日本語をみんなが喋ってる

67デフォルトの名無しさん (ワッチョイ 1334-KXLn)2018/06/10(日) 02:32:04.25ID:1CRpQpm20
そんな柔な理解力ではこのC++の壁に傷一つ残すことはできんわ!

68デフォルトの名無しさん (ワッチョイ 09c3-5Ttc)2018/06/10(日) 06:46:40.00ID:k6CFzDb+0
>>64
スマポ=シャローコピーって意味わからん
unique_ptrを使わずにナマポでpimplとか今となっては考えられんのだが

69デフォルトの名無しさん (ワッチョイ 13b3-Chll)2018/06/10(日) 08:41:18.45ID:RI4Vnlqm0
>>50
DoxygenがC++17の新構文に対応してないだけでしょ
まだ仕様が確定してないから対応してないよってどっかに書いてあったような気がする

70はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/10(日) 08:52:18.24ID:NuBmj+pR0
>>64
所有権を移転*しない*ということを表現できるのもスマートポインタの使い方のひとつだよ。

71デフォルトの名無しさん (ワイモマー MM33-ZWpy)2018/06/10(日) 10:19:31.72ID:7gXDIq7mM
>>68
はぁ???
pimplてあんなもん生存期間がシンプルすぎて
スマートポインタなんか要らない例だろキチガイかお前

72デフォルトの名無しさん (ワッチョイ 3139-LHz9)2018/06/10(日) 11:21:03.09ID:E4gfPCgl0
ナマポでもpimplはできるが
毎度毎度わかりきったコードを書く
無駄な手間がちょっとイヤ

73デフォルトの名無しさん (ワッチョイ a9f2-LHz9)2018/06/10(日) 11:29:19.92ID:Ce6PWnpg0
pimplに限らないが、メンバーにunique_ptrを使ったときの空のデストラクタが悲しい。

74デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 12:03:34.83ID:pLs6h5jj0
JSはES6でスゲー良くなった希ガス
もはやC++やPerlみたいな工業用言語として十分逝ける

75デフォルトの名無しさん (ワッチョイ a98a-Duqg)2018/06/10(日) 12:11:11.02ID:wNo6w9bX0

76デフォルトの名無しさん (ワッチョイ 1312-NuDx)2018/06/10(日) 12:43:11.84ID:ZJMDp7uo0
URLから連想出来る署名は
IQ110のJS先輩と学ぶ関数型プログラミング14日間

工業用言語でperl w

78デフォルトの名無しさん (ワッチョイ 3139-LHz9)2018/06/10(日) 13:10:58.73ID:E4gfPCgl0
何を以て「工業用」と言っているんだろう

79デフォルトの名無しさん (ブーイモ MM05-dEMp)2018/06/10(日) 13:26:42.87ID:SJAMvsgqM
>>71
生存期間がシンプルすぎるからunique_ptrが入らないっていうのは賛同できないわー。
将来デストラクタが複雑になって誰かがdeleteする経路をすっ飛ばしてreturnしてしまうかもしれんし、使えるところは使っておけばいいじゃない。
何を気にしてunique_ptrさけてるの?

80デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 13:28:20.49ID:CUftH0/Q0
>>70
それで何が嬉しいんだ?

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


あと、これはC++er全般に対してだが、
shared_ptrが絶対に必要なケースってのは何だ?
unique_ptrで後述A,B以外の使い方Dがあるか?(なおCは予約語)

81デフォルトの名無しさん (ワッチョイ 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)
 「作成」後は基本的に所有権を譲渡し、「使用」後に破棄する。

82デフォルトの名無しさん (ワッチョイ 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は予約語)

83デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 13:30:26.90ID:WzrD1lk70
例外安全性の確保でウッカリさんするくらいなら使った方が良い。

84デフォルトの名無しさん (ワッチョイ 3139-LHz9)2018/06/10(日) 13:33:28.96ID:E4gfPCgl0
>>79
誰かがdeleteする経路をすっ飛ばしてreturnってどゆこと?
スタック巻戻しを破綻させるものってstd::exitくらいじゃね

85デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 13:34:40.25ID:pLs6h5jj0
>>80
>それで何が嬉しいんだ?
お前さんが大好きなC言語の関数にポインタを渡す場合

86デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 13:35:21.57ID:CUftH0/Q0
>>68,79
そもそもpimpl自体が要らんだろ。
あれはC++のコンパイラが単純に仕様変更

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

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

編集上の都合でソースが汚れるとか、全く馬鹿な話だろ。
気づけよ。

87デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 13:35:48.50ID:pLs6h5jj0
>>84
コンストラクタ内で例外発生とか

88a (ワッチョイ f36d-ExzQ)2018/06/10(日) 13:37:37.76ID:fJuBgtP70

89デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 13:37:46.22ID:pLs6h5jj0
pimplに近いテクニックとしてC言語の頃から絶縁テクニックというものがあるが
それをやると大概静的解析ツールが横暴な量の警告メッセージを吐いてきやがるので却下
pimplも多分同じ結果に…

90デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 13:39:41.44ID:WzrD1lk70
Javascriptを使って感じるC++の有利な点は仕様の明確さだろう。
Javaは重いと言われユーザーに嫌われる言語のひとつだが、開発者はベンチマークを提示しC++の20倍速いと言う。
しかしユーザーは実際に重くて困っているだろう。
ブラウザも同じ問題を抱えていて、当然Javascriptも重いとユーザーは感じている。

91デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 13:45:01.51ID:WzrD1lk70
Microsoft社はソフトウェアの使用状況を監視させてほしいとユーザーにお願いする。
IMEの誤変換データや、プログラムのクラッシュ時の情報などだ。
これらは、開発者とユーザーの間の意識の乖離を埋める可能性がある。
ユーザーの重いと開発者の軽いのような。
オープンソースに対するアドバンテージがここにあるのかもしれない。

92デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 13:45:20.24ID:pLs6h5jj0
>>90
慣れたらJQueryなど使わずとも複数プラットフォーム対応逝ける!

93デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 13:46:17.65ID:pLs6h5jj0
>>91
Microsoftはつい先日GitHubを買収したから
ソースコード自体を監視に乗り出すようや

94デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 13:49:25.02ID:WzrD1lk70
Visual StudioはCMakeに対応したし、Microsoft社はオープンソースとの付き合い方をやっと学んだようだ。

95デフォルトの名無しさん (ブーイモ MM05-dEMp)2018/06/10(日) 13:54:11.99ID:SJAMvsgqM
>>84
たいしたこといってないです。
~dtor() {
. if (...) {
. return;
. }
. delete ptr;
}

>>86
pmplがバッドノウハウに属するものであることは同意だけどprivateメンバ変数はどうするつもり?

96デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 13:54:17.23ID:WzrD1lk70
pimplを多用するライブラリの一つにQtがある。
C++はテンプレートによって拡張性を担保できる言語だ。
一方、拡張性はライブラリのユーザーにとってわかりやすさを損なう。
IDEとの結合において、pimplによる公開は一つのテクニックかもしれない。

97デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 13:55:31.45ID:WzrD1lk70
ところでpimplってぽいんぷるって読むんだよな?

98デフォルトの名無しさん (ワッチョイ 9b7f-abwI)2018/06/10(日) 13:59:01.60ID:mv7L/paW0
ピーいんぷるって呼んでた

99デフォルトの名無しさん (ワッチョイ d17f-LHz9)2018/06/10(日) 14:01:14.71ID:O8pZIlTr0
RAIIは?

100デフォルトの名無しさん (ブーイモ MM05-dEMp)2018/06/10(日) 14:03:24.78ID:SJAMvsgqM
>>82
cで参照カウント使ってる例なんていくらでもあると思うけど。例えばキャッシュとか。
参照カウントを自前で書けばいいからshared_ptrはいらないって言ってるわけではないよね?

101デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 14:25:32.87ID:pLs6h5jj0
キャッシュは不意のアクセスに備える目的のやつだから
今誰もアクセスすなくなったからといって即開放(例: キャッシュラインをinvalidate)したら意味半減くね…?
というわけで、参照カウントの使用例としては不適切くね…??

それはそうとして、
資源の開放タイミングをスマポに頼るのは負けというC言語スキー氏には概ね同意だが
プログラマーが後始末タイミングをどうしても決められないシチュは存在するからスマポは要る
GCのように、開放タイミングを決めるのが未来のプログラマーなケースがそれ

102デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 14:32:47.18ID:CUftH0/Q0
>>95
いい突っ込みだ。
今の実装だと、最低限プライベートの全サイズは要るのか。
Javaとかどうしてんだろうな?

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

いずれにしても、今の時代、コンパイラに合わせてコードを書くのは間違いで、
人間に合わせてコンパイラが努力するのが正しい。

103はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/10(日) 14:34:08.96ID:NuBmj+pR0
>>80
ワイはオッサンやで。 C++98 が出来る前から C も C++ も使ってるというか、
マイコンで BASIC とアセンブラが主流だった時代の人だで。

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

>>81-82
そこで unique_ptr を使うことに疑問を持つことが意味わからんのだが。
まさにそういう風に使うためのもんだし、
その例で unique_ptr への懐疑を説明されてももう俺には何にも言えねぇ。

104デフォルトの名無しさん (ブーイモ MM05-dEMp)2018/06/10(日) 14:36:19.12ID:SJAMvsgqM
>>101
参照されている間も消していいキャッシュなら参照カウント不要だけれども、そっちのほうが稀じゃね?

105デフォルトの名無しさん (ワッチョイ 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の意見でもあると思うが。

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

一方、仮に>>104で言いたいのがアクセスしている最中に消したらアカン、という話なのであれば、
それは排他制御の話題であってそれも参照カウントとは関係無く言える話やし…

107デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 14:48:15.03ID:CUftH0/Q0
>>101
スマポは未来のプログラマーが解放することを「文法的に」示す意味しかない。

例えば、mallocも同様だが、
当然ナマポが返ってきて、それを解放するのは未来のプログラマー責任になっている。
要するに「そういう使い方」を規定すれば済むだけなんだよ。

108デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 14:56:39.55ID:WzrD1lk70
unique_ptrが必要ないというのは、C++を使ったことがないってことだから、C++を使ってる人に対して、unique_ptrを使うべきでないと意見しても意味がない。
必要だから使ってるんだし。

109デフォルトの名無しさん (ワッチョイ 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言語使え、と返したい。

110デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 15:08:27.48ID:WzrD1lk70
Cより開発効率が高く、Javaよりユーザーにベネフィットを提供できる。
そういった観点から、広く使われるソフトウェアの開発にC++を採用するのは理にかなっている。
JavaにしろC#にしろ、GUIライブラリがころころ変わるのは、エンドユーザーが受け入れないからだろう。
そう、馬鹿なユーザーはJavaやC#の利点を気にかけないのだ、自分のことしか考えない利己主義め!
なぜ重いソフトウェアを使うべきなのか、ユーザーをキチンと教育する必要がある。
あるいはC++を選ぶ。

111デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 15:19:42.39ID:pLs6h5jj0
>>107
>スマポは未来のプログラマーが解放することを「文法的に」示す意味しかない。
スマポでできて、free()ではできないことがあるからその言い分は違うくね?
いやまあ>>101でGCとしか言わなかったのは言葉足らずだったので今条件を追加するが、
こちらが実装上の都合で用意するオブジェクトの数と、未来のプログラマーに対して見せかけるオブジェクトの数が相違するケースでは
どうしてもスマポ的な手段に訴える(オブジェクト自身に開放タイミングを決めさせる)必要があるんじゃー!

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

一方、「必ずfree()せよ」という仕様には、malloc()したヒープ1個の開放以上の意味を持たせられない

112デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 15:24:27.83ID:WzrD1lk70
std::unique_ptrを使用したくない局面では、テンプレート仮引数Allocatorを用意するべきである。
つまり、ほとんどの場合、std::unique_ptrが有用である。

113デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 15:28:05.51ID:CUftH0/Q0
>>111
> 例えば画像データみたいに巨大故に必要無い限りコピーしたくないんだけどそんな事情をライブラリ利用者から隠蔽したいケース
なるほど理解した。
ここでshared_ptrを渡して多数に見せかけ、実は中身は一つ、という話か。

となると、当然インミュータブルでないと話にならないわけだが、
逆に言えば、今時のインミュータブルな世界にはshared_ptrが大活躍する余地があるのか?
すぐにはピンと来ないが。

114デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 15:33:13.30ID:pLs6h5jj0
>>113
△: 当然インミュータブルでないと話にならないわけだが、
○: 当然インミュータブルなインターフェースでないと話にならないわけだが、

実装は別にミュータブルでもクラスで覆うならやりようはいくらでもあるんじゃ…
画像の書き換えを専用メソッドでやるか、あるいは速度優先でcheckout/checkin式にcheckout中だけ直接アクセスを許すとか、
(もちろんcheckout時にコピーを行う

で、内部ではshared_ptr(的な、「オブジェクト自身に開放タイミングを決めさせる」)ロジックが大活躍!!111!!!!1!

115デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 15:33:15.61ID:CUftH0/Q0
>>111
いや待てよ、コピーオンライトなスマポがあればミュータブルな世界にも適用可能だが、
今の所、これはないよな?

いずれにしても適用事例はすぐには思いつかないが。

116デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 15:35:49.57ID:pLs6h5jj0
訂正;
×: あるいは速度優先でcheckout/checkin式にcheckout中だけ直接アクセスを許すとか、
○: あるいは書き換え速度優先でcheckout/checkin式にcheckout中だけ画像への直接アクセスによる書き換えを許すとか、

117デフォルトの名無しさん (ワッチョイ 1334-KXLn)2018/06/10(日) 15:36:25.37ID:1CRpQpm20
C++を解った気になった奴らがアンチパターンを量産する

118デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 16:02:15.14ID:CUftH0/Q0
>>114,116
まあ分かった。
多分shared_ptrは『ほぼ』インミュータブルな世界とは相性がいい。
(ミュータブルにする必要がほぼなく、その場合は明示的に別メソッドを呼んでもいい場合)

つっても適用事例はWebサーバーくらいしか思いつかない。
ある画像が人気でユーザーが一斉にダウンロードしたとして、
鯖内部に30秒間だけキャッシュする場合とか。

ナマポで渡した場合、各ユーザーのダウンロード完了でカウントを減らし、0になるまで破棄出来ない。
shared_ptrで渡した場合、30秒の期限が過ぎればキャッシュから破棄しても問題ない。
この辺は確かに楽に組めるようになる。

119デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 16:07:24.50ID:WzrD1lk70
>>118
キャッシュにstd::shared_ptrを使用するのは愚策すぎるのではないか。
実のところstd::shared_ptrはほとんど出番がない。
設計を練れば練るほど出番は失われていく。

120デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 16:15:05.15ID:pLs6h5jj0
いやすまんインミュータブルなインターフェースといいつつ>>114では画像を書き換えるインターフェースの話をしてしまったスマンorz
「画像の書き換えを専用メソッドでやる」は、「加工後の画像を専用メソッドで生成する」、と読み替えてホスイ

で、ライブラリが画像Aを生成し、その画像がライブラリのユーザーによって不特定多数のクライアントとのセッションスレッドに渡されるシチュを考える
セッションスレッドの具体的な数は事前にはわからない。(接続してくるクライアント次第
また、何らかのタイミングでクライアントに提示すべき画像Aは、別の画像A'に差し変わる。

ライブラリのユーザーとしてはスレッド間の排他制御に関して面倒な問題を抱え込むのは嫌なので、
メインスレッド(セッションスレッドを起こす)から、画像Aのコピーを、所有権を譲渡する形でセッションスレッドに渡す、という使い方をする。・・・(1)

ライブラリ内部では、(1)の使い方をされるときにいちいち画像Aをコピーしたりしない。

画像Aの開放は、画像AがA'に差し変わるタイミングで行いたい。
ただし、画像Aを使っているセッションスレッドが居る間は開放するわけにはいかない。
しかし、当該スレッドがセッションを終えるのを待っていたら、新規につないで来るクライアントへの画像A'の提示が遅れる

→画像Aの開放タイミングはスマポで解決!

121デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 16:27:25.23ID:pLs6h5jj0
>>118
ちょっまだキャッシュ言いますかキャッシュと参照カウントは原理上無関係なので(>>106)忘れてよろしいかと、
(参照カウンタが0より大きいからキャッシュ上のデータを消してはいけないという法は無いし、
 参照カウンタが0になったからといってキャッシュ上のデータを消さなければいけないという法も無い

Webサーバというのは適用事例として好適だがダウンロード中かダウンロード完了か、という区分でしか考えないのはイクナイ
ダウンロード中にも新規のクライアントがつないでくるかもしれない
そのときダウンロード完了時に画像を破棄すればいいやという単色の思考だと、新規のクライアントが繋いで来つづける限り
画像を永久に開放できないことになり、そればかりか>>120のように、画像をAからA'に差し替えることもできない

これは画像Aの開放を、画像Aのオブジェクト自身に面倒をみさせるしかない(自身を参照するセッションスレッドが0になったとき開放させる
サーバはそれとは並行して画像A'を新規のセッションスレッドに展開できる。
こんな芸当ができるのはスマポだけ!

122デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 17:11:42.47ID:CUftH0/Q0
>>121
言いたいことは分かるが、
> 画像をAからA'に差し替えることもできない
これはない。
この場合はどのみちキャッシュを別実装するしかなく、

・キャッシュ内に画像Aへの参照が残っているか
・画像Aを掴んでいるセッションが存在しているか

が別問題になり、
画像の差し替えはキャッシュ内の画像Aを無効化することにより行われる。
だから、普通に差し替えは出来る。このとき、
それ以前のセッションは画像Aのまま、それ以降の新規セッションは画像A'になる。
ただまあ、これは本筋ではないし、内容見る限りそちらも分かっているようだからもういい。


多分、shared_ptrの使いどころは、

1. インミュータブルなインタフェースで、
2. 不特定多数がランダムに掴みに来て、
3. 解放タイミングがユーザー依存で読めない場合

なのだろう。アプリはWeb鯖はそうだが、それ以外に何があるかだな。
1,3はさておき、2がね。
少数しか来ないのならunique_ptrでいいし、
演算等CPUジョブなら結局は順に処理するだけなのでこちらもunique_ptrでいい。
I/O等の他要因で引っかかってスレッドが参照を掴んだまま待機させられることが必要になる。
ファイルサーバーも近いが、こちらの場合はロック機構が必要な為、
「どのファイルが今何人にどういった権限で捕まれているか」の管理が必要であり、該当しない。
(shared_ptrを使っても大して楽にはならない)

123デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 17:28:14.89ID:CUftH0/Q0
一応簡単に俺の主張を纏めておくと、

・unique_ptrは従来C方式を文法的に強制させるだけで、コードの改善には繋がらない。
・shared_ptrの使いどころはWebサーバーしか思いつかない。

GC言語は基本的にshared_ptrなわけだが、あれって基本的に手抜き専用で、
GCがないと本質的に辛いって構造はあんまりない。
Rustも今更GC無しですかー、とも思うが、実際、無しなら無しでもいいか、程度ではある。

124 ◆QZaw55cn4c (ワッチョイ d360-EqDK)2018/06/10(日) 17:41:05.68ID:E3sHgrfJ0
>>123
その GC が大問題
現状 GC の最終手段は mark and sweep なので、これが嫌だ、という価値観はありだとおもう

125はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/10(日) 17:56:24.27ID:NuBmj+pR0
>>109
> 俺はunique_ptrは「C的リソース管理を文法的に示す」意味しかないと見てる。

その意味がすごく重要やん?
漠然としてたものに区別を与えてくれる最高の機能じゃんね。

126デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 18:04:27.80ID:WzrD1lk70
std::enable_ifを使いこなそう。

127デフォルトの名無しさん (ワッチョイ 3139-LHz9)2018/06/10(日) 18:04:47.47ID:E4gfPCgl0
>>95
期待して損した
そんな自殺コードを書かれるのを防ぐのは
スマポじゃなく人事部の仕事だ

128デフォルトの名無しさん (ワッチョイ 09c3-5Ttc)2018/06/10(日) 18:05:45.54ID:k6CFzDb+0
「バカよけ」機能に価値はない、無駄だから使わないしコードが長くなるから使わせない
っていう老害いるよね
そういう奴に限ってバグや脆弱性作り込むんだけど決して反省しない

129デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 18:06:37.55ID:WzrD1lk70
std::unique_ptrを導入すると人事部から一人削減できるってことじゃないか。

130デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 18:09:53.52ID:WzrD1lk70
まともな知的生命体なら迷わずユニポを使うだろう。

131デフォルトの名無しさん (ワッチョイ 3139-LHz9)2018/06/10(日) 18:21:28.47ID:E4gfPCgl0
>>128
まあ俺も老害とか言われることのある世代だが
価値がないのは「バカよけ」ではなく「バカ用」な
バカなふりをする達人をニヤリとさせるのではなく、
どうしようもない真性バカを延命する機能は有害なだけ

132デフォルトの名無しさん (ブーイモ MM33-dEMp)2018/06/10(日) 19:04:58.32ID:mER6VS6hM
>>127
期待するも何も、スタック巻き戻したらどうしてヒープ開放されると思ったのさ?

133デフォルトの名無しさん (ワッチョイ 3139-LHz9)2018/06/10(日) 19:11:21.01ID:E4gfPCgl0
>>132
デストラクタが実行されるからさ
スタック巻戻しとは何たるかわかってる?

134デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 19:42:24.37ID:CUftH0/Q0
混乱を避ける為に先に質問しておきたいんだが、
上記A(82)の場合、つまり、
親関数から子関数にポインタを渡したいが、所有権を移動しない場合には、どう書くんだ?
ざっと探しても出てこないんだが。

引数に値渡ししたらムーブ、これは分かる。
ムーブしたくないが子関数に渡したい場合は?

135デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 19:43:15.79ID:CUftH0/Q0
すまん、>>134はunique_ptrの場合。もう一度書き直すと、

親関数から子関数にunique_ptrを渡したいが、所有権を移動しない場合には、どう書くんだ?

136デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 19:45:27.08ID:CUftH0/Q0
>>124
それはありだ。

ただし、俺は「循環参照の場合に回収出来ないGC」であってもいいと思っている。
循環参照が必要なケースはほぼ無いので、明示的に切ってから解放でいい。
これはweak_ptrと同じで、C++erなら同意してもらえると思う。

ついでにいうと、「コンパクションが出来ないGC」でもいい。
これなら**ptrにする必要なく、*ptrで行けるから速度低下も起きない。

つまり、仕様はC++どおりでいいが、
プログラマにやらせるな、自動でやれ、ということ。俺的には。

137デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:15:37.49ID:lEW5NtSH0
>>135
なんだよ!所有権の複製もできないのかよ!?
やっぱりstd::unique_ptrダメじゃん!!!!

138デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 20:21:31.52ID:CUftH0/Q0
>>137
まあそのネタはさておき、マジで探しているのだが出てこない。
知ってたら教えてくれよ。

これ、もしかしてget()してナマポ渡すしかないとかいうオチ?
ならunique_ptrなんてマジでゴミだぞ。
さすがにそれはないと信じて探しているのだが、マジで出てこない。

139デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:22:18.03ID:lEW5NtSH0
>>138
参照で渡せばいいんじゃないのか?
そんなことして何の意味があるのか知らんが。

140デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:23:52.60ID:lEW5NtSH0
std::unique_ptrに対するweak_ptrは無いぞ。
だからゴミだという場合は、>>137

141デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 20:24:48.73ID:CUftH0/Q0
>>139
俺も最初はそうかと思っていたんだが、実はそれも出てこないんだよね。

まあでもそれで、コンパイラが最適化をするのを期待する、というC++的オチか?
これはあり得るとは思うが。

142デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:28:59.72ID:lEW5NtSH0
>>141
当たり前すぎて出てこないだけでは?
auto result = my_func(*my_unique_);
とすればいいだけなんじゃないの?

143デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:31:55.61ID:lEW5NtSH0
std::unique_ptrを利用する主な動機は総称型を保持するためなんだよな。

144デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 20:33:45.13ID:CUftH0/Q0
>>140
そういう意味ではないが、
> std::unique_ptrに対するweak_ptrは無いぞ。
この表現は分かりやすい。

>>142
それは実体を値渡ししてしまうだろ。

145デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:37:44.47ID:lEW5NtSH0
>>144
lvalue_referenceだから仮引数側でどうにでもできるだろ。

146デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:49:11.93ID:lEW5NtSH0
https://ideone.com/SEcQKq

こういうことがしたいんじゃないのか?

147デフォルトの名無しさん (ワッチョイ 09c3-5Ttc)2018/06/10(日) 21:01:59.63ID:k6CFzDb+0
参照だけするスマポ(と言いつつ何もしないアホの子スマポ)は次の規格で検討されてたでしょ
observer_ptrだかexempt_ptrだか名前コロコロ変わってるけど

148デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 21:22:56.11ID:CUftH0/Q0
>>146
だから違うっての

>>147
多分俺が欲しいのはそれだ。
https://en.cppreference.com/w/cpp/experimental/observer_ptr
要するに、「ナマポだがdelete出来ない物」が欲しい。
unique_ptrは値渡しすると所有権が移動してしまう。
関数にはポインタの場合値渡しが最速だし、自明だから、グダグダ書いて最適化を待つ、とかやりたくない。
生成は常にunique_ptrからの値コピー(所有権は移動しない)でいい。

寿命管理は他に任せるが、ナマポと完全に同パフォーマンスの物、これが欲しい。

まあ、検討中ならよかった。

149デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 22:03:51.04ID:lEW5NtSH0
deleteされたくないポインタと言えばこうだろ。
https://ideone.com/PvzDVY

150デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 22:50:21.29ID:CUftH0/Q0
>>125
> 漠然としてたものに区別を与えてくれる最高の機能じゃんね。
俺の理解が正しければ、これはダウト。表現力が足りない。
今のunique_ptrはB用のインタフェースしか持っておらず、Aを最速では記述出来ない。
足りてないのは、既に言ったとおり、「ナマポと同速だがdelete出来ないスマポ」。

だからやっぱイマイチなんだな。
とはいえ確実に拡充されてるから、最終的にどうなるかは見物だが。
高位機能も最終的には追いつくだろうし。

ただ、C++はプログラマの努力で何とかしようとしているが、
そもそもAにしてもBにしてもコールグラフの解析でfree忘れとか抜けるはずなんだよね。
Cの連中はこの辺には興味ないみたいだけど、
人手でやってる分、スマポみたいにコーナーぎりぎりを攻められないから、
ある程度わかりやすいところでfreeされてる。
当然、ツールにもかかり易いはずで。

151デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 23:09:19.21ID:lEW5NtSH0
それ参照でいいだろ。
言ってる意味が全く分からない。

152デフォルトの名無しさん (ワッチョイ b1a9-uWQQ)2018/06/10(日) 23:41:15.51ID:IWNTecyr0
私もはやく皆さんとお話したいのですが、内容が全くわかりません。
C++でRPG作れる程度の知識なのですが、何から学べば良いでしょうか。
おすすめの本、サイトがあれば教えてくださいが

153 ◆QZaw55cn4c (ワッチョイ d360-EqDK)2018/06/10(日) 23:46:32.30ID:E3sHgrfJ0
>>152
それならば
effective C++ / effective modern C++ がいいかと思います

154デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 23:47:37.76ID:lEW5NtSH0
そりゃC++使ってる人が読んだって全く分からないだろうな。

155デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/11(月) 07:09:55.61ID:ekbt9EBF0
>>122
>1. インミュータブルなインタフェースで、
>2. 不特定多数がランダムに掴みに来て、
>3. 解放タイミングがユーザー依存で読めない場合
ちゃうねんそれでは表層的な観察にすぎなず、
shared_ptr(的な、「オブジェクト自身に開放タイミングを決めさせる」(>>114))処理の必要性の1断面でしかないねん

>>121-122が言っているのは、
>こちらが実装上の都合で用意するオブジェクトの数と、未来のプログラマーに対して見せかけるオブジェクトの数が相違するケース(>>111)
において、未来のプログラマー(ユーザー)がオブジェクトをコピーしたつもりだが実装の内部ではコピーしていなくって、
ユーザー視点では自身のプログラムが保持する独立した1オブジェクトを開放したつもりが、実は内部の実装の都合において、
ユーザーまたはユーザー2のプログラムが保持する別のオブジェクトの開放と関係を持ってしまうケース(∵実体が同一)において
shared_ptr的な、「オブジェクト自身に開放タイミングを決めさせる」(>>114))処理が必要ということなんじゃー

156デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/11(月) 07:23:54.00ID:ekbt9EBF0
.>>122
>画像の差し替えはキャッシュ内の画像Aを無効化することにより行われる。
これは>>121のケースでは問題の解決にならない。
なぜなら、仮にキャッシュ上に画像Aを用意してあり、最後まで画像Aを掴むことになったセッションXに対して
セッション開始時にメインスレッドが渡したのがキャッシュ上の画像Aだったとしても、
渡した瞬間にセッションとキャッシュの関係は切れるからじゃわ!(半切れ

>>121は、セッションXは自身のローカル記憶(のつもり)であるところのオンメモリの画像Aを使い、
セッション終了時に開放する、ということしか言っておらず、
セッション中に2回3回とキャッシュ上の画像Aを取りにいくとは書いては
いない
キャッシュとセッションXの関係がセッション開始時の一瞬でしかない想定な以上、
画像Aの実体の開放に関してキャッシュの無効化機構をどう別実装しても無駄。問題に影響無し。

157デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/11(月) 07:43:46.07ID:ekbt9EBF0
ちな「キャッシュの無効化機構」とは、新規セッションに見せかける画像をAで無くすしくみという意味であって(それ以外の読み方をせよというのは_)、
画像Aの実体の開放とは関係ありませんからぬ、
というわけで繰り返しになるが画像Aの実体の開放に関してキャッシュの無効化機構をどう別実装しても無駄で、
画像Aの実体の開放はshared_ptr的な、「オブジェクト自身に開放タイミングを決めさせる」(>>114))処理の専任事項となる
>>121の想定のように画像Aが複数に見えることもあるが実体は唯一、というときはそうする以外画像のAからA'への差し替えは_

158デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/11(月) 22:46:31.97ID:aD4/YLZg0
>>155-157
まず、俺の意図が正確に君に伝わっていることは分かった。
が、Webサーバーなんてそんなもんだろ。(…α)

画像『ファイル』Aを鯖からダウンロードしている最中に、鯖上で画像『ファイル』がA'に変更されたとしても、
ユーザーは画像Aをダウンロードし続ける。
それどころか、鯖は更新された画像A'に即座に対応することすら期待されていない。
2-3分の遅延なら許容されている。
この仕様においては鯖上のオンメモリキャッシュとファイルの同期は厳密にとる必要はなく、
俺の示した実装の通りであり、それは君にも正しく伝わっている。
この場合はshared_ptrでの実装の方が楽だ。(ただし厳密には問題があるが)

一方、ファイルサーバーはそうではない。(…β)
Webサーバほどの多人数が同じファイルを同時に掴みに来ることはほぼ無いが、
「どのファイルが今誰にどういった権限で捕まれているか」を完全把握しなければならず、
ファイルの更新、ファイルロックのリリースも即座に対応することが期待されている。
許容されるのは精々数秒でしかない。
この場合は上位の制御が必ず必要になり、shared_ptrが有ったところで大して恩恵はない。

違いは単純で、「厳密な同期が必要とされているか」だ。
だからもし、君がMMORPGのような多セッションでの
鯖上『オンメモリ』画像AからA'への切り替えを想定していたとしても、(…γ)
それはshared_ptrでの実装では楽にはならない。
画像A->A'への切り替えを同期させるなら、「誰が画像Aを掴んだままか」を鯖側が把握せねばならず、
上位の制御が必ず必要になる。shared_ptrを配って終わり、にはならない。

これは結局、Web鯖上の『ファイル』に対するキャッシュ条件がユルユルだから発生した特殊事例であり、
俺が言ったとおり、
> 手抜きデタラメ実装する場合は凄く便利だが、ガチで実装する場合にはあまり恩恵がない (105)
でしかない。
勿論それが許容されている世界であり、スループットを取っているだけだからそれでいいんだが。

159デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/11(月) 22:47:47.00ID:aD4/YLZg0
が、とにかく君は、
> オブジェクト自身に開放タイミングを決めさせる
事が必要だと思っているらしい。これの他具体例はあるか?

君が挙げてきた別例はGCだが、現実問題として、ほぼunique_ptrで事足りるのも事実だろ。
shared_ptrは機能的にはunique_ptrの上位互換だから、GCではそれが用いられているだけであって。
「ナマポ禁止、スマポ使え」なC++宣教師は、
次は「漢ならunique_ptr。shared_ptrは甘え」と言うと思うぜ。

それともあれか?smalltalk的OOP或いはアクターモデル的に
> オブジェクト自身に開放タイミングを決めさせる
ってのか?だったらもうそれは流行らない、というか、
今のところ無駄が多すぎて普通に組んだ方がマシ、ってことになってる。

160デフォルトの名無しさん (ワッチョイ f3e9-Cil2)2018/06/11(月) 23:50:59.24ID:TCS4sLPg0
ワイ、低みの見物

161デフォルトの名無しさん (ワッチョイ 135e-JdDl)2018/06/12(火) 00:05:51.50ID:3X1PTNox0
ワイ、今表示されてる倉田まおの母音を見物中

162デフォルトの名無しさん (ワッチョイ 1334-KXLn)2018/06/12(火) 00:38:01.99ID:5CgUkaGq0
長い独り言だ
いつ終わるんだ

163デフォルトの名無しさん (ワッチョイ a98a-Duqg)2018/06/12(火) 05:08:46.11ID:l+dIOx6V0
オブジェクト開放ってどんな機能なんだろう:-P

164デフォルトの名無しさん (ワッチョイ 09c3-5Ttc)2018/06/12(火) 06:07:09.64ID:GF1juvMA0
「delete忘れないようにunique_ptr使いましょーね」「共有が必要ならshared_ptrがべんりだよー」
っていうだけの話の何がそんなに気に食わないのかさっぱりわからなくてついていけない

相手するなよ...

166デフォルトの名無しさん (ワッチョイ d3f9-5aY/)2018/06/12(火) 07:40:51.47ID:4LRUOmwX0
>>164
Q. 俺には必要性が分からない
A. 必要がないなら無理に使わなくていいよ
で済むお話。

167デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 14:16:45.83ID:AQ05KId60
>>164
俺は何言ってるか分かったけど、この人に説明するのは無理だろな。
使ったことがないものを批判したい感じだし、std:unique_ptrは必要になってから使えば良いよと言ってあげれば良いのかも。

168デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 14:21:27.71ID:AQ05KId60
まずムーブを活用して、総称性が必要になってから初めてunique_ptrを検討する感じがいいんじゃないのかな。
そしてshared_ptrは設計に時間をかけられないときに使うもので、ほとんど出番がないはず。

169デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 14:25:31.83ID:AQ05KId60
20世紀最大の発明はレーザーと言われてるけど、21世紀最大の発明はムーブと言われてるからね。
俺に。

170はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/12(火) 14:41:13.61ID:U9ShKAeR0
なるべく (ポインタでなく) 値でやりとりすること、それを低コストで出来るようにムーブ対応にしておくというのは
上位レイヤを作るときに楽できる良い設計だとは思うけど、
実質的にはスマートポインタの機能をクラスに付け加えてるみたいなもんで、
それがクソ面倒くせえときに標準のスマートポインタを使うみたいな方針でやってた。

総称性を活用するときという観点は無かったけど、確かに必要な考え方だな。

171デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 17:40:26.92ID:AQ05KId60
unique_ptrで内蔵しておけばnoexceptにしやすいので、ムーブが使われやすくなるというのはありますね。
とまあ、C++を使っていれば自然に有効利用するものですが、使う前に理解するのは難しいのではないでしょうか。
使ってみればなるほどとなると思うんですよね。

172デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 17:41:11.05ID:AQ05KId60
机上の空論繰り返すより、使ってみればすぐわかるよ。
これがおじさんからのアドバイス。

総称性ってなんだ?

174デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 19:28:54.15ID:AQ05KId60
C++の基本概念ですかね。

175デフォルトの名無しさん (ワッチョイ 13b3-Chll)2018/06/12(火) 20:48:00.50ID:WPS/KLb40
>>174
説明してくれる?

176デフォルトの名無しさん (ワッチョイ 1b9b-VoGU)2018/06/12(火) 20:57:02.36ID:zs4beaeD0
https://ja.wikipedia.org/wiki/%E7%B7%8F%E7%A7%B0%E5%9E%8B
総称型(generic type)、あるいはパラメタ付型(parametric type)とは、
型付けされたプログラミング言語においてデータ型の定義と
それを参照する式(型式)の一部にパラメタを許すことによって
類似した構造を持つ複数のデータ型を一括して定義して、
それらを選択利用する仕組みである。

総称型は、暗黙の型変換(implicit type conversion)あるいは型強制(type coercion)、
多重定義あるいはオーバーロード(overload)、継承(inheritance)あるいは包含(inclusion)と並んで
プログラミング言語においてポリモーフィズムを実現するための一つの手段であると看做せる。
総称型が使われている言語の例としてC++のテンプレート、JavaやC#のジェネリクスがある。

へー

177デフォルトの名無しさん (ワッチョイ 13b3-Chll)2018/06/12(火) 21:16:18.28ID:WPS/KLb40
総称型の説明は要らんよ
欲しいのは総称性って言う謎の言葉の方

178デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 21:34:08.94ID:AQ05KId60
謎なんだ。

179デフォルトの名無しさん (スップ Sd73-YTw3)2018/06/12(火) 21:37:14.01ID:SAMUGOdnd
個々のクラスの実装を工夫して値渡しとムーブで解決できないかをまず考えて、
複数の型について類似のコードが出てくるようなら unique_ptr や shared_ptr (や自作スマートポインターテンプレートクラス) の利用を検討する、
というようなことでは。

180デフォルトの名無しさん (オッペケ Srdd-Cil2)2018/06/12(火) 21:45:06.18ID:gIFipeApr
シンシュンシャンソンショー

181デフォルトの名無しさん (ワッチョイ 13b3-Chll)2018/06/12(火) 22:13:43.97ID:WPS/KLb40
>>178
そりゃ誰も説明できないから謎でしかないわ w

182デフォルトの名無しさん (ワッチョイ 13eb-EKWA)2018/06/12(火) 22:15:46.28ID:drNdawcz0
なんかそれっぽく言っとけば暗黙の内にマウント取れるから

183デフォルトの名無しさん (ワッチョイ a9f2-LHz9)2018/06/12(火) 22:18:13.53ID:ETzAt0ej0
「オマエ知らないんだ〜」「でも教えてやらなーい」ってのは
元手ゼロでもできる安上がりなマウンティング

184デフォルトの名無しさん (ワッチョイ d9ee-LHz9)2018/06/12(火) 22:38:18.73ID:qK0E4vkq0
悔しそうだねw

185デフォルトの名無しさん (ワッチョイ b19f-a1ED)2018/06/12(火) 23:00:25.83ID:J4aQNa8C0
オマエ知らないんだ〜
でも教えてやらなーい

186デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/12(火) 23:22:34.41ID:/0VzFXQ50
>>158
>この場合は上位の制御が必ず必要になり、std::shared_ptrが有ったところで大して恩恵はない。
この言い分はずんねんながら成立しない

「プログラム、呼び出されなければただのデータ」という諺(今漏れが作った)からわかるとおり、
画像Aや画像A'のいかに巧妙な中央集権的なリソース管理のロジックを組んだところで、
画像Aや画像A'の開放タイミングで呼び出されなければ機能しない

で、この呼び出しというのは、std::shared_ptr<画像>で極めて確実に(呼び忘れが無い形で)行うことが出来る
すわなち、画像Aのデストラクタで目的の中央集権コードを呼び出せば(注1)良い
よって、C言語スキー野郎(敬称略)がいうところの「std::shared_ptrの恩恵が少ない」例は、
そのまんま「std::shared_ptrを使えばより良い実装になる」例である

注1: ここでの呼び出しとは、実行権を渡すことを意味する。
直接CALL、メッセージの送付、レジスタにパラメータを積んでソフトウェア割り込み、
インスタンス固有の管理テーブルに情報をセットしてイベントで待ち解除、(同)タスク起床、etc.etc...
原液PGならやり方を100万通りぐらい即答できるはず

187デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 23:42:22.02ID:AQ05KId60
通知メカニズムを持つ画像より、通知メカニズムを持つリソースハンドルのほうが便利に違いないので、あまり使いどころがなさそう。

188デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/12(火) 23:47:32.67ID:/0VzFXQ50
>>187
リソースハンドルは味噌も糞も一緒のHANDLE型で型安全の観点から不安があるが
画像クラスでwrapすれば型安全になる
行いが良ければ空も飛べるはず

189デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/13(水) 00:06:22.45ID:uiSNJKd/0
>>188
禿4はSTLコンテナの類もリソースハンドルと呼んでるけどな。
std::shared_ptrに通知メカニズムをプラスしたようなものが実際に必要になるのではないだろうか。
オジサンはATL風の通知メカニズムを備えたコンテナを作りましたぞ。

190デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/13(水) 00:09:01.46ID:uiSNJKd/0
リソースを共有するということは、通知もセットで必要になると思うんだよなあ。

191デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/13(水) 00:25:29.19ID:RKKw3ZF+0
>>170
お前、ワッチョイ 81b3-8neNが一度もまともなことを言ってないのを理解出来ないのはヤバいぞ。
そもそもお前、>>125ってことは、observer_ptrの使いどころも理解してないだろ。

192はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/13(水) 01:34:41.54ID:3eXA0K0W0
まだ標準にも入ってないもんなんか使ったこともないし知らんわ。

193デフォルトの名無しさん (ワッチョイ a92d-z9k/)2018/06/13(水) 18:27:25.89ID:9sngOZbY0
唐突にphoenix_shared_ptrとか言ってみる 解る人おるやろか
Lokiに始まるメタテンプレートプログラミング狂騒時代も15年以上昔か…

194デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/13(水) 19:47:43.91ID:RKKw3ZF+0
>>192
そう言うだろうとは思っていた。
そしてそれが今の君の、またC++erの限界なのだと思う。

君は>>103によると、世代的に、
C言語の前にアセンブラをやった連中は誰一人としてポインタで躓くことはなかった事実を知っているだろ。
これは単純に、ポインタの意味は既に知っており、
単に、インデックスレジスタの使い方をポインタと命名したんですね、で済んだからだ。
俺は同様の見方でC++を見てる。
C++のスマポはCのナマポを「分類/命名」しただけで、「追加」してないから。
だから記述能力が足りないことにも気づく。

unique_ptr(キリッなんてやってるC++erは馬鹿丸出しだ。
君らはそれがCへの回帰な事にも気づけてない。
そしてここにきてobserver_ptrを追加するのは、完全に敗北だ。
あれはA方式用に他ならないから。

とはいえ、良いトライであったとは思うよ。そして失敗した。
ただ、それを修正して来れている点は素晴らしいが。
shared_ptrも結局使いどころがないだろ。

アセンブラの件からも分かるように、「理解していること」と「書いていること」は別なんだ。
正しくCを使っている連中は、そのナマポがunique/shared/weak/observerのどれなのかは明確に意識してる。
ただそれを書いてないだけだ。だから馬鹿には使っていないようにしか見えない。
君はobserver_ptrを知らないし、教えてもらわないと必要性に気づけない。
そこまで落ちぶれているって事だよ。
少なくともアセンブラ→Cの時のように、概念は理解しているがその言語での名前を知らないだけ、ではない。
対して、Cの連中は既にobserver_ptrを使っている。(ただし書いてない)
ここら辺の違いが、linusが一貫してC++erに冷めている理由だろうよ。無知な馬鹿にしか見えないから。

195はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/13(水) 21:32:55.86ID:3eXA0K0W0
>194
> 正しくCを使っている連中は、そのナマポがunique/shared/weak/observerのどれなのかは明確に意識してる。
> ただそれを書いてないだけだ。だから馬鹿には使っていないようにしか見えない。

ああ、馬鹿にはわかんないよ。
だから書いてくれっての。

人間は度し難いほど馬鹿なので、クソみたいな間違いをする。
意識していたとしても間違う。
知っていても何度でも間違う。

そんなの当たり前だろ?

196デフォルトの名無しさん (ワッチョイ 135e-JdDl)2018/06/13(水) 21:37:20.42ID:sL+nPHdq0
で、おめぇは一流のC++erと自称したいのかい。

ほんとに糞な爺だわ。早く棺桶の中で寝ろ。この河童虫が

197デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/13(水) 23:13:52.35ID:RKKw3ZF+0
>>195
まあ俺は書くこと自体には反対ではないんだが、

1. 足りないんだから書きようがない(observerが)
2. そもそも書くほどバリエーションがない

Cで使われているのはunique/observerで、shared/weakはほぼあり得ない。
制御が煩雑すぎてバグる。
だからこそsharedが生きる構造があればC++が勝ちきる可能性があったが、
shared撲滅みたいな今の風潮じゃあねぇ。

そして既に書いたが、大概は方式Aだから、
ローカルのナマポはuniqueで、それ以外は全部observerでしかない。
わざわざ分けて書くほどバリエーションがないんだよ。

Cの連中は書くのが嫌なわけではなく、書く意味を見いださないのだと思うよ。
書いたところでコード構造が改善されるわけでもなく、速度が上がるわけでもない。
書かずともどうせA方式だし。

198デフォルトの名無しさん (ワッチョイ e9bd-dEMp)2018/06/13(水) 23:25:33.47ID:5laWTN4A0
shared撲滅の風潮ってどこ界隈の話なの?

199デフォルトの名無しさん (ワッチョイ 1334-KXLn)2018/06/13(水) 23:41:19.62ID:J0Tz9R0J0
sharedはリファレンスカウンタがからんでくるからね

200 ◆QZaw55cn4c (ワッチョイ d360-EqDK)2018/06/13(水) 23:55:17.48ID:exxNW2Ar0
shared は循環参照には無力だからね…

201デフォルトの名無しさん (ワッチョイ 1b9b-VoGU)2018/06/13(水) 23:58:45.33ID:WZGs4Fzm0
依存性にかならず上流下流関係があってノードで循環を監視できれば
sharedでいいよね

202デフォルトの名無しさん (ワッチョイ 4dbd-ymc6)2018/06/14(木) 00:42:29.58ID:AR2hsIBa0
gtkもtcl/tkもwxも撲滅しなきゃならんのけ?

203 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/14(木) 00:43:59.29ID:V5ffjU050
>>201
>ノードで循環を監視できれば
そんなことが、果たして可能なのか?

204デフォルトの名無しさん (ワッチョイ 4233-m0US)2018/06/14(木) 01:14:20.14ID:tdGLg+cS0
>>197
分けて書く理由にバリエーションの数は関係ないでしょう。

205デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/14(木) 04:20:54.09ID:vzmFB22H0
問:ある時刻tの日本の年号を返すプログラムをC++とSTLを使って表現しなさい。年号はコードに埋め込むものとする。

206デフォルトの名無しさん (ワッチョイ 22f9-b25I)2018/06/14(木) 06:40:46.06ID:iQB56L+L0
宿題は自分で頑張れ

207デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/14(木) 07:14:11.27ID:QWAhFsNz0
>>198
参照のクモの巣と言えばDOMが有名だけど、あれはスクリプト言語ユーザーの都合上そうなっているだけで、C++ユーザーにとっては無用の長物なんだよね。
タブを一つ開くたびに500MB消費するのは許容限界を超えていると思う。

208デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/14(木) 07:19:10.82ID:QWAhFsNz0
そして、ブラウザをCで書くのは非常につらい作業になるので、実用上C++を使うことになる。
したがって、スクリプト言語をホストする以上、自分たちにとって参照のクモの巣が無用の長物であったとしても、C++は、必要とされればいつでも参照のクモの巣をサポートする力が必要になる。

209デフォルトの名無しさん (ワッチョイ 42bd-eoBX)2018/06/14(木) 07:54:07.51ID:loD77XnX0
>>203
循環の検出ならスタックとノード毎の到達済みフラグがあれば逝ける
ドーナツ型の図形を塗りつぶすのと同じやり方
(個々のノードは、参照先の到達済みフラグがTRUEならああ循環したんだなあとワカル

210デフォルトの名無しさん (ワッチョイ 42bd-eoBX)2018/06/14(木) 08:05:57.75ID:loD77XnX0
まあ分岐の無い循環しかないならスタックは無しでも逝けるがな!
末尾再帰の最適化と同じやり方
(ループで済む

211デフォルトの名無しさん (ワッチョイ 469f-ys2j)2018/06/14(木) 08:14:46.47ID:1FD9Rath0
つまり古典的なマークアンドスイープ最強ってこったな。

212デフォルトの名無しさん2018/06/14(木) 08:27:43.24
量子コンピュータなら循環なんて一瞬で分かるよね

知らんけど

213デフォルトの名無しさん (ワッチョイ d123-PZZX)2018/06/14(木) 08:37:33.66ID:HZa0RgSQ0
そもそも再帰的なデータ構造じゃないものなら
循環参照のしようがないので普通に shared_ptr で良いし
そういう処理もごく普通によくある

>>209
>(個々のノードは、参照先の到達済みフラグがTRUEならああ循環したんだなあとワカル

循環に限らず単純な共有でもこうなるので
そんなことでは循環したんだなあとワカラナイと思う

214デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/14(木) 09:46:17.13ID:QWAhFsNz0
循環参照は甘え。

215かさぶた (ワッチョイ 99b3-4tVh)2018/06/14(木) 09:52:01.49ID:EOR8DX2X0
質問です、下記はソースの1部分なんですが、あるプロセスのメモリを検索しています。00000000〜7FFFFFFFまでを検索しているのですが7FFFFFFFを9FFFFFFFまでに増やしたいです、単純に終了アドレスを9FFFFFFFにしても検索してくれないですが何故でしょうか?
http://codepad.org/cdLpKbdw

216デフォルトの名無しさん2018/06/14(木) 12:13:24.04
>>215
INT36-C. ポインタから整数への変換、整数からポインタへの変換
https://www.jpcert.or.jp/sc-rules/c-int36-c.html

217デフォルトの名無しさん (ワッチョイ 99b3-mJaI)2018/06/14(木) 13:43:20.70ID:EOR8DX2X0
>>216
どの部分ですか?

218 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/14(木) 21:03:45.53ID:V5ffjU050
>>209
kwsk

219 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/14(木) 21:04:41.22ID:V5ffjU050
>>211
他に方法がないが、いちいち mark and sweep するなんて考えられない

220デフォルトの名無しさん (ワッチョイ 42bd-eoBX)2018/06/14(木) 23:42:44.50ID:loD77XnX0
>>213
>循環に限らず単純な共有でもこうなるので
到達済みフラグをセットするのは開放時なので
ならない

>ドーナツ型の図形を塗りつぶすのと同じやり方(>>213)
と書いただけでは通じなかったですかそうですか、

221デフォルトの名無しさん (ワッチョイ 42bd-eoBX)2018/06/15(金) 00:11:08.99ID:te7lJSB30
ごめwwwwww
×:到達済みフラグをセットするのは開放時なので
○:到達済みフラグをセットするのは参照カウントを減らすときなで

222デフォルトの名無しさん (ワッチョイ 42bd-eoBX)2018/06/15(金) 00:31:56.81ID:te7lJSB30
と思って今作ったがあんま使い勝手の良いものにはならんかったorz
使い方としては
class Foo {
 sumapo<Foo> m_pCar;
 sumapo<Foo> m_pCdr;
 /*...*/
};
sumapo<Foo> ptr(new Foo());
と書いた後、ptrが開放されたとき、ptrが指すFooが握っているsumapoが残らず(循環があろうとなかろうと)参照カウントを減じて欲しいわけだが
これにはptrが握っているFooを開放する前に、ptrがFoo::m_pCdrやFoo::m_pCarを辿れる必要があるので
m_pCarやm_pCdrとptrが裏で手を握る必要がある

223デフォルトの名無しさん (ワッチョイ 4234-3nod)2018/06/15(金) 01:30:57.51ID:tfGvP9jV0
sumapoが酢マンポに見えた

224デフォルトの名無しさん (ワッチョイ 42bd-eoBX)2018/06/15(金) 07:32:17.48ID:te7lJSB30
ごめwwwwwwwまた言い方をちょっとまつがえたorz
誤: Fooが握っているsumapoが残らず(循環があろうとなかろうと)参照カウントを減じて欲しい
正: Fooが握っているsumapoが(循環があろうとなかろうと二重破棄を招かない形で)参照カウントを減じて欲しい

リフレクションがあればsumapoからFoo(やBar)のメンバが丸見えなのでsumapoのリンクを辿って破棄予定オブジェクトを事前にマークすることで2重破棄の防止を自然に実現できる
リフレクションが無い現行のC++なら、sumapoのデストラクタで破棄される予定なFoo(やBar)をマークだけして破棄を遅延する、みたいな細工をするしかないが
デストラクタの中から全てのFoo(やBar)のマークが完了したか知る術が無いから、sweepする呼び出しが別途要る、、

やっぱC++にもリフレクション欲しい…

225デフォルトの名無しさん (ワッチョイ 419f-bAWz)2018/06/15(金) 08:54:27.46ID:11m1WzfY0
>>224
JavaScripterマジで死ねよ

JavaScriptのコミュニティが腐っているのは、
馬鹿であることを自覚出来ないお前みたいな大馬鹿が、嘘を平気で垂れ流しているからだよ。
そして初心者はそれを見抜けず、騙されて馬鹿が再生産されてる。

お前らがC++のコミュニティを破壊する権利はない。JavaScriptのゴミ貯めに戻れ。
お前らはプログラマ全体からするとゴミ以下のクズなんだよ。それを自覚しろ。
C++初心者の為に、俺がお前の嘘を暴いておいてやる。

> リフレクションがあれば
お前のリフレクションの使い方は、メンバの中身を参照したいだけのようだ。
ならば、全てのメンバがpublicだったらいいはずだ。
このケースで、どうやって実現出来るのか説明してみろ。
お前は本当に何も分かってない。最初から躓くと思うぜ。

オブジェクトAのメンバはすべてpublicである。
オブジェクトAのインスタンスa,b,c,dは
・aはbを参照している
・bはaを参照している(a-b間で循環参照)
・cはbを参照している
・dはcを参照している
の状態で、a-b間で循環参照があり、参照はd -> c -> b <-> aとなっている。
これらへの参照は他にはない。
今、dへの参照がなくなり、dのデストラクタが起動された。

この状態で、どのように回収されるのか、説明してみろ。
お前みたいな馬鹿には出来ないと思うぜ。

さっさとJavaScripterの巣に帰れ。邪魔でしかないから。

226デフォルトの名無しさん (ワッチョイ d123-PZZX)2018/06/15(金) 09:22:53.91ID:RJDRNrzC0
>>220
単純な共有と循環を区別できるコードを書いてみてごらんよ。
あなたが考えているような簡単なものにはならない。
恐らくはあなたには書けないから。

コード書かずに妄想してるから間違えるんだよ

227デフォルトの名無しさん (ワッチョイ d123-PZZX)2018/06/15(金) 09:28:19.83ID:RJDRNrzC0
いや違うか。
普通はコード書かずともちょっと考えればそんな間違いしない。
考えずに書くから間違いばかりする。

228デフォルトの名無しさん (ラクッペ MM61-wCsk)2018/06/15(金) 10:24:12.07ID:D6yBxFGeM
C++って難しいの?

229デフォルトの名無しさん (ワッチョイ d123-PZZX)2018/06/15(金) 10:24:22.09ID:RJDRNrzC0
有向グラフでマークしてトラバースすれば循環がわかるのは単方向リストくらいなものだろ
ドーナツがどうとか言ってるのは無向グラフと混同している

230デフォルトの名無しさん (ブーイモ MMb6-Z/ei)2018/06/15(金) 11:47:40.97ID:pSkky0TvM
>>228
難しい人が多いよ

231デフォルトの名無しさん2018/06/15(金) 12:08:37.80
難しい人ってか、基地外な人が多いね

232デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/15(金) 14:00:33.64ID:S225t3Tg0
JavascriptとC++では要求されるレイヤーが違うので、比較するのは無理だと思う。

233デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/16(土) 01:44:46.69ID:NR0pGRhV0
複雑な参照を持つシステムってまぁほとんどシミュレーション系で速度も要件に入ってくるんですよ。
糞遅いJavascriptやpythonなんて普通に使いものにならずC++の独擅場なわけですよ。
pythonでAIとか笑っちゃいますね。

234はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-Bw3Y)2018/06/16(土) 03:04:09.42ID:eEu6oaxZ0
>>233
この場合の Python はいわゆるグルー言語でしょ。
高速なコンポーネントのパラメータを指定して組み合わせるだけみたいな使い方なんじゃないの。

高速な計算が出来るコンポーネントは C++ が主流であったとしても、
それをビジネスロジックにさっと適用するという意味での「Python で AI」は現実的だし、
実際よくあることだと思う。

235デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/16(土) 03:46:18.97ID:NR0pGRhV0
高額なPython屋募集のAI案件は、99%非現実的。
AIを何も分かってな奴が企画したプロジェクト。散々利用されてきた統計学以上の成果など出やしない。
昨今のAIブームは過去のAIブームと同じく破綻プロジェクトばかりなのは言わずもがな。

なぜPythonか。失敗したときにPythonだからと言い訳するため。
そもそも簡単な言語なのに高額で募集する時点で辻褄が合わない。
嘘ついて投資募ってるのは明らか。読売新聞のAI記事読んでると騙す気満々だと分かる。

openCVスレでもpythonから入る奴は何もできやしない。最初から分かりきったこと。フフフ、笑えますね。

236デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/16(土) 04:06:22.88ID:Xfp5NB1U0
結局はコンポーネント間の通信回数を減らすことが肝。しっかりと設計を吟味すれば従来通りのIPCで十分だったりする。

237デフォルトの名無しさん (ワッチョイ 069d-/RsH)2018/06/16(土) 09:29:46.67ID:/wbLufVy0
>>235
でもAIってモジュール部分は超簡単なんじゃない? それにそんなもの「作る」って
レベルじゃないから、出来の悪い奴でもいいから一人がC++でモジュール書いていば
OKでやっぱPythonレベルの方が重要なのではないか?

238デフォルトの名無しさん (ワッチョイ c212-bAWz)2018/06/16(土) 09:39:44.63ID:kxy+9IRB0
そのあたりはpythonのソースコードを見ると分かる
ttps://github.com/python/cpython/blob/master/Objects/weakrefobject.c

239デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/16(土) 12:41:15.99ID:HgejND060
C++の公式スクリプト言語はPythonだから慣れるしかない。

240デフォルトの名無しさん (ブーイモ MM85-Z/ei)2018/06/16(土) 16:48:42.77ID:mGUvusUxM
何かのネタ?

241デフォルトの名無しさん (ワッチョイ 069d-/RsH)2018/06/16(土) 16:56:00.16ID:/wbLufVy0
AIで一番大変なのはデータを食わせることだよな。パイトンでもC++でもなくて
一番重要なのはエサやりして大切に飼いならす人だよ。だから愛がないとできない。
お前等には無理だな。三日やったら課長の机に糞してとんづら。

242デフォルトの名無しさん (ワッチョイ 4234-3nod)2018/06/16(土) 17:02:55.51ID:q68/flhz0
その学習させた膨大なデータが高額で取引される時代が来るのかね

243デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/16(土) 23:47:37.78ID:HgejND060
OCamlがあるのだからオッパイソンがあってもいいはずだが。

244デフォルトの名無しさん (ワッチョイ 469f-cPc7)2018/06/17(日) 09:57:43.12ID:dJUJdMR30
>>235
ほとんどのAI案件がやばいってのは同意だが
pythonなら言い訳できるってのはねーわw

そもそもAI案件の難しさはプログラム言語がどうのとかそういう問題じゃない。

245デフォルトの名無しさん (ワッチョイ 419f-bAWz)2018/06/17(日) 11:12:20.33ID:DwTnzOB00
>>230-231
仮にそれでもJavaScripterよりマシだ。
お前も含めて、JavaScripterには、馬鹿かつキチガイしか居ない。
>>220,224: 反論することも出来ず、間違いを認めることもなく、ただ逃亡

これをやるからJavaScriptのWebリソースは大半が腐ってる。
俺は知らんがC/C++はWeb上の間違いに異常に厳しかった時代があったと聞く。
それが今も引き続いていて、Web上の正確性を担保してくれているのなら、有り難い話だよ。
ゆとりには「ぼくがおこられなければいい」という幼稚園児並みの知能しかないから、
JavaScriptコミュニティみたいなことが発生する。
あれは最早完全に手遅れで、その状態のゆとりが教える側に回っていることが最悪。
連中は平気で嘘をつく韓国人レベルのモラルしか持ってないし。
結果的に間違いであったにせよ、修正しておかないと、後で読む人の為にならないだろ。
「嘘だと認めなければ嘘ではない」という、韓国人みたいな奴は、キッチリ殺すべき。

間違ったことを書いたら叩かれるのは、長期的に見ればいいことだ。
それがゆとりには分からないだけでね。

あと、わざわざID消して自演しているゴミ、それは余計に目立つぞ。
他の誰もそんなことをしてないから、逆にコテトリになってる。
お前は他でも荒らしまくってるよな。

246デフォルトの名無しさん (ワッチョイ 419f-bAWz)2018/06/17(日) 11:26:31.91ID:DwTnzOB00
>>227
一番足りないのは謙虚さなんだけどな。

JavaScripterは本当に馬鹿しかいないから、コードがマジでゴミしかない。
だから糞コードしか書けない馬鹿がつけあがる。
そしてそれを諫める年長者もいない。幼稚園で先生がいない状態だ。

C++は30年の歴史があって、仕様も改訂し続けているのだから、
今の仕様はその中で今一番マシな方法ということになっている。
JavaScripterみたいなぽっと出のゴミがぱっと考えて思いつくような手法を、
今まで30年間誰も思いつかなかったと思うこと自体がキチガイでしかない。

247デフォルトの名無しさん (ワッチョイ 419f-bAWz)2018/06/17(日) 11:30:36.00ID:DwTnzOB00
というわけで先に進める。
沸きまくっている馬鹿を振り落とす為に速度を上げるからよろしく。

>>213
> そもそも再帰的なデータ構造じゃないものなら
> 循環参照のしようがないので普通に shared_ptr で良いし
> そういう処理もごく普通によくある
「再帰的なデータ構造ではないとき、循環参照は発生しない」については同意だが、
「循環参照がない場合は、shared_ptrでいい」には反対だ。
これだとC++の速度優位性が無くなるので、俺ならGC言語を検討する。
ただしこれは宗教だからもういい。

本題は、

・shared_ptr(静的共有)必須な構造が、果たしてあるか

だ。木構造で一番身近なファイルシステムを例に取ると、
静的共有(ハードリンク/shared_ptr)と動的共有(シンボリックリンク/getter)のうち、
前者はほぼ使われてないだろ。
これは、ユーザーによる手動管理の場合、シンボリックリンクの方が明示的で使いやすいからだ。
シンボリックリンクは常に最新版を、ハードリンクは常に生成時の対象を参照するところが異なる。

速度的には静的共有の方が優位だとして、動的共有では無理な事例ってあるか?
俺が知っているハードリンクの活用事例は、WindowsUpdateくらいだ。
「動けばいい」なら動的共有の方が適切に思える。
(C++で動的共有はなかなかにきついが、動的言語なら自然に実現出来る)

248デフォルトの名無しさん (ブーイモ MM62-Z/ei)2018/06/17(日) 11:37:00.29ID:PZ1k9mb/M
>>245
何故に自分のことと思ったのか知らんけど、自覚が無いよりはあったほうがいいと思うよ。
別スレでID無しにイジメられたんか?

249デフォルトの名無しさん (ワッチョイ 419f-bAWz)2018/06/17(日) 11:58:04.60ID:DwTnzOB00
>>248
俺から見ればお前がキチガイだし、
ここがお前にとって合わないと思うのなら、お前がここに来るのが間違ってる。

ゆとりはゆとりだけでスレ作れよ。
それがお互い一番幸せな解決だ。

俺には韓国人とゆとりは殺すしかないという結論が出てる。
お前らは邪魔しかしないから。今もそうだろ。

初心者で的はずれな質問かもしれませんがお願いします。
1行に約4000文字,区切りで書かれたファイルがあり、これが1000行あります。
このファイルを1行ごとに別の配列に格納したいのですがfgetsだとchar型になりcharは256文字しか入らないようです…
どうしたら読み込みできるのでしょうか

251はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-Bw3Y)2018/06/17(日) 12:21:49.68ID:w6bayl/C0
>>250
> fgetsだとchar型になりcharは256文字しか入らないようです

単に間違えたプログラムを書いている。
そのプログラムを提示してみて。

252放置された蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd62-+ixL)2018/06/17(日) 13:16:47.51ID:ETBxv0Nyd
std::getline使え。

253デフォルトの名無しさん2018/06/17(日) 14:34:42.11
C言語を通らずにいきなりC++を使う初学者は
fgetsやcharに触れるべからず
必ずラッパーライブラリを使うべし

254デフォルトの名無しさん (ワッチョイ 4234-3nod)2018/06/17(日) 14:38:26.28ID:o/JM81cD0
>>250
getcを使ってmyfgetsを新たに作る
改行を調べるだけなのでそんなに苦ではない

255デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 15:00:46.90ID:JVUiE6fQ0
>>247
C++風に考えるとstd::shared_ptrは必要なくなってくるけど、他の言語の真似をしようとすると、必要になるんだよな。
そしてC++は他の言語から呼び出されるから。
そういう部分で必要があるのかも。

256デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 15:03:38.90ID:JVUiE6fQ0
スレッド使う場合は、コピーのほうが速くないかよく考えた方が良い。
意外とコピーのほうが速い。

257デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 15:29:58.46ID:GftzeAnS0
>>253
宗教じみたことは言わないほうがいい。

C++の入出力クラスiostream系の標準機能は失敗した代物との結論が出ている。
C++学習者は FILE* 系の標準機能を優先して使うのが正道。

258 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/17(日) 15:54:43.81ID:mtjEdwIk0
>>257
iostream 系のどんなところが失敗しているのですか?

259デフォルトの名無しさん2018/06/17(日) 16:15:29.34
>>257
あり得ない
ポインタも分からん奴に生char使われてたまるか
fgets使いたいならC言語で基礎を身に付けてから出直して来いや

260デフォルトの名無しさん (ワッチョイ 027f-m0US)2018/06/17(日) 17:04:58.59ID:WsbcFOTU0
たしかにiostreamはデストラクタで自動的にクローズしてくれるくらいしか
メリットが感じられないから、自分でファイル入出力クラス作ってるわ

261デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 17:21:05.94ID:GftzeAnS0
iostreamはC++のテンプレートクラスが未発達だったころの遺物だよ。STLに含まれない時点でお察しではあるが。
iostreamを使うよりもshared_ptrなどのスマートポインタでFILE*をラップしたテンプレートクラスを使うほうが現代的。
shared_ptr::shared_ptr<FILE>のコンストラクタで第二引数にfclose()を呼び出すdeleterオブジェクトを渡すだけで事足りる。
shared_ptr::shared_ptr<FILE>直使いもいいが、その派生クラスを使って暗黙のFILE*型キャスト演算子を実装すれば、Cコードとの移植性がさらに高まる。

あと、iostreamはios系の様々なフラグがあるが、煩雑で使い勝手が悪い。覚える価値ゼロ。

262デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 17:21:36.16ID:JVUiE6fQ0
>>258
速度じゃないか?
使いもしないオペレータのために余計な処理挟むから。
VCについてくるディンカムウェアなんか一バイトごとに仮想関数呼び出してるぞ。

263261 (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 17:27:10.63ID:GftzeAnS0
訂正。
shared_ptr::shared_ptr<FILE> じゃなくて、shared_ptr<FILE>でした。
deleterサンプルは以下の通り

struct file_deleter { void operator() (FILE* fp) const {if (fp != NULL) { fclose(fp); } }};
shared_ptr<FILE> fp(fopen(filename, "r"), file_deleter());
// 以下、fp.get() でFILE*にアクセス。

264デフォルトの名無しさん (ワッチョイ adf2-Bw3Y)2018/06/17(日) 17:29:10.50ID:iFYzb9cl0
まあでも、明らかな失敗だったら auto_ptr や wstring_convert みたいにとっくに deprecated にされてるよね。

265デフォルトの名無しさん (ラクッペ MM61-ehQV)2018/06/17(日) 17:41:30.52ID:BIBpmi0IM
全く理解出来ない
俺が低レベルなのか?

266デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 17:54:24.16ID:GftzeAnS0
class FILE_Ptr : public ns_shared_ptr::shared_ptr<FILE> {
 struct FILEDeleter {
  void operator() (FILE* fp) const {
   if (fp != NULL) {
    fclose(fp);
   }
  }
 };
public:
 FILE_Ptr(FILE* fp = NULL) : ns_shared_ptr::shared_ptr<FILE>(fp, FILEDeleter()) {}
 operator FILE* () { return get(); }
 template<typename T> bool operator == (const T& obj) const { return get() == reinterpret_cast<FILE*>((void*)((intptr_t)obj)); }
 template<typename T> bool operator != (const T& obj) const { return get() != reinterpret_cast<FILE*>((void*)((intptr_t)obj)); }
};


void fclose(ns_shared_ptr::shared_ptr<FILE>)
{

267デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 17:59:57.67ID:GftzeAnS0
>>266を途中で送信してしまった。

ns_shared_ptrは、boostなりstdなりstd::tr1なり自分の好きな名前空間に置き換えを。以下のように。
namespace ns_shared_ptr = boost;

グローバル関数fclose(ns_shared_ptr::shared_ptr<FILE>& fp)を別途作れば、
Cのコードをコピペ利用した時のfclose(fp)多重呼び出しを防止できる。

268デフォルトの名無しさん (ワッチョイ 419f-bAWz)2018/06/17(日) 18:09:36.34ID:DwTnzOB00
>>207,208
>>255,256
DOMの話か?500MBは言い過ぎだからとりあえず放置したが、
GC言語は基本的にshared_ptrの仕様だから、その実行エンジンの実装に使われるのは妥当だ。
これをサポートする為、shared_ptrは仕様上は必要だ、というのも同意する。

問題はそれがデータ構造として必要か、という点で、
DOMの場合、HTMLは共有無し/循環参照無しの単純な木だからunique_ptrだけで問題なく構成出来る。
ただしJavaScript側に捕まれている場合、ノードが木から取り除かれた場合にも保持し続けねばならず、
この実装にはshared_ptrを使わないと厳しいだろう。
しかしこれはデータ構造ではなく、JavaScriptの仕様が原因だ。

マルチスレッドのキャッシュについては、これは現時点でのハードウェアの問題で、
単純に言えば共有RAMに対して書き込みをすれば著しく遅くなるだけだ。
これはデータ構造の問題ではないので別に取り扱う必要がある。
(速度低下はshared_ptrの問題ではなく、キャッシュ構造起因)


データ構造について言うなら、shared_ptrの使いどころは、

1. 共有ノードがある
2. 循環参照はない
3. 動的に生成/消滅を頻繁に繰り返す

だと思うんだが、2の為にメッシュ構造とかは基本的にアウトで、
3も基本的にないだろ。
実はあんまり使いどころなくね?って話。

269デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 18:14:03.26ID:GftzeAnS0
weak_ptr の使いどころを見極めるのが難しい。

270 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/17(日) 18:17:30.15ID:mtjEdwIk0
>>261
>iostreamはios系の様々なフラグがある
そうそう、今いち、よく定義がわからないんだよね
それに、手元の実装がこのフラグについてまともじゃないかもしれない

271デフォルトの名無しさん (ワッチョイ 6e02-Bw3Y)2018/06/17(日) 18:30:46.42ID:IIkN4spK0
iostreamを今、作り直すとしたらfilesystemやstring_viewも視野に入れなきゃね

272デフォルトの名無しさん (ワッチョイ edb6-5g47)2018/06/17(日) 18:54:25.32ID:ipfkqsZ+0
ビジネスで優秀な人材育成する上司は何を教えているのか?
https://www.youtube.com/watch?v=apxtSqxjw08&t=13s
美容師の楽しさ再発見!やる気スイッチが入る働き方セミナー
https://www.youtube.com/watch?v=DGzXQT799oY
マクドナルド伝説の店長が教える、最強店長になるために必要なこと
https://www.youtube.com/watch?v=0wMbR7JIeeQ&t=3154s
『上司が伝えるべき 一番大切なこと』
https://www.youtube.com/watch?v=xsfJ-ZC42pQ&t=1199s

273デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 19:38:39.93ID:GftzeAnS0
C++でよく使われる各オブジェクトのスタックサイズは以下の通り。
stringstreamとfstreamのサイズは無視できない大きさであることがわかるだろう。

・GCC - ubuntu Linux x64
 (sizeof(std::stringstream), sizeof(std::fstream), sizeof(std::ostream), sizeof(std::string), sizeof(std::vector<std::string>), sizeof(FILE))=(392, 528, 272, 32, 24, 216)

・Visual Studio 2017 - Windows10 x64
 (sizeof(std::stringstream), sizeof(std::fstream), sizeof(std::ostream), sizeof(std::string), sizeof(std::vector<std::string>), sizeof(FILE))=(248, 280, 112, 32, 24, 8)

274デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 19:51:08.65ID:JVUiE6fQ0
>>273
数百バイト程度は許容できるんじゃないの。
コンテナに入れるわけでもないし。

275デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 19:53:22.73ID:JVUiE6fQ0
>>268
ないよ。

276デフォルトの名無しさん2018/06/17(日) 19:54:46.50
直近のスレを見れば分かるとおり、C++は複雑怪奇魑魅魍魎だから
プログラミング初学者が手を出したらヤケドしかしない

277デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 20:02:30.99ID:GftzeAnS0
勉強でヤケドする分には問題ないし、
むしろ沢山ヤケドして危険を避ける能力を身に着けるしかない。
実務でやったらアウトだが。

278デフォルトの名無しさん (ワッチョイ 469f-cPc7)2018/06/17(日) 20:41:28.94ID:dJUJdMR30
iostream 文句言われてるけど、atomic に動作するところは thread 並列環境では
そこそこ良いのでは?もちろんその分遅さが気になる場面もあるけど。

279デフォルトの名無しさん (ワッチョイ 6e02-Bw3Y)2018/06/17(日) 21:07:46.84ID:IIkN4spK0
iostreamは速度を全く期待せずに使うという
C++らしからぬ面を持ったものだ
sync_with_stdio? はははは

280デフォルトの名無しさん (ブーイモ MM62-Z/ei)2018/06/17(日) 21:11:08.16ID:kJQS2F0bM
国際化に向かないのが致命的。
これだけで捨てる理由としては十分と思う。

281放置された蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd62-+ixL)2018/06/17(日) 21:48:20.12ID:ETBxv0Nyd
MSVCのstd::arrayがC++11に準拠してくれればいいのに。使えねー。
言語レベルで区間チェックしてくれたら、データ破壊の場所がすぐにわかるのに。

282デフォルトの名無しさん (ブーイモ MM62-hu3a)2018/06/17(日) 21:52:06.00ID:PyYPwpSkM
スタティックライブラリAが別のスタティックライブラリBのAPIを使っている場合、ライブラリAにライブラリBをリンク、ビルドして、結果できたライブラリAだけをリンクして、実行ファイルを作る形式が良いでしょうか。
それともラリブラリA、ライブラリBを別々にリンク、ビルドして実行ファイルを作る形式が良いでしょうか。

283 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/17(日) 21:54:39.50ID:mtjEdwIk0
>>282
>ライブラリAにライブラリBをリンク、ビルドして、結果できたライブラリ
そんなことができるのでしょうか?

284デフォルトの名無しさん (ワッチョイ 469b-OQnn)2018/06/17(日) 21:55:46.98ID:MR0PdhT00
後者しかできないような気がするんだけど

285デフォルトの名無しさん (ブーイモ MM62-Z/ei)2018/06/17(日) 21:57:07.16ID:kJQS2F0bM
>>281
msvcのat()関数は範囲チェックしないの?

>>285
するけど、多数に生配列があって困難

287はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-Bw3Y)2018/06/18(月) 00:02:38.25ID:CYJOSJS20
iostream の替わりになるようなデファクトスタンダードが登場していない以上、
ほどほどに付き合っていくしか仕方がないよ。

C スタイルは普段から使うには抽象度が低くて面倒くさい。
printf は std::string を表示するのにさえいちいち c_str を通さなきゃならんのだからな。
書式指定との整合が型システムで保証されないのも古い設計だし。
処理系の方である程度は特別扱いすることで折り合いがついてるけど、
あらためて考えるとだいぶん不格好だと思う。

コンセプトやら何やらが導入されたらもうちょっとマシな入出力ライブラリが出来たりしないもんかね?
提案くらいは出てたりしない? って思ったけど、こないだ江添っちがTwitterで「無い」って言ってた気がする。

現実的にはxmlなど標準的な形式のファイルを扱うライブラリを使うんで本当に低レベルなIOはどっちでもいい

289273 (ワッチョイ 45d2-Bw3Y)2018/06/18(月) 06:12:18.90ID:q6319o4n0
>>274
iostreamは肝心な時に使えない橙武者です。

ログ出力するクラスは歌舞伎の黒衣のような慎ましい存在でなければならないのですが、
iostreamはあたかも歌舞伎の花形役者のようなオレ様的存在感を出すので好ましくありません。

実例をあげるならば障害発生した時に、ログ用途でiostream系を使うことがあり得えます。
cout やその他インスタンスが生成されてスタックを多く使うことになります。
つまり、実運用環境とログ埋込環境でメモリ構成が大きく異なる環境になってしまうことが避けられません。
iostreamはマルチスレッド環境など対話デバッグでは追跡しにくい現象をログ出力するのに適さない、と断言できます。

橙武者、黒衣など語の意味が分からない方は、ご自身でおググり下さい。

290デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/18(月) 08:25:55.66ID:Tb7Gp3zL0
io_contextで世界が変わる。

291デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/18(月) 08:29:09.26ID:Tb7Gp3zL0
coutってアクセスするたびに生成するわけじゃないよね?

292デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/18(月) 08:34:19.02ID:Tb7Gp3zL0
ツリートラバースするのに、再帰使うよりstd::deque使ったスタックのほうが速いな。

293デフォルトの名無しさん (ブーイモ MMb6-pMQN)2018/06/18(月) 08:36:26.28ID:h2dlgwUxM
>>291
グローバルオブジェクトとしてずっと存在してる

294デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/18(月) 08:54:52.73ID:trIDsSoy0
内緒ですけどね。書式設定はprintfのほうがソースが見やすいですよ。

295デフォルトの名無しさん (ワッチョイ 8281-Bw3Y)2018/06/18(月) 10:18:21.92ID:wfZWFdrV0
内緒な、約束だぞ

296デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/18(月) 11:02:34.48ID:q6319o4n0
「標準出力への書き込みは遅いから」との理由で、メモリ上にログをため込むことは多いかと思います。
iostream系だと stringstreamを使うことになりますがスタックサイズが割と大きくインスタンス生成のたびに時間もかかります。

さらにいえば、MSVCの場合、snprintf()に比べてstringstreamは書き込みに3倍弱時間がかかります。
本来ならば << 演算子はコンパイル時に型が決まるので書き込みが高速なはずなのですが、
MSVCだとstringstreamがsnprintf()に負ける有様ということです。
なお、Linux GCCの場合、snprintf()とstringstreamは書き込み速度の差は少ないようです。

297デフォルトの名無しさん (スップ Sd62-EDgZ)2018/06/18(月) 15:29:29.80ID:jTAI4T/jd
C++を完全に理解したんだけど、質問ある?

298デフォルトの名無しさん (スップ Sdc2-Gye4)2018/06/18(月) 16:23:01.82ID:sXmIUJTyd
CとC++で演算子の優先順位が異なる所があります
どこてしょう
もちろん両方に存在するものです

299デフォルトの名無しさん (ワッチョイ 4193-a7dz)2018/06/18(月) 17:54:25.08ID:JbXTSK+P0
>>298 の問題は面白いし俺も答えに興味あるけど >>297 への挑戦とすれば
「C++は完全に理解したけどCの方は知らないよ」で逃げられるかと。

300デフォルトの名無しさん (ワッチョイ ddc3-hrcC)2018/06/18(月) 18:01:10.79ID:b7nHR37f0
C++の規格はCの規格を参照してるし、Cとの差異も規格の一部になってるので
C++の完全な理解の中に当然含まれる

301デフォルトの名無しさん (ワッチョイ 4223-PZZX)2018/06/18(月) 18:31:36.77ID:xdRdwSco0
アホなので優先順位の違いはわからないけど、
if ((v=f()) == 0) を if ((v=f()) = 0) とタイポしたとき
c++ だとエラーにならず v が 0 になるのは嫌な感じ

302デフォルトの名無しさん (ワッチョイ c212-bAWz)2018/06/18(月) 21:04:40.33ID:0cjK0izC0
if ( 0.equals(v=f()) )

こう書ければいい

303デフォルトの名無しさん (ワッチョイ c27c-TqnL)2018/06/18(月) 21:06:09.32ID:wRZSUlvR0
Cでは代入式はその結果値が左辺値にはならないから v = 1 = 2 みたいな表現は通らない
C++では左辺値になるので通る

304デフォルトの名無しさん (ワッチョイ 469b-OQnn)2018/06/18(月) 21:21:29.41ID:Y3dlvOm10
昔定数を先に書くことで防げるって聞いたことがあるが
0=(v=f())

305デフォルトの名無しさん (ワッチョイ 4223-PZZX)2018/06/18(月) 21:25:53.85ID:xdRdwSco0
昔からこういう==での判定は
if (S_OK == (result = someApi()) {...}
と定数左で書けという作法もあるけど、
流行らないのは見た目が実行順と逆みたいで妙だからかねえ

〇〇=0 はあるけど 0=〇〇 は違和感しかないからなぁ
バッドノウハウの筆頭だと思う

307デフォルトの名無しさん (スップ Sdc2-PZZX)2018/06/18(月) 22:33:03.40ID:ejyTxCd5d
数学でも 0 = x^2 + 3x - 2 とかあまり書かないな

308デフォルトの名無しさん (ワッチョイ 469f-cPc7)2018/06/18(月) 23:04:23.94ID:wJzzPYpc0
まあそんなクソな書き方するくらいならテストコード書けやって話にはなるわな。

309デフォルトの名無しさん (ワッチョイ 929e-PCgz)2018/06/19(火) 00:49:41.47ID:kQ8CSRFN0
>>304-305
それいつの話だ馬鹿野郎
俺が新兵の頃には、そんなコード書いたら教官からブン殴られてたぞ!!

310デフォルトの名無しさん (ワッチョイ ad2d-QRh3)2018/06/19(火) 00:56:21.64ID:jJOU+tvI0
バッドノウハウ……かなぁ…?
定数を左に書く利点は テストより手軽にコンパイルエラーで止められる事だから
個人的には採用してるんだけど

int i = 0;

/* 想定した挙動 */
if ((i = 0) == 0) { printf("%i\n", i); } /* 定数 右: 出力 "0" */
if (0 == (i = 0)) { printf("%i\n", i); } /* 定数 左: 出力 "0" */

/* typo! == -> = */
if ((i = 0) = 0) { printf("%i\n", i); } /* !!! printfが実行されない! (Cでは通らない) */
if (0 = (i = 0)) { printf("%i\n", i); } /* コンパイルが通ら*ない* 助かった! */

/* () 忘れ */
if ( i = 0 == 0) { printf("%i\n", i); } /* !!! 出力 "1" (== (0 == 0) == true) 想定外! */
if (0 == i = 0 ) { printf("%i\n", i); } /* コンパイルが通ら*ない* 助かった! */

そもそも1文字の打ち間違いなんて テストコードの記述そのものでもやりかねないし
(「絶対に間違えない!」なんていう人がいたらコードどころか作文も書いたことない奴ですぜ)

まあ使用が推奨/禁止されてるかはチームに従うとして
ぱっと見で意図が解るようにはしておくとよいかと

311デフォルトの名無しさん (ワッチョイ 929e-PCgz)2018/06/19(火) 01:23:19.66ID:kQ8CSRFN0
>>310
そういうのはもはや統合開発環境の仕事なのだよ。

ていうか if の中で代入を書くとか真正のキチガイ。
有 り 得 な い

312303 (ワッチョイ c27c-TqnL)2018/06/19(火) 01:34:04.88ID:6qgw6hGx0
すまんかった >>303 は "v = 1 = 2 みたいな" ではなくて "(v = 1) = 2 みたいな"
括弧忘れたら結合順が変わってしまう 訂正

313デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 03:10:51.39ID:WKXXm+ar0
統合開発環境ってEmacsのことだっけ。

314デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/19(火) 05:39:20.97ID:1GZ30pc10
EmacsのせいでUNIXはDOSに負けたんだっけ。

315デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 05:50:29.80ID:WKXXm+ar0
単体テスト書くと処理時間出るから、何に時間かかってるのかわかっていいよね。

316デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 05:52:35.58ID:WKXXm+ar0
やはり一番時間がかかるのはIOだから、IO少なくするのが一番よさそう。
std::vectorなんか全体コピーしても余裕の速さだから気にする必要なかったんや。

317デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/19(火) 06:19:41.06ID:1GZ30pc10
楽な仕事で羨ましい限りです。

318デフォルトの名無しさん (ワッチョイ 6e5b-Bw3Y)2018/06/19(火) 06:25:19.55ID:QGodAC8c0
IゾーンとOゾーンに時間をかけるのは楽しいじゃん

>>310
まさか真顔で言ってないよね?

320デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/19(火) 09:20:33.15ID:1GZ30pc10
>>319
まじかよ。おまえ真顔じゃないか。

321デフォルトの名無しさん (スップ Sd62-Gye4)2018/06/19(火) 10:45:51.92ID:x0u1iMAyd
世の中いろんなコーディングルールがある

ifの中は副作用のあるコード禁止とか
goto禁止とか
3項演算子禁止とか
1個の関数は○○行以内とか
変数名は○○文字以内とか

実際に業務で書かない人が決めたりするからたちが悪い

322はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-Bw3Y)2018/06/19(火) 11:00:52.67ID:2U1bfNZa0
if の条件式の中で代入することは勧められない書き方だと思うけど、
「言語仕様に照らして完全に正しいけど間違いやすい書き方」にいちいち警告を出されるとうんざりする。
オプションで強めのチェックにしたときならともかく、デフォルトでだぞ。

かといって個別に警告の有効・無効のオプションを書くのも面倒くさいしなぁ。

323デフォルトの名無しさん (ブーイモ MM6d-nvpi)2018/06/19(火) 14:29:42.98ID:mTWnJSOLM
俺も定数との比較なら
if ( 0 == buf )
って定数を左に書くようにしてる
理由は>>310と同じ意図しない代入防止

324デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 15:21:42.83ID:eYArWI+v0
テスト書けば防げるよ。

325デフォルトの名無しさん2018/06/19(火) 17:52:06.99
自動的に静的チェックツールかけとけば教えてくれるよ

326デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/19(火) 18:32:24.93ID:QaAZlBtz0
関数の戻り値を保存した一時変数を使わなかっただけで警告出されるのは地味につらい。かといって警告を抑止するのも悩ましい。
以下のような感じ。

void test()
{
int foo = bar();
return;
}

327デフォルトの名無しさん (ワッチョイ 4104-PCgz)2018/06/19(火) 18:38:40.93ID:+lctr4fi0
コメントアウトしておくべし

328デフォルトの名無しさん (ワッチョイ 4104-PCgz)2018/06/19(火) 18:41:58.17ID:+lctr4fi0
じゃなくて・・・、BARのreturnにブレークポイントだ。
VSのばあいだけど。
そんな出口の多い構造で大丈夫か。

329デフォルトの名無しさん (ワッチョイ 067f-s84n)2018/06/19(火) 19:08:38.86ID:SpwZyN6M0
よくわからんのだが使わんものをなんで残しとくのん?

>>326
戻り値ありということは普通は副作用なく作るだろ
その戻り値を無視したら計算資源だけ使って何もしないってことだよ
なんのためのコードなのそれ?

331デフォルトの名無しさん (ワッチョイ ad8a-pk7F)2018/06/19(火) 19:42:43.55ID:B+3+LOal0
副作用の試験モジュール

332デフォルトの名無しさん (ワッチョイ 4223-PZZX)2018/06/19(火) 20:12:16.04ID:j1n9w5rn0
副作用ありの関数で成功失敗その他を戻り値で返すのはごく普通にあることでは。

333デフォルトの名無しさん (ワッチョイ 4150-Gye4)2018/06/19(火) 20:16:56.98ID:1co3DhsP0
だな

334デフォルトの名無しさん (ワッチョイ 4150-Gye4)2018/06/19(火) 20:18:42.19ID:1co3DhsP0
>>328
barのソースが無いのかも

335デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/19(火) 20:25:15.24ID:QaAZlBtz0
このスレは、「風邪をひいたんだがどうしたらいい?」との相談に「風邪をひくな」と真顔で回答する良スレですね。

336デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/19(火) 20:51:33.23ID:QaAZlBtz0
相談する時は、「なんでそんなところ行ったんだ」などと“そもそも論”を始めて責任所在の確定に情熱を傾ける後ろ向きで生産性ゼロの人に相談することは避けなければならない。
これが私の設問の真意。以下が回答。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\ItemTemplates\VC\Windows Store\1041\BasicPage\BasicPage.xaml.cpp:97
(void) sender; // 未使用のパラメーター

337デフォルトの名無しさん (ワッチョイ 6e5b-Bw3Y)2018/06/19(火) 21:00:15.56ID:QGodAC8c0
>>321
同感

338デフォルトの名無しさん (スップ Sdc2-Gye4)2018/06/19(火) 21:00:53.62ID:EaS+ZlKPd
Visual Studioなら不要な警告を非表示に出来るだろ

339 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/19(火) 21:02:21.72ID:ZV1HIBvv0
>>324
if (buf = 0) {
}
を検出するためのテストってどんなものですか?

340326 (ワッチョイ 45d2-Bw3Y)2018/06/19(火) 21:03:09.63ID:QaAZlBtz0
補足すると、マクロ定義によって戻り値が使われなくなることがある場合の警告を想定。
>>336 であげた BasicPage.xaml.cppの事例は厳密には関数の仮引数を使わない場合の警告なので若干違うが、対処法は同じ。

#define OUTPUT(x)

void test()
{
int foo = bar();
OUTPUT(foo);
(void)foo;
return;
}

341デフォルトの名無しさん (スップ Sdc2-Gye4)2018/06/19(火) 21:04:45.12ID:EaS+ZlKPd
性的解析ツールだな

342デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 21:12:21.11ID:eYArWI+v0
>>339
そのコードにエフェクトがあるならテストできるのではないでしょうか。

343デフォルトの名無しさん2018/06/19(火) 21:18:56.08
>>339
そういうのはコンパイル時にWarning出るから本線にマージする前には見つかるでしょ

344デフォルトの名無しさん (ワッチョイ 8281-Bw3Y)2018/06/19(火) 21:20:27.84ID:r5hOFOzd0
変数で戻り値を受けとって使わないって言うのは確かに変だが
戻り値がある関数の戻り値を受けとらないって言うのは問題無いのか?

345 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/19(火) 21:25:30.71ID:ZV1HIBvv0
>>342
>>339 に対する具体的なテストの方法を示してください

346デフォルトの名無しさん (ワッチョイ 42b3-SMjQ)2018/06/19(火) 21:29:13.02ID:bLc4VOsi0
>>345
それ単体テストやればカバレージ100%にならないから容易に検出できるだろ

347デフォルトの名無しさん (ワッチョイ 067f-s84n)2018/06/19(火) 21:38:33.29ID:SpwZyN6M0
>>340
最初に書いとけよタコが
お前の想定など知るか

348デフォルトの名無しさん (ワッチョイ 4223-PZZX)2018/06/19(火) 21:42:40.31ID:j1n9w5rn0
>>339
if (buf = 0) { A }

・buf がゼロの時 A が実行されないと実行結果(出力など)が正しい結果にならない場合
・bufが非ゼロでここでゼロにされると以下同文

この2つの場合は結果がおかしいからテストで見つかる。
結果は正しいが見つけにくいリークが発生するとか
ここ間違えても結果は(常にではないが)多くの場合正しい
とかだと静的/動的カバレッジで見るしかないね。

349デフォルトの名無しさん (スップ Sdc2-Gye4)2018/06/19(火) 21:43:57.04ID:EaS+ZlKPd
俺の中のうざい警告

使わない引数、変数、関数の警告
セキュリティ関連
演算にカッコを付けろという警告

350デフォルトの名無しさん2018/06/19(火) 21:50:59.42
非適合コード: a = a + b + c;
適合コード: a = ( a + b ) + c;

351デフォルトの名無しさん (ワッチョイ 4223-PZZX)2018/06/19(火) 21:52:07.12ID:j1n9w5rn0
>>349
>演算にカッコを付けろという警告

メンテしてるアプリのソース内のMD5だか sha だかのコード(問題なく動作中)で
「&とシフトの優先順位わかってんのか?括弧つけたら?」の警告が出るが、
&とシフトの優先順位など知る気もないし書き換えるとバグる気しかしないので放置している。

352デフォルトの名無しさん (ワッチョイ ddc3-hrcC)2018/06/19(火) 23:06:43.31ID:j3AUln/x0
セキュリティ警告無視する人とは仕事したくない

353デフォルトの名無しさん (ワッチョイ 42eb-m0US)2018/06/19(火) 23:42:48.11ID:Ac6XacCG0
質問です
std::unique_ptrはデストラクタで保持するリソースの解放処理を行うので、自明なデストラクタを持つことが出来ず、リテラル型になることが出来ないと思うのですが
デフォルトコンストラクタとnullptrを受けるコンストラクタはconstexpr指定されています、このconstexprにはどういう意味があるのでしょうか?

354デフォルトの名無しさん (スップ Sd62-PZZX)2018/06/20(水) 00:16:23.94ID:ai7I58Bid
>>353
https://stackoverflow.com/questions/30766103/why-declare-constrexpr-constructors-for-classes-with-non-trivial-destructors-e/30766445#30766445
によれば
constexpr でないコンストラクタよりも先に(恐らくはコンパイル時に静的に)初期化されるので、

例えばグローバル変数
foo apple;
unique_prt<T> orange;

とあるとき
初期化順を気にせず apple のコンストラクターの中で orange を使用することが出来る。

355デフォルトの名無しさん (ワッチョイ 42eb-m0US)2018/06/20(水) 01:00:54.85ID:PR6OT2JV0
>>354
リテラル型とまではいかないにしてもコンパイル時に初期化してくれるんですか、なるほど
ありがとうございます

356デフォルトの名無しさん (ワッチョイ ff9d-E6HK)2018/06/21(木) 04:41:53.49ID:G2MjnjmO0
Scopeのついた#defineのような書き方ってないのでしょうか?
たとえば Uart0.baud 115200を変数としてしてじゃなくてDefineで保持しておきたい
場合にScopeを整理しておきたい。

357デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/21(木) 07:10:33.64ID:Grok3vuS0
template<int baud> class Uart0 {

358デフォルトの名無しさん (アウアウカー Sa93-tQU5)2018/06/21(木) 08:23:50.96ID:iolQTPDna
>>356
C++では#defineではなくconstを使うと習いました

359デフォルトの名無しさん (ブーイモ MM0f-aHC/)2018/06/21(木) 08:30:36.61ID:L/t8iXOTM
先生!プリプロセッサで完結する処理もconstを使うのですか?

360デフォルトの名無しさん (ワッチョイ ff9d-E6HK)2018/06/21(木) 08:52:37.07ID:G2MjnjmO0
Constはラムに配置されますからダメですよ。
それからTemplateは型を変数にしたい場合につかえるだけです。Scopeのついた
定数がないとすると、、、、、なんか使いにくいですね。

361デフォルトの名無しさん (ワッチョイ 1f23-WzrY)2018/06/21(木) 09:17:30.93ID:lqJXL95H0
enum
static const

362デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/21(木) 10:14:08.56ID:Grok3vuS0
名前空間 にconst定数を閉じ込めて、スコープ内で using namespace xxx; を宣言して名前空間を明示せずに定数にアクセス。

363デフォルトの名無しさん (ワッチョイ 9f83-DJU/)2018/06/21(木) 10:38:55.31ID:7g4G/GMb0
defineをconstに書き換えるぐらいなら別の言語使いますよね。

364デフォルトの名無しさん (ワッチョイ 1f7f-GwbS)2018/06/21(木) 10:43:19.88ID:1tnpfBql0
今どきdefine使ってる奴なんていたらクビだわ

365デフォルトの名無しさん (ワッチョイ 9f83-DJU/)2018/06/21(木) 10:55:24.84ID:7g4G/GMb0
クビにできる立場の人がソースコードチェックしてる会社なんですね。労組がないとかただの派遣屋ですね^^

366デフォルトの名無しさん (スップ Sd9f-WzrY)2018/06/21(木) 11:52:28.73ID:pthrcCRVd
整数に関しては遥か昔から enum がスコープ付き定数として使われてただろ

367デフォルトの名無しさん (ブーイモ MM9f-yRyg)2018/06/21(木) 12:34:10.47ID:Oz+pq3ApM
>>360
組み込み向けとかでROM実行になっていなければ、どちらもRAMに配置されると思うよ。
もしもコンパイル時解決するかどうかということであれば、constでもちゃんとコンパイル時解決されるし、式(含関数)の場合はconstexprキーワードを使えばコンパイル時解決(可能なら)される。
あと、templateは型だけでなく定数も置けるよ。

368デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/21(木) 12:49:18.77ID:m6fyxFJ7d
考えるべきなのは2つ

コードの即値として使われるのか
値がある番地にマッピングされるのか
その都度関数コールで解決するのか



マッピングされる場合、どのセクションにマッピングされるのか

369デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/21(木) 13:52:00.91ID:Grok3vuS0
const定数は ヘッダーファイルで宣言するだけではダメでソースファイルでconst定数の実体を初期化しなければならないので、defineより使い勝手が悪い面もある。
最新のC/C++だとその辺どうなってんの?

370デフォルトの名無しさん (ワッチョイ 9f83-DJU/)2018/06/21(木) 13:56:06.62ID:7g4G/GMb0
処理系依存させずソースレベルで終わらしたい。

371デフォルトの名無しさん (ワッチョイ 7f23-WzrY)2018/06/21(木) 13:59:26.98ID:S4IxNo+10
>>369
メンバ変数でも数値ならソース側に定義要らないから
struct SimpleMath {
const static int pi = 3;
};
でいい

実体がたくさんできるのを苦にしなければ
namespace n {
const static int pi=3;
};
でもいいし

372デフォルトの名無しさん (ワッチョイ 7f23-WzrY)2018/06/21(木) 14:03:31.13ID:S4IxNo+10
>>369
関連してついでに言うとよほど古いコンパイラじゃなければ

struct T {
int k=0;
};

というメンバ変数の初期化の書き方もできて
複数のコンストラクタがあるときとか楽できるよ

373デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/21(木) 14:33:40.53ID:m6fyxFJ7d
>>371
ゆとり乙

374デフォルトの名無しさん (スップ Sd9f-RZ3s)2018/06/21(木) 15:05:26.80ID:JKhrQo7xd
>>326
(void)bar()

375デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/21(木) 15:15:08.56ID:m6fyxFJ7d

376デフォルトの名無しさん (ワッチョイ 7f34-MNXm)2018/06/21(木) 16:24:46.01ID:n4WYHGZ/0
実体が沢山出来るとか馬鹿かテメーは
それが事実ならリンク時にエラー大量発生しとるわ

377デフォルトの名無しさん (ワッチョイ 7f23-WzrY)2018/06/21(木) 16:39:35.71ID:S4IxNo+10
>>376
人をバカにしたい意識が強すぎるから static 変数は
外部リンケージを持たないなんて基本も忘れるんだよ。

378デフォルトの名無しさん (ワッチョイ 7f23-WzrY)2018/06/21(木) 16:40:51.05ID:S4IxNo+10
ほら試してやったぞ
アドレスが違うから2個あるのがわかるだろ?

MacBook-Pro:tmp$ cat a.h
namespace a {
static const int b = 8;
};

MacBook-Pro:tmp$ cat a0.cpp
#include <cstdio>
#include "a.h"
extern void foo();
int main() {
foo();
printf("main %lx\n", (long) &a::b);
}

MacBook-Pro:tmp$ cat a1.cpp
#include <cstdio>
#include "a.h"
void foo() {
printf("foo %lx\n", (long) &a::b);
}

MacBook-Pro:tmp$ c++ a0.cpp a1.cpp
MacBook-Pro:tmp$ ./a.out
foo 10925bfb0
main 10925bfac

379デフォルトの名無しさん (ワッチョイ 9f83-DJU/)2018/06/21(木) 16:46:33.44ID:7g4G/GMb0
マカーのくせにC++使ってんじゃねぇ。

380デフォルトの名無しさん (ワッチョイ 7f23-WzrY)2018/06/21(木) 16:50:45.19ID:S4IxNo+10
ソース中で(アドレスは使われず)値しか用いられなければ実体が全く作られない可能性もあるが
オブジェクトファイル見なきゃ確認できなくて面倒だからそれは略

381はちみつ餃子 ◆8X2XSCHEME (ワッチョイ ff6f-GwbS)2018/06/21(木) 16:58:48.07ID:kxxiYbMo0
クラステンプレートにしておけば (そして型引数が同じであれば) リンクのときにインスタンスが統合されるので、それを利用できるかもね。

382デフォルトの名無しさん (ワッチョイ 7f23-WzrY)2018/06/21(木) 17:00:11.80ID:S4IxNo+10
>>381
クラス使うなら普通に>>371の上の方で良いかと思う

383デフォルトの名無しさん (ワッチョイ 7f34-MNXm)2018/06/21(木) 17:07:19.43ID:n4WYHGZ/0
>>377
だからよう、なんでstatic付ける必要あるんだよ
付けなければ実体一つで済むだろ馬鹿かテメーは

384デフォルトの名無しさん (ワッチョイ 7f23-WzrY)2018/06/21(木) 17:27:13.58ID:S4IxNo+10
>>383
付けなかったらリンクエラー出るだろ

こういうとお前はバカだからヘッダーでは extern しておいて
どっかのソースに1つ実体を書けとか言い出すんだろうけど、
もともと>>371>>369の「ヘッダーだけで済ませたい」への返事だからな。

まだ他に言いたいことがあるなら日記に書け

385デフォルトの名無しさん (ワッチョイ 7f34-MNXm)2018/06/21(木) 17:36:33.91ID:n4WYHGZ/0
>>384
出ねぇよ馬鹿かテメーは変数と扱い違ぇんだよ

386デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/21(木) 17:49:19.83ID:m6fyxFJ7d
#defineが一番確実
最適化も一番期待できるしCとの互換性も保てる
ってことでいまだに#defineは使う
スコープ問題は昔ながらのプレフィックスで解決

小さな組み込みマイコンだと
C++でもこんな感じ

387デフォルトの名無しさん (ワッチョイ 9fc3-loLi)2018/06/21(木) 17:54:20.05ID:z6qVeoOj0
と、クソ雑魚老害がさえずってます
せめてenumにしろよ雑魚

388デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)2018/06/21(木) 17:54:46.47ID:RX0X5VqW0
フリースタンディング環境の話をこっそり忍ばせてくる技の名前なんだったっけ。

389デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/21(木) 18:03:41.90ID:m6fyxFJ7d
逆に値を変えても1バイトしか変わって欲しくないときや
1バイトを無理やり変えると動作が正しく変わってほしいとき
は番地に割り当てられるようにする

PCプログラムしか書いたことがない人は気にしたことも無いだろうけど

390デフォルトの名無しさん (ワッチョイ 1f50-ddCb)2018/06/21(木) 18:09:49.54ID:Mgrb3Kbk0
#defineアレルギー
gotoアレルギー
printfアレルギー

この板には多い

391デフォルトの名無しさん (ワッチョイ 7f81-GwbS)2018/06/21(木) 18:59:05.50ID:bCLvNhPr0
mainと言う文字列見ると、猛烈に指先がかゆくなる

WinMain

393デフォルトの名無しさん (ワッチョイ 9fc3-loLi)2018/06/21(木) 20:50:48.63ID:z6qVeoOj0
_tmain

394デフォルトの名無しさん (ワッチョイ 9f83-DJU/)2018/06/21(木) 23:04:20.73ID:7g4G/GMb0
もはやドライバ書くときしかC++使わないし、最近のC++機能は全部いらね
老害とか言ってる奴の用途なんて元々、JavaやC#で十分だろ

内容あまり理解してないがconstexprは論外なのか

396デフォルトの名無しさん (ワッチョイ 7f34-MNXm)2018/06/22(金) 00:24:42.97ID:JUnpVDzH0
定数意外の計算(変数なんかが含まれる)とコンパイルエラーになる。

397デフォルトの名無しさん (ワッチョイ 7f34-MNXm)2018/06/22(金) 00:28:24.33ID:JUnpVDzH0
constexprは関数が返す内容が定数であることを保証する
コンパイル時はインラインでその関数を走らせて順次定数に置き換えてコンパイルが行われるということだ

398デフォルトの名無しさん (ワッチョイ ff9b-QY3V)2018/06/22(金) 00:31:25.00ID:/HdPI0MA0
コンパイル時定数ということですよな

constexprは変数も定義可能だから今回の内容なら名前空間にconstexpr変数を定義すればokかなと思ってたり...

400デフォルトの名無しさん (ワッチョイ 7f34-MNXm)2018/06/22(金) 00:34:25.67ID:JUnpVDzH0
まあそういうこったな
どんだけ糞長い関数書こうとその関数を呼び出した時点で定数に置換されてコンパイルされる

401デフォルトの名無しさん (ワッチョイ 9fbd-iJxt)2018/06/22(金) 00:47:02.44ID:bQfSOVA40
>>396
それc++11

402デフォルトの名無しさん (ワッチョイ 1f50-ddCb)2018/06/22(金) 01:46:46.25ID:Hssdw/9K0
constexprだけど計算にとても時間がかかる場合はどうなるんだろう

延々とコンパイルが終わらないとかエラーになるとか勝手に実行時解決になるとか?

403デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)2018/06/22(金) 03:26:28.59ID:0qBHNE4T0
constexprで学習した結果のみ実行時に用いるAI。

404デフォルトの名無しさん (ワッチョイ ff9d-E6HK)2018/06/22(金) 03:36:59.17ID:1CqwlerO0
結論が出たようなのでまとめる
1.#defineは欠点が多い。スコープが効かないのでC++では基本的に使わないこと。
2.代わりにconstexprを使う。constexprは、汎用的に定数式を表現するための機能である。
constexprは、「constant expression (定数式)」の略語である。

例1
#define BIT(n) (1<<n)
これは汎用性が高いので書き換える必要はないようにも思えるが、正しくは
constexpr int BIT(int n){ return 1 << n; }
このように書かなければならない。

例2
#define UART_A0_baud (115200)
#define UART_A0_stop (1)
#define UART_A0_bit (8)
#define UART_A0_parity (0)
#define UART_A1_baud (9600)
#define UART_A1_stop (2)
#define UART_A1_bit (8)
#define UART_A1_parity (1)
これをconstexpr を使って綺麗に書いてみよう。任せる。

405デフォルトの名無しさん (ワッチョイ 7fe9-RUNk)2018/06/22(金) 03:50:55.40ID:2mqIozuo0
C++書けるやつはかっこいいな-
ただ俺が書こうとしてないだけだけど

406デフォルトの名無しさん (ワッチョイ 9f83-DJU/)2018/06/22(金) 04:53:39.22ID:6eBOmsiI0
>>404
お断り致します。

407いちるいなんがずっとだしおっかけてついてくるし (ワッチョイ 1f76-lC4z)2018/06/22(金) 06:11:32.65ID:kyYAMp480
でふぁいん てんてきのしんにゅう がちょくじゃないから あんしんするじゃないかな


めいんすとりーとからいっぽんはいったほうが

408デフォルトの名無しさん (ワッチョイ 1f76-lC4z)2018/06/22(金) 06:13:05.67ID:kyYAMp480


409デフォルトの名無しさん (ワッチョイ 1f76-lC4z)2018/06/22(金) 06:15:15.42ID:kyYAMp480
カチグミニチカイホウガアブナイヨネここはあんぜんしゅうだんすとーかーにとっては

てんごく あんじゅうのち

410デフォルトの名無しさん (アウアウウー Sae3-E6HK)2018/06/22(金) 06:44:34.82ID:1fAWv7Tna

411デフォルトの名無しさん (ブーイモ MM0f-mx2r)2018/06/22(金) 07:48:57.63ID:jUqm4dE5M
>>402
constexprはコンパイル時評価可能(評価するとは言っていない)なのでコンパイラ依存。
コンパイル時間が伸びるのが大半だろうけど。

412デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/22(金) 08:37:19.28ID:PS4w2oBw0
>>410
テンプレートクラスを使った変態バージョンを作ってみたわ
https://ideone.com/6i6un3

413デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/22(金) 08:58:31.90ID:bJNd9Nrpd
>>411
確実にコンパイル時に解決されてるためには
別プログラムで計算して即値を#defineがベストって事だな

414デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/22(金) 09:02:09.74ID:bJNd9Nrpd
>>411
「とても」ってのは例えば10年かかるとかそういうの
ある数学定数の計算とか固定データの暗号化を破るプログラムとか

適度にあきらめてくれないと
コンパイルが(事実上)出来なくなる

>>413 そこは即値をconstexprにしようぜ。

416デフォルトの名無しさん (ワッチョイ 9f8a-1M3p)2018/06/22(金) 11:05:51.83ID:VkaCaqwn0
>>404
constexprならunsignedじゃなくても平気なのかな?

417デフォルトの名無しさん (ワッチョイ 7f23-eNWv)2018/06/22(金) 14:23:31.03ID:0acoPbmK0
>>385
リンカの挙動に付いては変数と扱いが違うせいじゃなくて
c++ では const 変数はデフォルトで static なくだけだよ

お前は正しい指摘をしている時でさえ必ず間違ったことを言う
このスレ読んでる人に嘘ついて喜んでる愉快犯か何かか

418デフォルトの名無しさん (スプッッ Sd1f-SNrP)2018/06/22(金) 14:25:48.43ID:oyBTubw6d
現代においてdefineを使う利点がゼロ

419デフォルトの名無しさん (ワッチョイ 7f34-MNXm)2018/06/22(金) 14:31:22.11ID:JUnpVDzH0
は?constをヘッダにstaticで定義しているバカが居たことに驚きなんだが
そりゃstaticで定義しまくったら実体増えるのは当たり前だろ
灯台下暗しでstatic記述するバカに気付かなかったわ
バカ過ぎて話にならんわw

420デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/22(金) 15:00:35.31ID:PS4w2oBw0
>>419
おっしゃることは確かにもっともなことですが、basic_string::npos についてはどう思われますか?

421デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/22(金) 15:42:10.39ID:PS4w2oBw0
なお、std::dec, std::hex なども static const。

422デフォルトの名無しさん (ワッチョイ 7f34-MNXm)2018/06/22(金) 16:52:29.77ID:JUnpVDzH0
クラス変数は統合されるから問題ない
ネームスペースやグローバルのヘッダに書くstatic constと違って

423デフォルトの名無しさん (ワッチョイ 7f7e-09r9)2018/06/22(金) 17:43:30.82ID:m8knQ0QO0
constexprをご存知でない人多すぎでは
入門書に1ページおきにこれを使えと書いてあるだろ

424デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)2018/06/22(金) 18:20:27.94ID:0qBHNE4T0
一行おきになってから考える。

425デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/22(金) 18:26:09.27ID:0px4TqJVd
>>418
アホ自慢?

>>423
入門書www
プロは知ってても、場合によって#defineを使う

426デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/22(金) 19:10:51.02ID:PS4w2oBw0
>>422
クラス変数に統合されるとなぜ問題ないのですか?
そもそも統合とはどういう状態でしょうか。
ネームスペースにstatic constを書くのとあまり違いはないように思うのですが、どう違うのか教えてもらえませんでしょうか。

427デフォルトの名無しさん (ワッチョイ ffeb-DJU/)2018/06/22(金) 19:55:42.32ID:lkE7eBJS0
static constexprにするかstatic inlineにするかテンプレートクラスに書けば実体はただ一つになると思う
普通に書いたら分裂しそう

cとの互換性を無視した場合のdefineの利点てあるのですか?

429デフォルトの名無しさん (ワッチョイ 7f7e-09r9)2018/06/22(金) 20:16:52.97ID:m8knQ0QO0
>>425
プロはinline変数を使う

430デフォルトの名無しさん (ワッチョイ 7f7e-09r9)2018/06/22(金) 20:18:39.50ID:m8knQ0QO0
>>428
ソースコードをプリプロセスしたいときに使う

431デフォルトの名無しさん (ワッチョイ ffeb-DJU/)2018/06/22(金) 21:16:15.28ID:lkE7eBJS0
>>428
Boost.Preprocessor

432デフォルトの名無しさん (ワッチョイ ff0d-GwbS)2018/06/22(金) 21:16:32.93ID:sLKAbUw90
   ___
  /彡彡))
  |彡( >
  ノノノ ヽ丿 <プロでござい
 / ̄ ̄ ̄\  n_
`/| _[]_ |/\ ( )
∧||バ| Y\ `/ /
\||カ| | \_/
(|  ̄ ̄ |
 |____|
 ||_|i|_||
 | ー|ー |

433 ◆QZaw55cn4c (ワッチョイ 7f60-DJU/)2018/06/22(金) 21:19:57.23ID:wcY3liAA0
>>429
かならずインラインになる保証はないのでは?

434デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/22(金) 22:04:30.10ID:PS4w2oBw0
>>421 を訂正。

std::dec, std::hex はマニピュレータなので定数じゃなかった。
定数なのは、std::ios_base::dec、std::ios_base::hex。

435デフォルトの名無しさん (ワッチョイ ff0d-GwbS)2018/06/22(金) 22:08:08.24ID:sLKAbUw90
マニピュレータは関数だぜ?

436デフォルトの名無しさん (ワッチョイ 7fd2-XQuB)2018/06/22(金) 23:02:52.73ID:tZy0W+/k0
まじめにデザインパターンを学習したくて書籍を探しているのですが、Javaで
説明しているものばかりで困っています。Javaは全く知りませんし、覚えるつ
もりもありません(自分にとっては不要な言語なので)。

C++でデザインパターンを開設している書籍を教えてください。

437デフォルトの名無しさん (ブーイモ MM0f-yRyg)2018/06/22(金) 23:09:45.00ID:UnfZkoNcM
>>436
gofっていうわりとデザパタに詳しい人も本出してるから探してみて。

438デフォルトの名無しさん (ワッチョイ 7f7e-09r9)2018/06/22(金) 23:40:54.94ID:m8knQ0QO0
サンプルがJavaで書いてあるかどうかって関係あるか?
デザパタの本ならJava特有のことはやってないはず
何をやっているのかを理解してそれをそのまま他の言語に当てはめればいい

439デフォルトの名無しさん (ワッチョイ ffeb-DJU/)2018/06/22(金) 23:42:29.99ID:lkE7eBJS0

440デフォルトの名無しさん (ワッチョイ 9f83-DJU/)2018/06/22(金) 23:44:18.08ID:6eBOmsiI0
C++は反則技が多すぎるので勉強しても無駄。
常に速度やメモリ効率を重視するための言語。

高級言語でOOしたいなら素直にJavaを使うべし。

441デフォルトの名無しさん (ワッチョイ 7fe9-RUNk)2018/06/22(金) 23:49:32.69ID:2mqIozuo0
反則技って言える位は覚えたい

442デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/22(金) 23:49:39.28ID:PS4w2oBw0
今日日、Java使うくらいならPythonを使うんじゃないの。

443デフォルトの名無しさん (ワッチョイ 7fe9-RUNk)2018/06/22(金) 23:50:46.45ID:2mqIozuo0
IDがPS4って凄いなw

444デフォルトの名無しさん (ワッチョイ 7f7e-09r9)2018/06/22(金) 23:59:07.23ID:m8knQ0QO0
JavaとPythonとC++って全部用途が違うじゃん
Javaと競合してるのはC#

新着レスの表示
レスを投稿する