X



C++相談室 part136
レス数が1000を超えています。これ以上書き込みはできません。
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
0003デフォルトの名無しさん (ワッチョイ 13cf-9TS0)2018/06/08(金) 01:28:54.52ID:P6Kg0b7q0
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

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

---- テンプレ ここまで ----
0004デフォルトの名無しさん2018/06/08(金) 02:27:58.00
C++解ると豪語していた人が後日茂みで戉だらけの死体で発見される例が後を絶ちません
C++解るは何か宗教的禁忌の呪詛なのだと思います
0010デフォルトの名無しさん (バッミングク MMb5-uWQQ)2018/06/09(土) 15:22:59.44ID:Ee9G7X6vM
c++11とか14とか17って何ですか?
0012デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/09(土) 16:23:33.39ID:HrZn4m/i0
C++完全に理解したわ。
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++オワコン?とか言い出してる雰囲気の中、
ああ、やっぱりあるのかという復活祭的なもんだったろ
0027デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/09(土) 20:19:57.28ID:MhKfyDgC0
>>25
C++にそれらがないのは、C++にはそれらが必要とされてないからだよ。
要するに全てはJavaScriptが糞すぎるから始まったことでしかない。
それがいいと思うのも自由だが。
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関数は書く必要がありません

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

編集上の都合でソースが汚れるとか、全く馬鹿な話だろ。
気づけよ。
0088a (ワッチョイ f36d-ExzQ)2018/06/10(日) 13:37:37.76ID:fJuBgtP70
http://somn9.xyz/4
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が有用である。
0113デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 15:28:05.51ID:CUftH0/Q0
>>111
> 例えば画像データみたいに巨大故に必要無い限りコピーしたくないんだけどそんな事情をライブラリ利用者から隠蔽したいケース
なるほど理解した。
ここでshared_ptrを渡して多数に見せかけ、実は中身は一つ、という話か。

となると、当然インミュータブルでないと話にならないわけだが、
逆に言えば、今時のインミュータブルな世界にはshared_ptrが大活躍する余地があるのか?
すぐにはピンと来ないが。
0114デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 15:33:13.30ID:pLs6h5jj0
>>113
△: 当然インミュータブルでないと話にならないわけだが、
○: 当然インミュータブルなインターフェースでないと話にならないわけだが、

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

で、内部ではshared_ptr(的な、「オブジェクト自身に開放タイミングを決めさせる」)ロジックが大活躍!!111!!!!1!
0115デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 15:33:15.61ID:CUftH0/Q0
>>111
いや待てよ、コピーオンライトなスマポがあればミュータブルな世界にも適用可能だが、
今の所、これはないよな?

いずれにしても適用事例はすぐには思いつかないが。
0116デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 15:35:49.57ID:pLs6h5jj0
訂正;
×: あるいは速度優先でcheckout/checkin式にcheckout中だけ直接アクセスを許すとか、
○: あるいは書き換え速度優先でcheckout/checkin式にcheckout中だけ画像への直接アクセスによる書き換えを許すとか、
0118デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 16:02:15.14ID:CUftH0/Q0
>>114,116
まあ分かった。
多分shared_ptrは『ほぼ』インミュータブルな世界とは相性がいい。
(ミュータブルにする必要がほぼなく、その場合は明示的に別メソッドを呼んでもいい場合)

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

ナマポで渡した場合、各ユーザーのダウンロード完了でカウントを減らし、0になるまで破棄出来ない。
shared_ptrで渡した場合、30秒の期限が過ぎればキャッシュから破棄しても問題ない。
この辺は確かに楽に組めるようになる。
0119デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 16:07:24.50ID:WzrD1lk70
>>118
キャッシュにstd::shared_ptrを使用するのは愚策すぎるのではないか。
実のところstd::shared_ptrはほとんど出番がない。
設計を練れば練るほど出番は失われていく。
0120デフォルトの名無しさん (ワッチョイ 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の開放タイミングはスマポで解決!
0121デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/10(日) 16:27:25.23ID:pLs6h5jj0
>>118
ちょっまだキャッシュ言いますかキャッシュと参照カウントは原理上無関係なので(>>106)忘れてよろしいかと、
(参照カウンタが0より大きいからキャッシュ上のデータを消してはいけないという法は無いし、
 参照カウンタが0になったからといってキャッシュ上のデータを消さなければいけないという法も無い

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

これは画像Aの開放を、画像Aのオブジェクト自身に面倒をみさせるしかない(自身を参照するセッションスレッドが0になったとき開放させる
サーバはそれとは並行して画像A'を新規のセッションスレッドに展開できる。
こんな芸当ができるのはスマポだけ!
0122デフォルトの名無しさん (ワッチョイ 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を使っても大して楽にはならない)
0123デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 17:28:14.89ID:CUftH0/Q0
一応簡単に俺の主張を纏めておくと、

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

GC言語は基本的にshared_ptrなわけだが、あれって基本的に手抜き専用で、
GCがないと本質的に辛いって構造はあんまりない。
Rustも今更GC無しですかー、とも思うが、実際、無しなら無しでもいいか、程度ではある。
0125はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/10(日) 17:56:24.27ID:NuBmj+pR0
>>109
> 俺はunique_ptrは「C的リソース管理を文法的に示す」意味しかないと見てる。

その意味がすごく重要やん?
漠然としてたものに区別を与えてくれる最高の機能じゃんね。
0126デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 18:04:27.80ID:WzrD1lk70
std::enable_ifを使いこなそう。
0128デフォルトの名無しさん (ワッチョイ 09c3-5Ttc)2018/06/10(日) 18:05:45.54ID:k6CFzDb+0
「バカよけ」機能に価値はない、無駄だから使わないしコードが長くなるから使わせない
っていう老害いるよね
そういう奴に限ってバグや脆弱性作り込むんだけど決して反省しない
0129デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 18:06:37.55ID:WzrD1lk70
std::unique_ptrを導入すると人事部から一人削減できるってことじゃないか。
0130デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 18:09:53.52ID:WzrD1lk70
まともな知的生命体なら迷わずユニポを使うだろう。
0131デフォルトの名無しさん (ワッチョイ 3139-LHz9)2018/06/10(日) 18:21:28.47ID:E4gfPCgl0
>>128
まあ俺も老害とか言われることのある世代だが
価値がないのは「バカよけ」ではなく「バカ用」な
バカなふりをする達人をニヤリとさせるのではなく、
どうしようもない真性バカを延命する機能は有害なだけ
0134デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 19:42:24.37ID:CUftH0/Q0
混乱を避ける為に先に質問しておきたいんだが、
上記A(82)の場合、つまり、
親関数から子関数にポインタを渡したいが、所有権を移動しない場合には、どう書くんだ?
ざっと探しても出てこないんだが。

引数に値渡ししたらムーブ、これは分かる。
ムーブしたくないが子関数に渡したい場合は?
0136デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 19:45:27.08ID:CUftH0/Q0
>>124
それはありだ。

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

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

つまり、仕様はC++どおりでいいが、
プログラマにやらせるな、自動でやれ、ということ。俺的には。
0137デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:15:37.49ID:lEW5NtSH0
>>135
なんだよ!所有権の複製もできないのかよ!?
やっぱりstd::unique_ptrダメじゃん!!!!
0138デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 20:21:31.52ID:CUftH0/Q0
>>137
まあそのネタはさておき、マジで探しているのだが出てこない。
知ってたら教えてくれよ。

これ、もしかしてget()してナマポ渡すしかないとかいうオチ?
ならunique_ptrなんてマジでゴミだぞ。
さすがにそれはないと信じて探しているのだが、マジで出てこない。
0139デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:22:18.03ID:lEW5NtSH0
>>138
参照で渡せばいいんじゃないのか?
そんなことして何の意味があるのか知らんが。
0140デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:23:52.60ID:lEW5NtSH0
std::unique_ptrに対するweak_ptrは無いぞ。
だからゴミだという場合は、>>137
0141デフォルトの名無しさん (ワッチョイ d19f-NuDx)2018/06/10(日) 20:24:48.73ID:CUftH0/Q0
>>139
俺も最初はそうかと思っていたんだが、実はそれも出てこないんだよね。

まあでもそれで、コンパイラが最適化をするのを期待する、というC++的オチか?
これはあり得るとは思うが。
0142デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:28:59.72ID:lEW5NtSH0
>>141
当たり前すぎて出てこないだけでは?
auto result = my_func(*my_unique_);
とすればいいだけなんじゃないの?
0143デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:31:55.61ID:lEW5NtSH0
std::unique_ptrを利用する主な動機は総称型を保持するためなんだよな。
0145デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:37:44.47ID:lEW5NtSH0
>>144
lvalue_referenceだから仮引数側でどうにでもできるだろ。
0146デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 20:49:11.93ID:lEW5NtSH0
https://ideone.com/SEcQKq

こういうことがしたいんじゃないのか?
0147デフォルトの名無しさん (ワッチョイ 09c3-5Ttc)2018/06/10(日) 21:01:59.63ID:k6CFzDb+0
参照だけするスマポ(と言いつつ何もしないアホの子スマポ)は次の規格で検討されてたでしょ
observer_ptrだかexempt_ptrだか名前コロコロ変わってるけど
0148デフォルトの名無しさん (ワッチョイ 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からの値コピー(所有権は移動しない)でいい。

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

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

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

ただ、C++はプログラマの努力で何とかしようとしているが、
そもそもAにしてもBにしてもコールグラフの解析でfree忘れとか抜けるはずなんだよね。
Cの連中はこの辺には興味ないみたいだけど、
人手でやってる分、スマポみたいにコーナーぎりぎりを攻められないから、
ある程度わかりやすいところでfreeされてる。
当然、ツールにもかかり易いはずで。
0151デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 23:09:19.21ID:lEW5NtSH0
それ参照でいいだろ。
言ってる意味が全く分からない。
0152デフォルトの名無しさん (ワッチョイ b1a9-uWQQ)2018/06/10(日) 23:41:15.51ID:IWNTecyr0
私もはやく皆さんとお話したいのですが、内容が全くわかりません。
C++でRPG作れる程度の知識なのですが、何から学べば良いでしょうか。
おすすめの本、サイトがあれば教えてくださいが
0154デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/10(日) 23:47:37.76ID:lEW5NtSH0
そりゃC++使ってる人が読んだって全く分からないだろうな。
0155デフォルトの名無しさん (ワッチョイ 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))処理が必要ということなんじゃー
0156デフォルトの名無しさん (ワッチョイ 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の実体の開放に関してキャッシュの無効化機構をどう別実装しても無駄。問題に影響無し。
0157デフォルトの名無しさん (ワッチョイ 13bd-T1fc)2018/06/11(月) 07:43:46.07ID:ekbt9EBF0
ちな「キャッシュの無効化機構」とは、新規セッションに見せかける画像をAで無くすしくみという意味であって(それ以外の読み方をせよというのは_)、
画像Aの実体の開放とは関係ありませんからぬ、
というわけで繰り返しになるが画像Aの実体の開放に関してキャッシュの無効化機構をどう別実装しても無駄で、
画像Aの実体の開放はshared_ptr的な、「オブジェクト自身に開放タイミングを決めさせる」(>>114))処理の専任事項となる
>>121の想定のように画像Aが複数に見えることもあるが実体は唯一、というときはそうする以外画像のAからA'への差し替えは_
0158デフォルトの名無しさん (ワッチョイ 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)
でしかない。
勿論それが許容されている世界であり、スループットを取っているだけだからそれでいいんだが。
0159デフォルトの名無しさん (ワッチョイ 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或いはアクターモデル的に
> オブジェクト自身に開放タイミングを決めさせる
ってのか?だったらもうそれは流行らない、というか、
今のところ無駄が多すぎて普通に組んだ方がマシ、ってことになってる。
0161デフォルトの名無しさん (ワッチョイ 135e-JdDl)2018/06/12(火) 00:05:51.50ID:3X1PTNox0
ワイ、今表示されてる倉田まおの母音を見物中
0164デフォルトの名無しさん (ワッチョイ 09c3-5Ttc)2018/06/12(火) 06:07:09.64ID:GF1juvMA0
「delete忘れないようにunique_ptr使いましょーね」「共有が必要ならshared_ptrがべんりだよー」
っていうだけの話の何がそんなに気に食わないのかさっぱりわからなくてついていけない
0167デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 14:16:45.83ID:AQ05KId60
>>164
俺は何言ってるか分かったけど、この人に説明するのは無理だろな。
使ったことがないものを批判したい感じだし、std:unique_ptrは必要になってから使えば良いよと言ってあげれば良いのかも。
0168デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 14:21:27.71ID:AQ05KId60
まずムーブを活用して、総称性が必要になってから初めてunique_ptrを検討する感じがいいんじゃないのかな。
そしてshared_ptrは設計に時間をかけられないときに使うもので、ほとんど出番がないはず。
0169デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 14:25:31.83ID:AQ05KId60
20世紀最大の発明はレーザーと言われてるけど、21世紀最大の発明はムーブと言われてるからね。
俺に。
0170はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/12(火) 14:41:13.61ID:U9ShKAeR0
なるべく (ポインタでなく) 値でやりとりすること、それを低コストで出来るようにムーブ対応にしておくというのは
上位レイヤを作るときに楽できる良い設計だとは思うけど、
実質的にはスマートポインタの機能をクラスに付け加えてるみたいなもんで、
それがクソ面倒くせえときに標準のスマートポインタを使うみたいな方針でやってた。

総称性を活用するときという観点は無かったけど、確かに必要な考え方だな。
0171デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 17:40:26.92ID:AQ05KId60
unique_ptrで内蔵しておけばnoexceptにしやすいので、ムーブが使われやすくなるというのはありますね。
とまあ、C++を使っていれば自然に有効利用するものですが、使う前に理解するのは難しいのではないでしょうか。
使ってみればなるほどとなると思うんですよね。
0172デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 17:41:11.05ID:AQ05KId60
机上の空論繰り返すより、使ってみればすぐわかるよ。
これがおじさんからのアドバイス。
0174デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 19:28:54.15ID:AQ05KId60
C++の基本概念ですかね。
0176デフォルトの名無しさん (ワッチョイ 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#のジェネリクスがある。

へー
0178デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 21:34:08.94ID:AQ05KId60
謎なんだ。
0179デフォルトの名無しさん (スップ Sd73-YTw3)2018/06/12(火) 21:37:14.01ID:SAMUGOdnd
個々のクラスの実装を工夫して値渡しとムーブで解決できないかをまず考えて、
複数の型について類似のコードが出てくるようなら unique_ptr や shared_ptr (や自作スマートポインターテンプレートクラス) の利用を検討する、
というようなことでは。
0185デフォルトの名無しさん (ワッチョイ b19f-a1ED)2018/06/12(火) 23:00:25.83ID:J4aQNa8C0
オマエ知らないんだ〜
でも教えてやらなーい
0186デフォルトの名無しさん (ワッチョイ 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万通りぐらい即答できるはず
0187デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/12(火) 23:42:22.02ID:AQ05KId60
通知メカニズムを持つ画像より、通知メカニズムを持つリソースハンドルのほうが便利に違いないので、あまり使いどころがなさそう。
0189デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/13(水) 00:06:22.45ID:uiSNJKd/0
>>188
禿4はSTLコンテナの類もリソースハンドルと呼んでるけどな。
std::shared_ptrに通知メカニズムをプラスしたようなものが実際に必要になるのではないだろうか。
オジサンはATL風の通知メカニズムを備えたコンテナを作りましたぞ。
0190デフォルトの名無しさん (ワッチョイ 81b3-8neN)2018/06/13(水) 00:09:01.46ID:uiSNJKd/0
リソースを共有するということは、通知もセットで必要になると思うんだよなあ。
0194デフォルトの名無しさん (ワッチョイ 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に冷めている理由だろうよ。無知な馬鹿にしか見えないから。
0195はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9b6f-LHz9)2018/06/13(水) 21:32:55.86ID:3eXA0K0W0
>194
> 正しくCを使っている連中は、そのナマポがunique/shared/weak/observerのどれなのかは明確に意識してる。
> ただそれを書いてないだけだ。だから馬鹿には使っていないようにしか見えない。

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

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

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

ほんとに糞な爺だわ。早く棺桶の中で寝ろ。この河童虫が
0197デフォルトの名無しさん (ワッチョイ 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方式だし。
0205デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/14(木) 04:20:54.09ID:vzmFB22H0
問:ある時刻tの日本の年号を返すプログラムをC++とSTLを使って表現しなさい。年号はコードに埋め込むものとする。
0207デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/14(木) 07:14:11.27ID:QWAhFsNz0
>>198
参照のクモの巣と言えばDOMが有名だけど、あれはスクリプト言語ユーザーの都合上そうなっているだけで、C++ユーザーにとっては無用の長物なんだよね。
タブを一つ開くたびに500MB消費するのは許容限界を超えていると思う。
0208デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/14(木) 07:19:10.82ID:QWAhFsNz0
そして、ブラウザをCで書くのは非常につらい作業になるので、実用上C++を使うことになる。
したがって、スクリプト言語をホストする以上、自分たちにとって参照のクモの巣が無用の長物であったとしても、C++は、必要とされればいつでも参照のクモの巣をサポートする力が必要になる。
0209デフォルトの名無しさん (ワッチョイ 42bd-eoBX)2018/06/14(木) 07:54:07.51ID:loD77XnX0
>>203
循環の検出ならスタックとノード毎の到達済みフラグがあれば逝ける
ドーナツ型の図形を塗りつぶすのと同じやり方
(個々のノードは、参照先の到達済みフラグがTRUEならああ循環したんだなあとワカル
0212デフォルトの名無しさん2018/06/14(木) 08:27:43.24
量子コンピュータなら循環なんて一瞬で分かるよね

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

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

循環に限らず単純な共有でもこうなるので
そんなことでは循環したんだなあとワカラナイと思う
0214デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/14(木) 09:46:17.13ID:QWAhFsNz0
循環参照は甘え。
0215かさぶた (ワッチョイ 99b3-4tVh)2018/06/14(木) 09:52:01.49ID:EOR8DX2X0
質問です、下記はソースの1部分なんですが、あるプロセスのメモリを検索しています。00000000〜7FFFFFFFまでを検索しているのですが7FFFFFFFを9FFFFFFFまでに増やしたいです、単純に終了アドレスを9FFFFFFFにしても検索してくれないですが何故でしょうか?
http://codepad.org/cdLpKbdw
0217デフォルトの名無しさん (ワッチョイ 99b3-mJaI)2018/06/14(木) 13:43:20.70ID:EOR8DX2X0
>>216
どの部分ですか?
0220デフォルトの名無しさん (ワッチョイ 42bd-eoBX)2018/06/14(木) 23:42:44.50ID:loD77XnX0
>>213
>循環に限らず単純な共有でもこうなるので
到達済みフラグをセットするのは開放時なので
ならない

>ドーナツ型の図形を塗りつぶすのと同じやり方(>>213)
と書いただけでは通じなかったですかそうですか、
0222デフォルトの名無しさん (ワッチョイ 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が裏で手を握る必要がある
0224デフォルトの名無しさん (ワッチョイ 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++にもリフレクション欲しい…
0225デフォルトの名無しさん (ワッチョイ 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の巣に帰れ。邪魔でしかないから。
0226デフォルトの名無しさん (ワッチョイ d123-PZZX)2018/06/15(金) 09:22:53.91ID:RJDRNrzC0
>>220
単純な共有と循環を区別できるコードを書いてみてごらんよ。
あなたが考えているような簡単なものにはならない。
恐らくはあなたには書けないから。

コード書かずに妄想してるから間違えるんだよ
0229デフォルトの名無しさん (ワッチョイ d123-PZZX)2018/06/15(金) 10:24:22.09ID:RJDRNrzC0
有向グラフでマークしてトラバースすれば循環がわかるのは単方向リストくらいなものだろ
ドーナツがどうとか言ってるのは無向グラフと混同している
0231デフォルトの名無しさん2018/06/15(金) 12:08:37.80
難しい人ってか、基地外な人が多いね
0232デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/15(金) 14:00:33.64ID:S225t3Tg0
JavascriptとC++では要求されるレイヤーが違うので、比較するのは無理だと思う。
0233デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/16(土) 01:44:46.69ID:NR0pGRhV0
複雑な参照を持つシステムってまぁほとんどシミュレーション系で速度も要件に入ってくるんですよ。
糞遅いJavascriptやpythonなんて普通に使いものにならずC++の独擅場なわけですよ。
pythonでAIとか笑っちゃいますね。
0234はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-Bw3Y)2018/06/16(土) 03:04:09.42ID:eEu6oaxZ0
>>233
この場合の Python はいわゆるグルー言語でしょ。
高速なコンポーネントのパラメータを指定して組み合わせるだけみたいな使い方なんじゃないの。

高速な計算が出来るコンポーネントは C++ が主流であったとしても、
それをビジネスロジックにさっと適用するという意味での「Python で AI」は現実的だし、
実際よくあることだと思う。
0235デフォルトの名無しさん (ワッチョイ ed83-m0US)2018/06/16(土) 03:46:18.97ID:NR0pGRhV0
高額なPython屋募集のAI案件は、99%非現実的。
AIを何も分かってな奴が企画したプロジェクト。散々利用されてきた統計学以上の成果など出やしない。
昨今のAIブームは過去のAIブームと同じく破綻プロジェクトばかりなのは言わずもがな。

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

openCVスレでもpythonから入る奴は何もできやしない。最初から分かりきったこと。フフフ、笑えますね。
0236デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/16(土) 04:06:22.88ID:Xfp5NB1U0
結局はコンポーネント間の通信回数を減らすことが肝。しっかりと設計を吟味すれば従来通りのIPCで十分だったりする。
0237デフォルトの名無しさん (ワッチョイ 069d-/RsH)2018/06/16(土) 09:29:46.67ID:/wbLufVy0
>>235
でもAIってモジュール部分は超簡単なんじゃない? それにそんなもの「作る」って
レベルじゃないから、出来の悪い奴でもいいから一人がC++でモジュール書いていば
OKでやっぱPythonレベルの方が重要なのではないか?
0239デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/16(土) 12:41:15.99ID:HgejND060
C++の公式スクリプト言語はPythonだから慣れるしかない。
0241デフォルトの名無しさん (ワッチョイ 069d-/RsH)2018/06/16(土) 16:56:00.16ID:/wbLufVy0
AIで一番大変なのはデータを食わせることだよな。パイトンでもC++でもなくて
一番重要なのはエサやりして大切に飼いならす人だよ。だから愛がないとできない。
お前等には無理だな。三日やったら課長の机に糞してとんづら。
0243デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/16(土) 23:47:37.78ID:HgejND060
OCamlがあるのだからオッパイソンがあってもいいはずだが。
0244デフォルトの名無しさん (ワッチョイ 469f-cPc7)2018/06/17(日) 09:57:43.12ID:dJUJdMR30
>>235
ほとんどのAI案件がやばいってのは同意だが
pythonなら言い訳できるってのはねーわw

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

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

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

あと、わざわざID消して自演しているゴミ、それは余計に目立つぞ。
他の誰もそんなことをしてないから、逆にコテトリになってる。
お前は他でも荒らしまくってるよな。
0246デフォルトの名無しさん (ワッチョイ 419f-bAWz)2018/06/17(日) 11:26:31.91ID:DwTnzOB00
>>227
一番足りないのは謙虚さなんだけどな。

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

C++は30年の歴史があって、仕様も改訂し続けているのだから、
今の仕様はその中で今一番マシな方法ということになっている。
JavaScripterみたいなぽっと出のゴミがぱっと考えて思いつくような手法を、
今まで30年間誰も思いつかなかったと思うこと自体がキチガイでしかない。
0247デフォルトの名無しさん (ワッチョイ 419f-bAWz)2018/06/17(日) 11:30:36.00ID:DwTnzOB00
というわけで先に進める。
沸きまくっている馬鹿を振り落とす為に速度を上げるからよろしく。

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

本題は、

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

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

速度的には静的共有の方が優位だとして、動的共有では無理な事例ってあるか?
俺が知っているハードリンクの活用事例は、WindowsUpdateくらいだ。
「動けばいい」なら動的共有の方が適切に思える。
(C++で動的共有はなかなかにきついが、動的言語なら自然に実現出来る)
0249デフォルトの名無しさん (ワッチョイ 419f-bAWz)2018/06/17(日) 11:58:04.60ID:DwTnzOB00
>>248
俺から見ればお前がキチガイだし、
ここがお前にとって合わないと思うのなら、お前がここに来るのが間違ってる。

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

俺には韓国人とゆとりは殺すしかないという結論が出てる。
お前らは邪魔しかしないから。今もそうだろ。
0250デフォルトの名無しさん (ワントンキン MM92-l11B)2018/06/17(日) 12:17:06.47ID:I5++lOekM
初心者で的はずれな質問かもしれませんがお願いします。
1行に約4000文字,区切りで書かれたファイルがあり、これが1000行あります。
このファイルを1行ごとに別の配列に格納したいのですがfgetsだとchar型になりcharは256文字しか入らないようです…
どうしたら読み込みできるのでしょうか
0253デフォルトの名無しさん2018/06/17(日) 14:34:42.11
C言語を通らずにいきなりC++を使う初学者は
fgetsやcharに触れるべからず
必ずラッパーライブラリを使うべし
0255デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 15:00:46.90ID:JVUiE6fQ0
>>247
C++風に考えるとstd::shared_ptrは必要なくなってくるけど、他の言語の真似をしようとすると、必要になるんだよな。
そしてC++は他の言語から呼び出されるから。
そういう部分で必要があるのかも。
0256デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 15:03:38.90ID:JVUiE6fQ0
スレッド使う場合は、コピーのほうが速くないかよく考えた方が良い。
意外とコピーのほうが速い。
0257デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 15:29:58.46ID:GftzeAnS0
>>253
宗教じみたことは言わないほうがいい。

C++の入出力クラスiostream系の標準機能は失敗した代物との結論が出ている。
C++学習者は FILE* 系の標準機能を優先して使うのが正道。
0259デフォルトの名無しさん2018/06/17(日) 16:15:29.34
>>257
あり得ない
ポインタも分からん奴に生char使われてたまるか
fgets使いたいならC言語で基礎を身に付けてから出直して来いや
0261デフォルトの名無しさん (ワッチョイ 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系の様々なフラグがあるが、煩雑で使い勝手が悪い。覚える価値ゼロ。
0262デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 17:21:36.16ID:JVUiE6fQ0
>>258
速度じゃないか?
使いもしないオペレータのために余計な処理挟むから。
VCについてくるディンカムウェアなんか一バイトごとに仮想関数呼び出してるぞ。
0263261 (ワッチョイ 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*にアクセス。
0266デフォルトの名無しさん (ワッチョイ 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>)
{
0267デフォルトの名無しさん (ワッチョイ 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)多重呼び出しを防止できる。
0268デフォルトの名無しさん (ワッチョイ 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も基本的にないだろ。
実はあんまり使いどころなくね?って話。
0270 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/17(日) 18:17:30.15ID:mtjEdwIk0
>>261
>iostreamはios系の様々なフラグがある
そうそう、今いち、よく定義がわからないんだよね
それに、手元の実装がこのフラグについてまともじゃないかもしれない
0272デフォルトの名無しさん (ワッチョイ 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
0273デフォルトの名無しさん (ワッチョイ 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)
0274デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 19:51:08.65ID:JVUiE6fQ0
>>273
数百バイト程度は許容できるんじゃないの。
コンテナに入れるわけでもないし。
0275デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/17(日) 19:53:22.73ID:JVUiE6fQ0
>>268
ないよ。
0276デフォルトの名無しさん2018/06/17(日) 19:54:46.50
直近のスレを見れば分かるとおり、C++は複雑怪奇魑魅魍魎だから
プログラミング初学者が手を出したらヤケドしかしない
0277デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/17(日) 20:02:30.99ID:GftzeAnS0
勉強でヤケドする分には問題ないし、
むしろ沢山ヤケドして危険を避ける能力を身に着けるしかない。
実務でやったらアウトだが。
0282デフォルトの名無しさん (ブーイモ MM62-hu3a)2018/06/17(日) 21:52:06.00ID:PyYPwpSkM
スタティックライブラリAが別のスタティックライブラリBのAPIを使っている場合、ライブラリAにライブラリBをリンク、ビルドして、結果できたライブラリAだけをリンクして、実行ファイルを作る形式が良いでしょうか。
それともラリブラリA、ライブラリBを別々にリンク、ビルドして実行ファイルを作る形式が良いでしょうか。
0283 ◆QZaw55cn4c (ワッチョイ 2260-m0US)2018/06/17(日) 21:54:39.50ID:mtjEdwIk0
>>282
>ライブラリAにライブラリBをリンク、ビルドして、結果できたライブラリ
そんなことができるのでしょうか?
0287はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 066f-Bw3Y)2018/06/18(月) 00:02:38.25ID:CYJOSJS20
iostream の替わりになるようなデファクトスタンダードが登場していない以上、
ほどほどに付き合っていくしか仕方がないよ。

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

コンセプトやら何やらが導入されたらもうちょっとマシな入出力ライブラリが出来たりしないもんかね?
提案くらいは出てたりしない? って思ったけど、こないだ江添っちがTwitterで「無い」って言ってた気がする。
0289273 (ワッチョイ 45d2-Bw3Y)2018/06/18(月) 06:12:18.90ID:q6319o4n0
>>274
iostreamは肝心な時に使えない橙武者です。

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

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

橙武者、黒衣など語の意味が分からない方は、ご自身でおググり下さい。
0290デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/18(月) 08:25:55.66ID:Tb7Gp3zL0
io_contextで世界が変わる。
0291デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/18(月) 08:29:09.26ID:Tb7Gp3zL0
coutってアクセスするたびに生成するわけじゃないよね?
0292デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/18(月) 08:34:19.02ID:Tb7Gp3zL0
ツリートラバースするのに、再帰使うよりstd::deque使ったスタックのほうが速いな。
0293デフォルトの名無しさん (ブーイモ MMb6-pMQN)2018/06/18(月) 08:36:26.28ID:h2dlgwUxM
>>291
グローバルオブジェクトとしてずっと存在してる
0296デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/18(月) 11:02:34.48ID:q6319o4n0
「標準出力への書き込みは遅いから」との理由で、メモリ上にログをため込むことは多いかと思います。
iostream系だと stringstreamを使うことになりますがスタックサイズが割と大きくインスタンス生成のたびに時間もかかります。

さらにいえば、MSVCの場合、snprintf()に比べてstringstreamは書き込みに3倍弱時間がかかります。
本来ならば << 演算子はコンパイル時に型が決まるので書き込みが高速なはずなのですが、
MSVCだとstringstreamがsnprintf()に負ける有様ということです。
なお、Linux GCCの場合、snprintf()とstringstreamは書き込み速度の差は少ないようです。
0303デフォルトの名無しさん (ワッチョイ c27c-TqnL)2018/06/18(月) 21:06:09.32ID:wRZSUlvR0
Cでは代入式はその結果値が左辺値にはならないから v = 1 = 2 みたいな表現は通らない
C++では左辺値になるので通る
0305デフォルトの名無しさん (ワッチョイ 4223-PZZX)2018/06/18(月) 21:25:53.85ID:xdRdwSco0
昔からこういう==での判定は
if (S_OK == (result = someApi()) {...}
と定数左で書けという作法もあるけど、
流行らないのは見た目が実行順と逆みたいで妙だからかねえ
0310デフォルトの名無しさん (ワッチョイ 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文字の打ち間違いなんて テストコードの記述そのものでもやりかねないし
(「絶対に間違えない!」なんていう人がいたらコードどころか作文も書いたことない奴ですぜ)

まあ使用が推奨/禁止されてるかはチームに従うとして
ぱっと見で意図が解るようにはしておくとよいかと
0312303 (ワッチョイ c27c-TqnL)2018/06/19(火) 01:34:04.88ID:6qgw6hGx0
すまんかった >>303 は "v = 1 = 2 みたいな" ではなくて "(v = 1) = 2 みたいな"
括弧忘れたら結合順が変わってしまう 訂正
0313デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 03:10:51.39ID:WKXXm+ar0
統合開発環境ってEmacsのことだっけ。
0315デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 05:50:29.80ID:WKXXm+ar0
単体テスト書くと処理時間出るから、何に時間かかってるのかわかっていいよね。
0316デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 05:52:35.58ID:WKXXm+ar0
やはり一番時間がかかるのはIOだから、IO少なくするのが一番よさそう。
std::vectorなんか全体コピーしても余裕の速さだから気にする必要なかったんや。
0321デフォルトの名無しさん (スップ Sd62-Gye4)2018/06/19(火) 10:45:51.92ID:x0u1iMAyd
世の中いろんなコーディングルールがある

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

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

かといって個別に警告の有効・無効のオプションを書くのも面倒くさいしなぁ。
0323デフォルトの名無しさん (ブーイモ MM6d-nvpi)2018/06/19(火) 14:29:42.98ID:mTWnJSOLM
俺も定数との比較なら
if ( 0 == buf )
って定数を左に書くようにしてる
理由は>>310と同じ意図しない代入防止
0324デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 15:21:42.83ID:eYArWI+v0
テスト書けば防げるよ。
0325デフォルトの名無しさん2018/06/19(火) 17:52:06.99
自動的に静的チェックツールかけとけば教えてくれるよ
0326デフォルトの名無しさん (ワッチョイ 45d2-Bw3Y)2018/06/19(火) 18:32:24.93ID:QaAZlBtz0
関数の戻り値を保存した一時変数を使わなかっただけで警告出されるのは地味につらい。かといって警告を抑止するのも悩ましい。
以下のような感じ。

void test()
{
int foo = bar();
return;
}
0336デフォルトの名無しさん (ワッチョイ 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; // 未使用のパラメーター
0340326 (ワッチョイ 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;
}
0342デフォルトの名無しさん (ワッチョイ 99b3-Cu4h)2018/06/19(火) 21:12:21.11ID:eYArWI+v0
>>339
そのコードにエフェクトがあるならテストできるのではないでしょうか。
0343デフォルトの名無しさん2018/06/19(火) 21:18:56.08
>>339
そういうのはコンパイル時にWarning出るから本線にマージする前には見つかるでしょ
0348デフォルトの名無しさん (ワッチョイ 4223-PZZX)2018/06/19(火) 21:42:40.31ID:j1n9w5rn0
>>339
if (buf = 0) { A }

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

この2つの場合は結果がおかしいからテストで見つかる。
結果は正しいが見つけにくいリークが発生するとか
ここ間違えても結果は(常にではないが)多くの場合正しい
とかだと静的/動的カバレッジで見るしかないね。
0350デフォルトの名無しさん2018/06/19(火) 21:50:59.42
非適合コード: a = a + b + c;
適合コード: a = ( a + b ) + c;
0351デフォルトの名無しさん (ワッチョイ 4223-PZZX)2018/06/19(火) 21:52:07.12ID:j1n9w5rn0
>>349
>演算にカッコを付けろという警告

メンテしてるアプリのソース内のMD5だか sha だかのコード(問題なく動作中)で
「&とシフトの優先順位わかってんのか?括弧つけたら?」の警告が出るが、
&とシフトの優先順位など知る気もないし書き換えるとバグる気しかしないので放置している。
0353デフォルトの名無しさん (ワッチョイ 42eb-m0US)2018/06/19(火) 23:42:48.11ID:Ac6XacCG0
質問です
std::unique_ptrはデストラクタで保持するリソースの解放処理を行うので、自明なデストラクタを持つことが出来ず、リテラル型になることが出来ないと思うのですが
デフォルトコンストラクタとnullptrを受けるコンストラクタはconstexpr指定されています、このconstexprにはどういう意味があるのでしょうか?
0354デフォルトの名無しさん (スップ 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 を使用することが出来る。
0356デフォルトの名無しさん (ワッチョイ ff9d-E6HK)2018/06/21(木) 04:41:53.49ID:G2MjnjmO0
Scopeのついた#defineのような書き方ってないのでしょうか?
たとえば Uart0.baud 115200を変数としてしてじゃなくてDefineで保持しておきたい
場合にScopeを整理しておきたい。
0358デフォルトの名無しさん (アウアウカー Sa93-tQU5)2018/06/21(木) 08:23:50.96ID:iolQTPDna
>>356
C++では#defineではなくconstを使うと習いました
0360デフォルトの名無しさん (ワッチョイ ff9d-E6HK)2018/06/21(木) 08:52:37.07ID:G2MjnjmO0
Constはラムに配置されますからダメですよ。
それからTemplateは型を変数にしたい場合につかえるだけです。Scopeのついた
定数がないとすると、、、、、なんか使いにくいですね。
0364デフォルトの名無しさん (ワッチョイ 1f7f-GwbS)2018/06/21(木) 10:43:19.88ID:1tnpfBql0
今どきdefine使ってる奴なんていたらクビだわ
0367デフォルトの名無しさん (ブーイモ MM9f-yRyg)2018/06/21(木) 12:34:10.47ID:Oz+pq3ApM
>>360
組み込み向けとかでROM実行になっていなければ、どちらもRAMに配置されると思うよ。
もしもコンパイル時解決するかどうかということであれば、constでもちゃんとコンパイル時解決されるし、式(含関数)の場合はconstexprキーワードを使えばコンパイル時解決(可能なら)される。
あと、templateは型だけでなく定数も置けるよ。
0368デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/21(木) 12:49:18.77ID:m6fyxFJ7d
考えるべきなのは2つ

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



マッピングされる場合、どのセクションにマッピングされるのか
0369デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/21(木) 13:52:00.91ID:Grok3vuS0
const定数は ヘッダーファイルで宣言するだけではダメでソースファイルでconst定数の実体を初期化しなければならないので、defineより使い勝手が悪い面もある。
最新のC/C++だとその辺どうなってんの?
0371デフォルトの名無しさん (ワッチョイ 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;
};
でもいいし
0372デフォルトの名無しさん (ワッチョイ 7f23-WzrY)2018/06/21(木) 14:03:31.13ID:S4IxNo+10
>>369
関連してついでに言うとよほど古いコンパイラじゃなければ

struct T {
int k=0;
};

というメンバ変数の初期化の書き方もできて
複数のコンストラクタがあるときとか楽できるよ
0378デフォルトの名無しさん (ワッチョイ 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
0380デフォルトの名無しさん (ワッチョイ 7f23-WzrY)2018/06/21(木) 16:50:45.19ID:S4IxNo+10
ソース中で(アドレスは使われず)値しか用いられなければ実体が全く作られない可能性もあるが
オブジェクトファイル見なきゃ確認できなくて面倒だからそれは略
0384デフォルトの名無しさん (ワッチョイ 7f23-WzrY)2018/06/21(木) 17:27:13.58ID:S4IxNo+10
>>383
付けなかったらリンクエラー出るだろ

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

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

小さな組み込みマイコンだと
C++でもこんな感じ
0388デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)2018/06/21(木) 17:54:46.47ID:RX0X5VqW0
フリースタンディング環境の話をこっそり忍ばせてくる技の名前なんだったっけ。
0389デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/21(木) 18:03:41.90ID:m6fyxFJ7d
逆に値を変えても1バイトしか変わって欲しくないときや
1バイトを無理やり変えると動作が正しく変わってほしいとき
は番地に割り当てられるようにする

PCプログラムしか書いたことがない人は気にしたことも無いだろうけど
0397デフォルトの名無しさん (ワッチョイ 7f34-MNXm)2018/06/22(金) 00:28:24.33ID:JUnpVDzH0
constexprは関数が返す内容が定数であることを保証する
コンパイル時はインラインでその関数を走らせて順次定数に置き換えてコンパイルが行われるということだ
0402デフォルトの名無しさん (ワッチョイ 1f50-ddCb)2018/06/22(金) 01:46:46.25ID:Hssdw/9K0
constexprだけど計算にとても時間がかかる場合はどうなるんだろう

延々とコンパイルが終わらないとかエラーになるとか勝手に実行時解決になるとか?
0403デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)2018/06/22(金) 03:26:28.59ID:0qBHNE4T0
constexprで学習した結果のみ実行時に用いるAI。
0404デフォルトの名無しさん (ワッチョイ 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 を使って綺麗に書いてみよう。任せる。
0407いちるいなんがずっとだしおっかけてついてくるし (ワッチョイ 1f76-lC4z)2018/06/22(金) 06:11:32.65ID:kyYAMp480
でふぁいん てんてきのしんにゅう がちょくじゃないから あんしんするじゃないかな


めいんすとりーとからいっぽんはいったほうが
0408デフォルトの名無しさん (ワッチョイ 1f76-lC4z)2018/06/22(金) 06:13:05.67ID:kyYAMp480

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

てんごく あんじゅうのち
0410デフォルトの名無しさん (アウアウウー Sae3-E6HK)2018/06/22(金) 06:44:34.82ID:1fAWv7Tna
適当
https://ideone.com/3pPDGA
0411デフォルトの名無しさん (ブーイモ MM0f-mx2r)2018/06/22(金) 07:48:57.63ID:jUqm4dE5M
>>402
constexprはコンパイル時評価可能(評価するとは言っていない)なのでコンパイラ依存。
コンパイル時間が伸びるのが大半だろうけど。
0414デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/22(金) 09:02:09.74ID:bJNd9Nrpd
>>411
「とても」ってのは例えば10年かかるとかそういうの
ある数学定数の計算とか固定データの暗号化を破るプログラムとか

適度にあきらめてくれないと
コンパイルが(事実上)出来なくなる
0417デフォルトの名無しさん (ワッチョイ 7f23-eNWv)2018/06/22(金) 14:23:31.03ID:0acoPbmK0
>>385
リンカの挙動に付いては変数と扱いが違うせいじゃなくて
c++ では const 変数はデフォルトで static なくだけだよ

お前は正しい指摘をしている時でさえ必ず間違ったことを言う
このスレ読んでる人に嘘ついて喜んでる愉快犯か何かか
0418デフォルトの名無しさん (スプッッ Sd1f-SNrP)2018/06/22(金) 14:25:48.43ID:oyBTubw6d
現代においてdefineを使う利点がゼロ
0419デフォルトの名無しさん (ワッチョイ 7f34-MNXm)2018/06/22(金) 14:31:22.11ID:JUnpVDzH0
は?constをヘッダにstaticで定義しているバカが居たことに驚きなんだが
そりゃstaticで定義しまくったら実体増えるのは当たり前だろ
灯台下暗しでstatic記述するバカに気付かなかったわ
バカ過ぎて話にならんわw
0420デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/22(金) 15:00:35.31ID:PS4w2oBw0
>>419
おっしゃることは確かにもっともなことですが、basic_string::npos についてはどう思われますか?
0424デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)2018/06/22(金) 18:20:27.94ID:0qBHNE4T0
一行おきになってから考える。
0426デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/22(金) 19:10:51.02ID:PS4w2oBw0
>>422
クラス変数に統合されるとなぜ問題ないのですか?
そもそも統合とはどういう状態でしょうか。
ネームスペースにstatic constを書くのとあまり違いはないように思うのですが、どう違うのか教えてもらえませんでしょうか。
0432デフォルトの名無しさん (ワッチョイ ff0d-GwbS)2018/06/22(金) 21:16:32.93ID:sLKAbUw90
   ___
  /彡彡))
  |彡( >
  ノノノ ヽ丿 <プロでござい
 / ̄ ̄ ̄\  n_
`/| _[]_ |/\ ( )
∧||バ| Y\ `/ /
\||カ| | \_/
(|  ̄ ̄ |
 |____|
 ||_|i|_||
 | ー|ー |
0436デフォルトの名無しさん (ワッチョイ 7fd2-XQuB)2018/06/22(金) 23:02:52.73ID:tZy0W+/k0
まじめにデザインパターンを学習したくて書籍を探しているのですが、Javaで
説明しているものばかりで困っています。Javaは全く知りませんし、覚えるつ
もりもありません(自分にとっては不要な言語なので)。

C++でデザインパターンを開設している書籍を教えてください。
0438デフォルトの名無しさん (ワッチョイ 7f7e-09r9)2018/06/22(金) 23:40:54.94ID:m8knQ0QO0
サンプルがJavaで書いてあるかどうかって関係あるか?
デザパタの本ならJava特有のことはやってないはず
何をやっているのかを理解してそれをそのまま他の言語に当てはめればいい
0445 ◆QZaw55cn4c (ワッチョイ 7f60-DJU/)2018/06/23(土) 00:19:38.99ID:OlLfOCSW0
>>436
結城ならば簡単なJava だから、C++ の知識で Java の字面は追えますよ(なんとなくわかる)
私は結城 Java を C++ に書き直して習得しました
0446デフォルトの名無しさん (ワッチョイ ff9d-E6HK)2018/06/23(土) 02:15:46.97ID:nmsTY6vF0
C#やJavaが動くのにC++を使うのは辛い。非常につらい。絶対にやめたい。にも拘らず
未だにC++を進める人がいるのは残念だ。
一方C++は組み込みには非常に威力を発揮する。しかし組み込みではいまだに90%
の人がCを使う。それはなぜなのか?
 CとC++ではスッポンと月ほどの違いがある。しかし残念ながらそれは
C++をフルに使える場合であって、フルに使える場合ならC#やJAVAを使った方がいいわけで
フルに使えないケースであるからこそ、C++を使うのが正しいのであるから、やはりC++は
Cに比べて月ほどではない。しいて言えば月というよりは牛だろう。ともすれば牛よりも
スッポン料理が高価なように、月になれるのに牛ではやはりかなり残念なのである。
どういう切り口でも残念な言語、それがC++だ。
0447デフォルトの名無しさん (ワッチョイ ff9d-E6HK)2018/06/23(土) 02:24:54.31ID:nmsTY6vF0
C++開発をした人がC++の本を書いていて、先輩に「読め!!!」と勧められたので読んで
みたが非常にわかり難い。こんな頭の構造をした人が作った言語だからきっとわかり難いの
だろうと思う。一言でいうと簡単なことを複雑に説明する。
C++という言語もアフォほど簡単なことをやたらと複雑に書かなければならないことが多い
という気がする。
0448デフォルトの名無しさん (ワッチョイ ff9d-E6HK)2018/06/23(土) 02:33:48.53ID:nmsTY6vF0
Headerファイルにメソッドを書かないスタイルは誤りだ。
理由
1.C++以外でそんなスタイルをとっているものはない。
2.なぜならメソッドも実体ではなく型だからだ。分離するメリットはないがデメリットは多い。
0449デフォルトの名無しさん (ワッチョイ 7f7e-09r9)2018/06/23(土) 02:37:32.71ID:gROM9xFw0
>>446
コピペかと思ったけど違うのか
何でC#を使うべきケースとC++を使うべきケースを分けられない人が出てくるんだ?
インタープリタやC#やらがクソ簡単に書けるのはその下で煩わしいことをやってくれてる人がいるからだ
0451デフォルトの名無しさん (アウアウカー Sa93-x6qn)2018/06/23(土) 07:07:27.53ID:CK76JyQna
c++が複雑なのはわかるがどんどん簡単に書けるように進歩してるだろ。

autoとかrange-based for loopとかconstexprとかlambdaとか。

他の言語並みに簡単に書けるようになるのはまだまだかかるとは思うが。
0454デフォルトの名無しさん (ワッチョイ ff9d-E6HK)2018/06/23(土) 08:39:12.93ID:nmsTY6vF0
>>412
簡潔で綺麗だ。素晴らしいと思う。
0460デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)2018/06/23(土) 14:54:46.34ID:hRKVQ4t10
>>444
Javaは高価な機器を買わせるためにデザインされた言語だから用途が違うけど、他はソフトウェアを作るためでは?
0465デフォルトの名無しさん (ワッチョイ 7f5e-lC4z)2018/06/23(土) 18:08:17.77ID:JrW4+gjv0
Expression templateでmatrix乗算、それが無理ならベクトルの内積
(それもコンパイル時計算じゃなくてコンパイラの遅延評価を利用して
一種の構文を記憶したもの)を計算するETを解説してるところしらないかな。

ベクトルのETによる遅延評価計算はC++テンプレートテクニックあるから
いいけどさ。

Matrixがわからんのよ。uBLAS、MET、TVMET探してもそれらしきソースコード
が特定できん。
0466デフォルトの名無しさん (ワッチョイ 7f5e-lC4z)2018/06/23(土) 18:40:25.11ID:JrW4+gjv0
Expression templateは本命じゃない。難しすぎる。でも演算子オーバーロードの
弱点である一時オブジェクトによるロス(a*aみたいな乗算も含めて)を解決する
方法を20年以上前に考えたけど、それと速度を比較したい。
0472デフォルトの名無しさん (ワッチョイ 9fbd-yRyg)2018/06/23(土) 22:49:55.46ID:uP340TqJ0
アプリ次第じゃね。
数値計算やアルゴリズムやってると、リソース、速度、必要精度に応じて、整数、浮動小数点、多倍長整数、有理数等々に対応できるように作るから、むしろテンプレしかない。
0473デフォルトの名無しさん (ワッチョイ 9f83-DJU/)2018/06/23(土) 22:54:31.33ID:lx9rCNA70
>>470
うまい。プログラムがテンプレートだらけになってる奴は必死にマイレゴブロックを作ってる。
stl、boost、atl、既成レゴブロックは数多く提供され使われてるのだ。

そんなに理想の車輪がほしければ、
それこそ新言語を作ればいい。C++にアホ機能追加してる糞どもに言いたい。
0475デフォルトの名無しさん (ワッチョイ 7f7e-09r9)2018/06/23(土) 23:07:53.81ID:gROM9xFw0
>>473
何言ってるのかわからん
stlやboostはブロックを作るための材料くらいの位置づけだぞ
テンプレートがstlのような比較的低レイヤーなところでしか使わないとでも思ってるのか
レゴブロックと言ってるのは大量のモジュールを読み込んで継ぎ接ぎしてるようなJSやPythonのコードのことだ
0479デフォルトの名無しさん (ワッチョイ 9f83-DJU/)2018/06/23(土) 23:45:15.10ID:lx9rCNA70
>>474
過去の大量のC++コードを全否定する機能を追加するなら新言語にすべし。
Java、C#みなそれで成功している。C++の名前を借りないと使ってもらう自身がないならキミは向いてない。
0483デフォルトの名無しさん (ワッチョイ 9f83-DJU/)2018/06/24(日) 00:13:58.88ID:rLugm4Eu0
それ。C++は当初から問題ある欠陥言語だから、素晴らしい新しい言語を作るべき。
古い大量のコードはもうどうにもならない。誰も更新費用の予算を計上してくれない。
COBOLと同じなのだ。老人のおれはC++と心中する。

おまえら若者は新しい船で新しい世界に旅立ってくれ。俺の屍を越えてゆけ。
0486デフォルトの名無しさん (アウアウウー Sae3-E6HK)2018/06/24(日) 00:46:53.92ID:f93Q4KExa
老人はC++03と心中してくれ。俺はC++14以降の船に乗る。
0489デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)2018/06/24(日) 01:41:30.34ID:AKYv/9KI0
vectorはdata()が連続した領域を返さないといけないのが大きな制約になってるかも。
0493デフォルトの名無しさん (ワッチョイ 1f50-ddCb)2018/06/24(日) 08:22:28.59ID:lrwvyFHq0
>>484
テンプレートは魔法じゃない

同等の速度を出す為には結局全て特殊化することになるし、
インターフェースも型によって違う方が良いこともある

性能、リソース、...
突き詰めれば全て特殊化

テンプレートは妥協だ
0495デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/24(日) 09:08:30.29ID:6XPmSU1L0
cstdio と STLの連携を深めて欲しいね。

・FILE* に basic_string をバッファとして渡してメモリに読み書きする機能が欲しい。
・fgets() で得られた文字列長を再計算するコストが無駄なので、文字列長も取得できる機能拡張関数が欲しい。

何らかの処理の過程で副産物として得た文字列長を捨てて、別の場所で文字列長を再計算する無駄は、かなり多いと思う。
0497 ◆QZaw55cn4c (ワッチョイ 7f60-DJU/)2018/06/24(日) 10:27:01.80ID:rYGVoBbS0
>>496
基底クラスのポインタで複数の派生クラスのポインタとして振舞えるの?
template を使ってポリモーフィズムを実装できるとでもいうの?
0498デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/24(日) 10:27:08.87ID:6XPmSU1L0
>>496
FILE*を使う関数にbasic_stringをc_str()で渡すのではなく、
setvbuf() のようにFILE*の内部で使うバッファを basic_string に置き換える意味で言いました。
fprintf() でbasic_stringに書き込むことが可能になるイメージ。
C++にはpopen()で開いたパイプFILE*に相当するiostreamがないのでこれで代用可能。
0503デフォルトの名無しさん (ワッチョイ 7f7e-09r9)2018/06/24(日) 12:56:28.50ID:l/Tfpprp0
>>497
ポリモーフィズム=継承ではない
継承もポリモーフィズムを実現するための手法の一つにすぎない
ざっくり言えば同じ名前で異なった振る舞いをするもののことを言う
関数オーバーロードもポリモーフィズム
0504デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)2018/06/24(日) 12:57:48.47ID:6XPmSU1L0
詐欺師が「○○を実現できます」と言った時、実際には「他人の作った○○に便乗します」という意味であることが多いから、あながち間違いでもない。
0507 ◆QZaw55cn4c (ワッチョイ 7f60-DJU/)2018/06/24(日) 16:48:47.47ID:rYGVoBbS0
>>503
>関数オーバーロードもポリモーフィズム
関数オーバーロードはコンパイル時には(どこからどこへコールしているかが)確定しているものですね
そういうものに「ポリモーフィズム」を当てるのは抵抗があります

もっとも wikipedia をみると、私の考えているポリモーフィズムは「部分型付け」(subtyping/inclusion polymorphism) としてサブクラス化されています
これは私の認識を修正しないといけない…
0511デフォルトの名無しさん (ワッチョイ ff0d-GwbS)2018/06/24(日) 20:51:47.44ID:NxOKC53L0
拡大解釈すればできちまうものだからな
いくらでも俺様解釈し放題
それを聞かされている衆目がついていけないと言ったとき
強弁するやつと謙虚なやつでリトマス試験紙みたいになる
0512デフォルトの名無しさん (ワッチョイ 7f7e-09r9)2018/06/24(日) 21:00:48.39ID:l/Tfpprp0
もともとプログラミング言語の理論の方から出てきた言葉なので拡大解釈ではないでしょ
オブジェクト指向言語がそれらの理論から引用してオブジェクト指向におけるポリモーフィズムとは継承とオーバーライドによるサブクラス化のことだと言っているだけ
0514デフォルトの名無しさん (ワッチョイ 9fc3-loLi)2018/06/25(月) 19:33:27.29ID:INT0btTo0
個人的にはどっちかというと「動物ってのはワンワン鳴く奴のことだろ?猫や馬まで動物と呼ぶのは俺様解釈の拡大解釈」
って言ってるような滑稽さを感じる
0524デフォルトの名無しさん (ワッチョイ 1f04-WDJb)2018/06/26(火) 20:14:32.50ID:WXAcQZJd0
アクセス権つき構造体とユニファイドコールシンタックスで疎結合オブジェクト指向だ。
と考えたのだが、ユニファイドコールシンタックスが死んでしまった。
0525デフォルトの名無しさん (ワッチョイ 1f80-2Io7)2018/06/26(火) 22:13:37.78ID:9TMgx4Gk0
ifdefできるだけなしで
どんなコンパイラでも通って同じ動作するコードを書けよ
コレは命令だ
0527デフォルトの名無しさん (ワッチョイ 1f80-2Io7)2018/06/26(火) 23:37:30.28ID:9TMgx4Gk0
最低限、実機で間違いなく動いて
シミュレーターで間違いなく動くようにコード書きなさい

コードはいろんな実機をサポートしないといけない
実機ごとにOSも違う
0530デフォルトの名無しさん (ワッチョイ 7f12-2Io7)2018/06/27(水) 08:36:26.41ID:2Ak+f5Tw0
スレが伸びないのは難し過ぎるからじゃないのか

オブジェクト指向なんかはニワカが口を挟みやすい
あれやこれやと語ることがあると自転車置き場のごとくスレが伸びるんだよ
0535デフォルトの名無しさん (ワッチョイ 42b3-1uqC)2018/06/28(木) 22:38:07.65ID:Uq302Ahl0
クラス/構造体の非静的メンバ変数/関数へのポインタ宣言 ってのを初めて知ったんですが、
これはどういう活用方法があるんでしょうか?

struct S { int data; };
int S::*d = &S::data;

S s1 = {999};
s1.*d; // → 999
s1.*d = 123;
(参考: 改訂第3版 C++ポケットリファレンス p.39)

上の例だと、 s1.data の別名以外の使い道がないように見えます。
長い長い真名の時は局所的に略記できて便利とか?、まさかそれだけですか?
0540はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 466f-yQv9)2018/06/28(木) 23:15:19.82ID:wg8xow/s0
>>535
そのとき S が int 型のメンバを持たなくても int S::*d という変数宣言が許される。
(無理矢理な型キャストをしない限りヌルしか入れられないけど。)
つまり、 S がプリミティブな型でなくクラスであるならば、メンバにかかわらず int S::*d は許容されて、
プリミティブな型だったらエラーになる。

この性質を利用して SFINAE で切り替えれば、与えられた型がクラスであるかどうか判定するものを作れる。
それが >>538 の言う is_class の実装に使えるって話ね。
まあ今なら is_class を使えよって話だから普通のプログラマ的にはどうでもいいけど。

回りくどい利用法なんだけど、まあ実際のところ実務の中で必要とする場面はそんなにないから、
この利用法が代表的なものとして紹介するしかない。
0541535 (ワッチョイ 42b3-1uqC)2018/06/29(金) 00:23:10.79ID:1qhfpQ0p0
初心者の質問に答えていただき有難うございます。
動的にメソッド切り替えは実際に動かして理解できました。
SFNAEで切り替えの方ははコンパイル通る形にはできてませんが概要は理解できました。
0544デフォルトの名無しさん (ワッチョイ 217f-yQv9)2018/06/29(金) 10:08:42.72ID:+bZtBt0B0
メンバ関数の参照はないんですか
0552デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/29(金) 20:59:13.00ID:WoPz4eP90
template<class ... Args>
void func1(Args ... args) {
outputs(buf, args...);
}
こういう可変長引数のテンプレートの場合に別のファイルで利用する場合には
どう宣言したらいいの?

void func1(???);
0554デフォルトの名無しさん (ドコグロ MMc1-9w61)2018/06/29(金) 21:28:52.21ID:/ZgRdmO0M
>>546
> バインダ使うときどうすんだよ
だからバインダ使いまくるとか覚えたての初心者か
って話な

> そりゃあエンドユーザーは滅多にというか一生使わんが
誰もしてない話を勝手に始めて
> そんな話してねえぞ
とか、ギャグかよ w

>>548
>>545の日本語も理解できないのか?
0557デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 04:02:37.35ID:p5lz5e260
関数型テンプレートってのは、型でもなしに、実態でもない。不思議な存在だ。
型だとすれば、関数プロトタイプのように繰り返して宣言しても問題ないはずだ
が、そうするとエラーになる。実態かというと、これ自体では何のコードも生成しない。
利用するときに始めてコードが生成される。
0558デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 08:17:40.24ID:p5lz5e260
unsigned long address;
int dt;
*(char *)&address = dt;
コンパイラエラーにはならないが動作しない。ところが
uint8_t *address ;
*address = dt;
これだと動作する。なぜなんだ? 
0560デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 08:47:45.01ID:p5lz5e260
=0x20000;を書き忘れていた。あとは上に同じ。
0563デフォルトの名無しさん (ワッチョイ adbd-7ca/)2018/06/30(土) 08:53:37.93ID:yaCLVjK30
前者はaddressの最初(または最後)の1byteだけを書き換えようとしているけど、それは意図通りなの?
後者は0x20000番地の値を書き換えようとしてるけど、そこは書き換えてもよい領域なの?
0564562 (ワッチョイ 2193-OY1D)2018/06/30(土) 08:54:40.20ID:+ldexLXj0
おっと、未定義動作がらみで「何が起きても不思議じゃない」かも知れん。
リトルエンディアンの機械での素朴な予想レベルでの「期待通り」ね。
0567デフォルトの名無しさん (ワッチョイ 869f-Rle/)2018/06/30(土) 10:44:57.06ID:6fEIEQu00
>>546
c++で閉じてるなら関数ポインタ渡すインターフェイスより、
クラスを継承してメソッド実装させるインターフェイスのが普通だろ。
まあcからの関数ならよくあるが。

>>557
単なる型付マクロだっつーの。
0571デフォルトの名無しさん (ワッチョイ 217f-yQv9)2018/06/30(土) 12:27:29.89ID:YQWqrdY/0
今どきマクロなんて使うアホがいるのか
0572デフォルトの名無しさん (ワッチョイ 79b3-HrKv)2018/06/30(土) 12:30:54.83ID:gIC/SSHD0
スフィ姉を使った技についてスレッドがあってもいいかもしれない。
0574デフォルトの名無しさん (ワッチョイ 79b3-HrKv)2018/06/30(土) 12:55:30.82ID:gIC/SSHD0
スフィ姉がいるならスフィ妹もいるかもしれない。
0576デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 16:15:54.20ID:p5lz5e260
>>563
damecaseの理由がわからない。
void Test::clear(unsigned long baseadd, unsigned int dt, int leng)
{
#if(okcase)
uint8_t * addp = (uint8_t *)baseadd;
for(int i=0; i<leng; ++i){
*addp++ = dt;
}
#endif
#if(damecase)
unsigned long addp = baseadd;
for(int i=0; i<leng; ++i){
*(char *)&addp++ = dt;
}
#endif
}
0577デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 16:20:31.87ID:p5lz5e260
baseadd=0x20000でダンプすると初期値は全部ffが入っている。
leng=100としてdt=0を書き込むとokcaseはOK100バイト0クリアされる。
damecaseは全く反応しない。
0578デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 16:25:07.29ID:p5lz5e260
>>566
とおるよ。頭の中でCastしてくれたら
0579デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 16:32:50.93ID:p5lz5e260
>おっと、未定義動作がらみで「何が起きても不思議じゃない」かも知れん。
>リトルエンディアンの機械での素朴な予想レベルでの「期待通り」ね。

どうして?
何処が、どういう理由で未定義なの?
リトルエンディアンが問題というのはバイトオーダーが関係するということ?
1バイトのエリアに代入するのにバイトオーダーが関係するはずはないでしょ。どいういうこと?
char*pのpは1バイトデータのポインタ(アドレス)だよ。代入先が1バイトなのでエンディアンは関係ないと思うが、、、
0584564 (ワッチョイ 2193-OY1D)2018/06/30(土) 20:23:16.90ID:+ldexLXj0
>>579
「ある型へのポインタの値をキャストで別の型へのポインタとして扱い、
その(キャストで得られた)ポインタに対して * 演算子で格納する」行為自体が
規格で未定義になってるかも知れんてこと。確実じゃないんだけど。

キャストの時点でか、*でアクセスしたときか、格納の時か、
どことは言えないけど何となく未定義クサい感じがする。
0585デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/06/30(土) 21:00:17.02ID:ozTCpxdq0
↓addpをインクリメントとか頭悪いの?
*(char *)&addp++ = dt;
unsigned longのaddpをインクリメントしてる
addpはポインタじゃないぞ。。。

きっとバカが動作しないといってるのは
落ちるということではない

動作はするが期待どおりの結果にならないということで間違いない
バカはなにがやりたいのか意味不明
0586デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/06/30(土) 21:07:38.23ID:ozTCpxdq0
unsigned long addr = 12345678;
char* pByte = &addr;
ならいけるハズ

*pByte++ = dt
で leng が sizeof(unsigned long)/sizeof(char) 回までの繰り返しなら
普通に落ちずに動作するハズ

ばああああああああああああああか
しかいないわこのスレ
0587デフォルトの名無しさん (ワッチョイ 79b3-HrKv)2018/06/30(土) 21:10:52.08ID:gIC/SSHD0
std::addressof()。
0588デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/06/30(土) 21:17:55.34ID:ozTCpxdq0
いやねcすら理解できてないヤツラが
c++とか一億年早い

こんなヤツラがc++でコード組んでるかと思うと
ぞっとするわ。。。

シロウトはおとなしくjavaにしときなさい
0589デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/06/30(土) 21:39:50.97ID:ozTCpxdq0
for(int i=0; i<leng; ++i){
((char *)&addp)[i] = dt;
}

バカ向けのコードを書いてやったぞ
コレでバカにとってはすべて解決

コレがなんのことか分からないなら
もう二度とプログラムなんかやらないほうがいい

センスない、むいてない
0591デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/06/30(土) 21:58:37.22ID:ozTCpxdq0
ぐぐったぞ

http://d.hatena.ne.jp/yohhoy/20120220/p1

> 文字型。規格ではchar*, signed char*, unsigned char*が別の何かを指すことが特別に許されています。
> これは文字型がメモリ上の任意のaliasになり得ることを意味します。

どうかしたのか
もうねバカばっかりで困るわマジで

池沼しかいないの? このスレ?
0592デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/06/30(土) 22:05:16.74ID:ozTCpxdq0
ちなみになchar以外で変なメモリアドレス(メモリ上有効なアドレスあっても)の位置からcharより大きいサイズの数値を参照すると
memory wrapの切れ目の問題(つまりwrap over)で
bus errorを普通に起こす計算機がある

このスレにいるようなマヌケたち以外にとっては常識だからな
0594デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 22:22:23.05ID:p5lz5e260
>&いらん

コンパイルエラーにはならない。ワーニングにもならん。という事実を書いている。
些末なことで糞ほどワーニングやエラー出すC++だ。ワーニングにならんということは正しい
ということか、コンパイラがアフォかさもなくば、何か別の意味があるということになる。
わかるか? お前にも質問の意味が分かるように、そしてちゃんと回答ができるようにもう一度簡単に書いてやろう。
1.正しい
2.コンパイラがアフォ
3.意図とは別の意味になっている。
さあどれが正解だ。答え見ろ。
0595デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 22:29:49.98ID:p5lz5e260
>584
はあー、未定義かもしれんて? 未定義ならエラーになるだろ。
0596デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 22:32:41.52ID:p5lz5e260
>>589
理由を書いてごらん。理由がないと回答にならんよ。
0597デフォルトの名無しさん (ブーイモ MM4d-zt73)2018/06/30(土) 22:38:33.52ID:V0JwxTbZM
>>585
俺はやらないがそこは問題じゃない。
アドレス値が格納されている正数を1ずつ増分しているだけだ。

>>589
お前は>>576のコードをそれに書き換えて正しく動作すると思ってるのか?

>>582>>583で答えが出てるのに、馬鹿には理解できなかったのだろうな。
俺なら恥ずかしすぎて首吊って死ぬわ。

>>594
4. お前がアフォ
0598デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/06/30(土) 22:47:55.08ID:ozTCpxdq0
なにが書いてごらんだ
バカのくせにえらそうに。。。

addpはアドレスじゃない

で、addpはどこのアドレスをさしてる?
で、なにがインクリメントされてる?

バカにはまだわからないらしいわ、、、

int hoge[10]
int boo = 1234;
char* hogeee = (char*)hoge;

ex1

for (int i = 0; i < 10; ++i) {
*((int*)hogeee) = boo;
hogeee += sizeof(int) / sizeof(char);
}

ex2

for (int i = 0; i < 10; ++i) {
((int*)hogeee)[i] = boo;
}

ex1とex2、この違いわかる?
わからないなら、もうすべてを諦めたほうがいい
オレはオマエを諦める
0599デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 22:48:11.24ID:p5lz5e260
>>582>>583で答えが出てるのに、馬鹿には理解できなかったのだろうな。
>俺なら恥ずかしすぎて首吊って死ぬわ。

ではその理由を書いてごらん。理由がないと回答にならんよ。理由が説明できないなら試験も受からんだろ。
0600デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 22:50:20.24ID:p5lz5e260
>で、addpはどこのアドレスをさしてる?
>で、なにがインクリメントされてる?

まず、どこをさしているのか?何がインクリメントされているのか答えてごらん。
0601デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/06/30(土) 22:51:33.81ID:ozTCpxdq0
致命的に脳ミソが足りないのは理解した
アンリカバブルだ
0602デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 22:52:40.38ID:p5lz5e260
お前は解ったふりをしているだけだよ。言葉にして説明できないならな。
0603デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/06/30(土) 22:54:40.58ID:ozTCpxdq0
ここまで説明して
なんで同じ結果にならないか
分からないならもうムリだからな

向いてない
諦めなさい
なにごとも諦めが肝心
0604デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 22:55:43.85ID:p5lz5e260
誤魔化して変なコードを追加するな。問題はこれだ。
unsigned long addp = baseadd;
for(int i=0; i<leng; ++i){
*(char *)&addp++ = dt;
}
このコードが何故動作しないか? それを説明するのが問題なのだ。
0605デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 22:57:10.06ID:p5lz5e260
多分解っている人なら、直ぐに説明できる筈だ。
分からない人は説明できない。罵るのはさらに愚。
0606デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/06/30(土) 22:58:00.94ID:ozTCpxdq0
同じ結果にならないことはすでに説明してるからな

アドレスを格納する変数を使わないで同じ結果にしたいならどうすばいいか
まで書いた
それに対する補足説明まで書いた

もうこれ以上書くことはない
ムダ
0607デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 23:02:38.77ID:p5lz5e260
>アドレスを格納する変数を使わないで同じ結果にしたいならどうすばいいか
>まで書いた
>それに対する補足説明まで書いた

思わせぶりな回答を書いて欲しいといっているのではない。頭がいいと思ってほしいのかもしれないが
それでは「思わせぶり」でしかない。説明としてきちんとした形式を備えた自信のある回答を書いてごらん。
0609デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 23:10:58.15ID:p5lz5e260
>608
「教えない」習性の人は成長しない。ということは知っているだろ。習性というくらいだから今に始まったこと
ではない。つまり嘗て勉強を始めた時点ですでに成長はとまっているということだ。
0610デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 23:19:33.75ID:p5lz5e260
俺は無償でお前等に考え方、回答の方法を教えている。教えることが一番勉強になる。
いままでのところ質問にたいして誰も合格点をあげることができるような回答がない。
0611さまよえる蟻人間 ◆T6xkBnTXz7B0 (スフッ Sd22-xqsk)2018/06/30(土) 23:20:06.78ID:ru2k3pO7d
addpの値として期待されているのがアドレス値X。&addpは、アドレス値Xを格納している変数addpのアドレス値Y(ポインタの値)。代入によって期待されているのが、アドレスXへのdtの値の格納。
XはYではないから、間違い。
0615デフォルトの名無しさん (ワッチョイ 469d-mzC7)2018/06/30(土) 23:55:15.02ID:p5lz5e260
>>612
正に初歩的な質問というものは質問自体に間違いが含まれている可能性がある。
そのことに先ず言及できたのは君が初めてだ。素晴らしい。

質問者が正確に質問できた時点で回答は既になされたも同然だといわれるが今回も
例外ではない。これで終わる。
0616デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/07/01(日) 00:08:16.38ID:fc6M1Ev70
なめたことをしてくれたな。。。

558 名前:デフォルトの名無しさん (ワッチョイ 469d-mzC7)[] 投稿日:2018年06月30日(土) 08時17分40秒24 [朝] ID:p5lz5e260 [2/19] (PC)
コンパイラエラーにはならないが動作しない。

594 名前:デフォルトの名無しさん (ワッチョイ 469d-mzC7)[] 投稿日:2018年06月30日(土) 22時22分23秒05 [夜] ID:p5lz5e260 [8/19] (PC)
コンパイルエラーにはならない。ワーニングにもならん。という事実を書いている。

 (ワッチョイ 469d-mzC7)  ID:p5lz5e260

オマエを特定した
震えて眠りなさい
0617デフォルトの名無しさん (ワッチョイ 025e-2ROK)2018/07/01(日) 00:18:16.61ID:8lWKFGMK0
ことさらに難しいコードを書いて得意がってる馬鹿がうようよ

1行に詰めるのがプロか?

新入社員が読めないようなコード書いて喜んでいるお前らが
バグを仕込む糞プログラマだわ
0619デフォルトの名無しさん (ワッチョイ 2980-iScA)2018/07/01(日) 01:07:34.26ID:fc6M1Ev70
プログラマにまともなコード書いてもらうも仕事の一つだからな

まともなコード書いてもらうには
こっちもプログラムが分かってないといけない

日本はウンコみたいな低品質低能のプログラマしかいない
いかに踏みとどまらないといけない最低限の一線のラインを越えさせないようにするか
そこが腕のみせどころになる

このスレみれば分かる通り
日本のプログラマは低学歴低能しかいないことがよく分かるハズ

しかも相手がなにを期待してるかも読みとれない
コミュニケーション能力も著しく低い
こんなのに仕事をお願いするほうも大変だからな

可読性が高いコードを書くことは重要だが
それ以外にもイロイロなものが欠落している
0620デフォルトの名無しさん (ワッチョイ aec6-yQv9)2018/07/01(日) 05:53:57.18ID:+8c6aI200
struct addp_t
{
int& operator ++ (int)
{
return a;
}
int a;
};

int main()
{
addp_t addp;
&addp++;
}

# アンカーつけるのももったいない
# 5chという狭苦しい箱庭の中で目撃したことが
# おまえの全てのようだな
#
# なぜ学歴が出てくるのかよくわからんが
# 高学歴のPGくらいどこにでもいるよ
0621デフォルトの名無しさん (ワッチョイ 2193-OY1D)2018/07/01(日) 06:17:56.60ID:KJj1sYCg0
>>591 ありがとう。
(signed/unsigned)char* のポインタで他の型の格納領域にアクセスすることは
規格で許されてるんだね。char* だけ特別扱いってことか。

俺も >>581 の指摘を見て検索して同じページに到達したんだけど、
> 文字型。規格ではchar*, signed char*, unsigned char*が別の何かを指すことが特別に許されています。
> これは文字型がメモリ上の任意のaliasになり得ることを意味します。
の部分を見つけることができなかった。

すると >>558 のコードに未定義動作を引き起こす点はないのだな。
0623222 (ワッチョイ 02bd-AF1h)2018/07/01(日) 14:42:57.68ID:H+9S2vGe0
循環参照があっても無問題で解放するスマポ作ったけど何か質問ある?
http://codepad.org/Hu6vP4qR

いやまあ確かに解放に当たり(塗り潰しのアルゴリズムで)循環を検出するだけでは済まず、
 *(this->m_pRef)の解放条件が*thisの解放「だけ」である
ということの証明が必要やったわ;(訂正1)
ここで*thisはsumapo<T>インスタンス、*(this->m_pRef)は*thisが保持しているcounted_refオブジェクト
(T型のインスタンスに参照カウント等を付加してwrapしたもの)。
詳細はsumapo<T>::proveRoot()のコメント参照、

これ以外は訂正は無し
0624222 (ワッチョイ 02bd-AF1h)2018/07/01(日) 14:45:14.11ID:H+9S2vGe0
>>225
Tのメンバを公開(publicにする)するだけで、
sumapo<T>の定義内のコードからTが保持するsumapo<*>にアクセスできるというなら
>>226の忠言に従ってコードを書いてみると良いんじゃー

一方リフレクションが使えるなら、sumapo<T>::setLandowner()メソッドは不要となる
(これのメソッド>>222において
>あんま使い勝手の良いものにはならんかったorz
>m_pCarやm_pCdrとptrが裏で手を握る必要がある
 が指していたブツ。>>222の時点でtest01()が通るコードは書いていたんじゃわ;;
0626デフォルトの名無しさん (ワッチョイ 219f-iScA)2018/07/01(日) 15:00:52.38ID:8/sCKaWm0
>>624
なんつうロングパスよ、と思ったが、コードを書いた姿勢だけは褒めてやる。
とはいえ、俺は最近「馬鹿が書いたコードは読む価値がない」と結論を出したので読まないが。
(大体において意味不明な制御を行っており、結果、
解読に時間がかかる割に得る物が全くない)

それ、アルゴリズム説明してみ。
そしてそれが正しく動くとして、何故C++がそれを採用しないかも説明してみ。
0628222 (ワッチョイ 02bd-AF1h)2018/07/01(日) 15:44:14.33ID:H+9S2vGe0
クラスTのオブジェクトを参照するスマポsumapo<T>のインスタンスpaが、クラスTのインスタンスaを参照している状況を
 pa→[a]
と書くとする。ここで、[a]は、aに参照カウントその他を追加してwrapしたもの。(>>623におけるcounted_refクラスに当たる。
[a]はインスタンスaにつき唯一だが、[a]を参照するsumapo<T>は複数有り得る。

で、paとpbが循環参照しているとは、次のような状況である。
 例1: pa→[a], pb→[a]、ここでpbはaのメンバ(paとpbが循環参照
 例2: pa→[a], pb→[b], pc→[a]、ここでpbはaのメンバ、pcはbのメンバ(pa、pb、pcが循環参照

例1では[a]がpaとpbから参照されていることになっており(参照カウント2
結果、paの解放時、paのデストラクタで[a]の参照カウントが1になるが0にはならないので、
参照カウントだけに頼るとその時点でpaのデストラクタは[a]が解放されない。(引き続きpbから参照され続ける。
一方、pbの解放条件は、[a]の解放である(∵pbがaのメンバであるため)。というわけで解放がデッドロックに陥る。

しかしpa→[a]==>pb→[a]、という参照関係(paのみが参照関係の根である)をpaの解放時に把握できていれば、
paの解放で[a](とそのメンバpb)を解放して無問題であることがワカル
この参照関係のうち、「==>」をpb.setLandowner(&pa)とすることで設定し、-- (1)
paの解放時に全体として参照関係の根がpa自身「のみ」であることを証明する -- (2)
ことにより、安全に解放が行える。((1)と(2)がshared_ptr<T>にたいしsumapo<T>で追加になった要素

標準ライブラリに入っていないのは、(2)の証明コストがイマイチかかるからだろうJK
0629222 (ワッチョイ 02bd-AF1h)2018/07/01(日) 15:48:07.39ID:H+9S2vGe0
>>627
pa→[a]==>pb→[a]、という参照関係において、pbの地権者はpa。
なお、ソースコードコメント内には「立地」という言葉も出てくるが、pb立地が[a]。
0630デフォルトの名無しさん (ワッチョイ 219f-iScA)2018/07/01(日) 16:55:50.02ID:8/sCKaWm0
>>628
まずそういうのはインタフェースを揃えろ。
(俺はスマポは使ったことがないが、俺の理解の範囲では)
お前はスマポの仕様を勘違いしている。

オブジェクト側をラップするのはソースコードの全面的書き換えが必要になるだろ。
だからそんなことはしてない。
スマポも普通のクラスでしかなく、スマポ側に制御に必要な情報全てを持っている。
オブジェクトと癒着はしてないんだよ。
> 一般的な実装では、 std::shared_ptr は2つのポインタを保持します。
> 格納されたポインタ (get() で返されるもの)
> 制御ブロックへのポインタ
> https://ja.cppreference.com/w/cpp/memory/shared_ptr

が、まあ、言いたいことは分かるし、ここは本質的には重要ではないので、
今回はお前のオレオレ用語のままでいい。


さて本題だが、(1)は誰が管理するんだ?
プログラマが明示的に手動で管理するのなら、現行のshared_ptr/weak_ptrと手間が変わらない。
だから自動的に出来る必要があるが、これは出来るのか?

具体的に言えば、お前が言っている「参照関係の根」をshared_ptrで、
「pa→[a]==>pb→[a]、という参照関係」のpbをweak_ptrで実装しろというのが現行の仕様だが、
これに対して何が便利になってるんだ?
0632デフォルトの名無しさん (ワッチョイ 219f-iScA)2018/07/02(月) 01:32:55.93ID:Ael8RIVm0
>>631
それはC++的には意味がないだろ。

結局、現行の仕様が何故そうなのかを理解出来ない馬鹿が吠えただけだろ。
まあJavaScripterなんて所詮こんなもんだが。
「スクリプト言語使いをプログラマと呼ぶな」というのは、多少は当たってる。
彼らが書けるのは「動けばいい」程度のコードまででしかない。
0635デフォルトの名無しさん (ワッチョイ 927e-mVTy)2018/07/02(月) 10:28:58.92ID:CEdwz05Y0
pythonしか使えないやつが作った特定のサイトから画像を大量にダウンロードするだけのツールが
クソ遅いうえにメモリ4GBも使ってたので頭pythonってクソだなって思った
0636デフォルトの名無しさん (ワッチョイ ad8a-4/UQ)2018/07/02(月) 11:36:32.45ID:+g59n7Y00
使える言語を聞かれてC++含めて複数答えたら
確かPHPあたりで「それプログラムじゃなくてスクリプトだよね」って言われたことはあるな
そこまで上から目線で突っ込むことか?とイラッとした記憶があるな
0640デフォルトの名無しさん (ワッチョイ 79b3-HrKv)2018/07/02(月) 16:41:11.07ID:HeCnpISr0
>>636
PHPは言語自体の性能が低いので使いこなすのはかなり難しい。
Javascriptも同じ。
つまり、楽に性能を出せるC++に乗り換えた方がいい。
0641デフォルトの名無しさん (ワッチョイ 79b3-HrKv)2018/07/02(月) 16:41:41.19ID:HeCnpISr0
乗り換えるも何もここはC++スレじゃないか。
0644デフォルトの名無しさん (ワッチョイ 219f-iScA)2018/07/02(月) 22:40:34.15ID:Ael8RIVm0
お前らは知らないからそんな呑気なことが言える。
実際、JavaScriptはマジでゴミコードの山だ。
商用サイトでも糞重いしリークしまくりだ。

PHPはJavaScriptに比べ露出は低いが、OSSを見る限りやはり糞だ。
とはいえコードの質はPHP>>>JavaScriptだが。
DB接続があり、初心者にもコードの質が見える所が違うのだろう。
PHPerは虐げられているが、その分勘違い野郎は少ない。
最悪なのはJavaScripterだ。

一般のスクリプト言語(Python, Ruby含む)とC++等のプログラミング言語の違いは、
前者は圧倒的に「一回動作させれば終わり」な使われ方をすること。
だから、メモリリーク?何それ美味しいの?
コードが美しい?そんなことよりちゃっちゃと書いて実行させた方が早いでしょ、となる。
長期的保守の必要がない使い捨てコードばかり書いているから、
保守に耐える品質のコードを書けるようにならないだけ。

だから正確には、
「保守に耐える品質のコードを書けない馬鹿をプログラマと呼ぶな」であり、
それがほぼ「スクリプト言語しか使えない馬鹿」と一致する、というだけ。
一般的に(JavaScript除く)スクリプト言語は圧倒的に遅く、
味見ではなくガチならC/C++に書き換えるケースも多々発生する、というのも
これを後押ししている。

とはいえ、JavaScripterやPHPerみたいな馬鹿揃いでも
何とかるように出来ているのがWeb系()の凄いところ。
あれは学ぶ価値あると思うぞ。
色々C++では無駄に難しく考えすぎていたな、ということに気づかされるから。

今更導入されたラムダもしかり。あれは手抜きにはかなり便利だ。
コルーチンもそうでしょ。無しで同じ事をやろうとするとそれなりにエグくなる。
0645デフォルトの名無しさん (ワッチョイ 02bd-AF1h)2018/07/03(火) 00:37:00.88ID:kg4YTZEy0
>>630
>さて本題だが、(1)は誰が管理するんだ?
いやすまん>>628の最後の一文ではそれをすっかり失念してたわ;;
標準ライブラリにsumapo<T>が入りえない最大の理由は、(1)の管理を手動でせねばならない、という使い勝手の悪さのが最大の理由
>>222で書いた「使い勝手の悪さ」のことじゃわ

これを自動化するにはリフレクションが要る

それはそうとして、
 1. オブジェクト側をラップする
というのと、
 2. オブジェクトと癒着
は別の話じゃわ;

1は標準的なshared_ptrの実装ではそうなっている(counted_refという名前のクラスは実在の実装から拝借したものであって漏れの独創ではない
だいたい
>[a]はインスタンスaにつき唯一だが、[a]を参照するsumapo<T>は複数有り得る。 (>>628)
なので、参照カウンタを所有するのはオブジェクト側をラップした[a]以外ありえんのじゃわ
[a]を参照する全てのsumapo<T>は、[a]より長く生き長らえることは無い

2はsumapo<T>にとっては必要だが、shared_ptrには要らん
0646デフォルトの名無しさん (ワッチョイ 02bd-AF1h)2018/07/03(火) 00:40:48.76ID:kg4YTZEy0
ちなご興味のお有りの方にカミングアウトすると、>>623のコードのSUMAPO_ONマクロを0にすると
sumapo<T>は普通のshared_ptr<T>になりぬ
動作やコードを比べて見られるのも一興かと、
0647デフォルトの名無しさん (ワッチョイ 02bd-AF1h)2018/07/03(火) 01:12:15.05ID:kg4YTZEy0
ちな(2)、
>「pa→[a]==>pb→[a]、という参照関係」のpbをweak_ptrで実装しろというのが現行の仕様だが(>>630)
これは、ちげう

weak_ptrを使って[a]の解放の根がpaのみであることを証明できるのは、実際に[a]を解放したときに限られるが
もし[a]の解放の根がpaだけではないと反証されたら[a]を解放してしまった後で藻前責任とれんの…?

一方sumapo<T>はそんな迂闊なことはせず、解放「前」に証明を試みるんである
0648デフォルトの名無しさん (ワッチョイ 927e-mVTy)2018/07/03(火) 05:12:51.76ID:XnJOzKj10
>>639
だから頭pythonだと言ったろ
俺がこれ遅くねえかって言ったら頭ひねった結果理由がわからんと言ってきた
俺が作り直してやったら速度が倍増したけどHTTPリクエストするだけでメモリを数十MB使われたからPythonもクソだわ
0649デフォルトの名無しさん (ワッチョイ 02b3-9w61)2018/07/03(火) 05:40:01.78ID:2wRh2EpV0
>>648
> 俺が作り直してやったら速度が倍増したけどHTTPリクエストするだけでメモリを数十MB使われたからPythonもクソだわ
頭の悪い知ったかに絡まれるPython可哀想 w
低能しかいない職場なのかよ
0650デフォルトの名無しさん (ワッチョイ 219f-iScA)2018/07/03(火) 06:33:44.96ID:7Nykwcxu0
>>645-647
なるほどお前が何も理解してないのは分かった。

> これを自動化するにはリフレクションが要る
これは違う。
仮にリフレクションがあったとして、何をどうするか説明してみろ。
お前には出来ないから。

> weak_ptrを使って[a]の解放の根がpaのみであることを証明できるのは、実際に[a]を解放したときに限られるが
> もし[a]の解放の根がpaだけではないと反証されたら[a]を解放してしまった後で藻前責任とれんの…?
これも違う。
お前はweak_ptrの仕様を理解していない。
お前の言い分だと、「現行の仕様では循環参照を実装出来ない」事になるが、
これは明確な間違いだろ。
お前はこんな当たり前の事すら理解出来ないほど馬鹿なんだよ。

そもそも、
> 標準ライブラリに入っていないのは、(2)の証明コストがイマイチかかるからだろうJK (>>628)
これ自体が間違ってるんだが。


もう君は相手にする価値のない馬鹿ということでいいかな?
JavaScripterなんてこの程度の馬鹿しかいないし、お前もそうだ、でしかない。
0652デフォルトの名無しさん (ワッチョイ 45fa-2e90)2018/07/04(水) 21:55:39.61ID:gFgZc5FG0
MFE
0653デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/05(木) 00:13:55.65ID:F5EmMeHI0
よくわからんがリファレンスカウンタがゼロになったら解放するしょうもないプログラムか
MSのCOMもそんなんだったような覚えがあるわ
0656デフォルトの名無しさん (ワッチョイ 5f12-Rmg1)2018/07/05(木) 01:14:09.68ID:gdOfHcx+0
>>654
stableにはさせん、させんぞぉ!
という層でC++は出来てる

常に進化するので、それに付いていけないB級はいらない
なので、あなたは使わなくていい
使いたいか、そうでないか、人に聞く前に自分の欲望で決めるのがC++だ
0657デフォルトの名無しさん (ワッチョイ e7c3-y/Vi)2018/07/05(木) 10:08:22.57ID:LvrOI/wi0
>>656
C++0Xと騒がれていた時代のC++03のように
スタンダードなレベルに普及しているかという
趣旨の質問でした。

調べてみたらC++11くらいなら主な実装系で
サポートできているっぽいですね。
新規案件では採用してみたいです。

Web界隈は新し物好きの若者が多くて
勝手に栄枯盛衰していくコミュニティですが、
C++は化石みたいな人が多い空気があるので、
C++11以降、コミュニティが追従しているのか
ちょっと心配ではあります。
0665はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-UVFs)2018/07/05(木) 18:59:41.66ID:l9X7uzb+0
仮引数リストが空の場合の解釈が違ったりとか、
文字リテラルや文字列リテラルの型が違ったりとか、
地味な非互換はいくつかある。

そのあたりを踏まなければおおよそ大丈夫。
0666デフォルトの名無しさん (ワッチョイ 479f-Rmg1)2018/07/05(木) 21:02:37.89ID:osRjg7F+0
>>657
お前含めてWeb界隈、特にJavaScriperには馬鹿しかいないけどな。
これは印象ではなく、事実な。

何を使うかはお前が決めればいいだけ。
実際、Go/PHPではstableですか?なんて聞く馬鹿はいないだろ。
この違いを理解出来ないのはJavaScripterが馬鹿な証拠。
0667デフォルトの名無しさん (ブーイモ MM2b-XvZQ)2018/07/05(木) 21:24:33.79ID:D+Mkul5xM
>>663
動くと思うけど、
標準仕様にファイル名の規定はなく、どのコンパイラが使われるかはあなたのプロジェクトのビルドスクリプトの設定次第だよ

>>666
私はjs使えませんアピールしてんの?
0669デフォルトの名無しさん (ワッチョイ 479f-Rmg1)2018/07/05(木) 22:59:19.40ID:osRjg7F+0
>>667
> 私はjs使えませんアピールしてんの?
そりゃお前だろ。

お前が本当にJavaScriptを使えるなら、今のJavaScripterがどれだけ酷いか知ってるはず。
そしたらそんなことは到底言えないだろ。
実際のサイトのコードも大半がゴミだし、JavaScriptのスレで定期的に盛り上がる話題は

・変数の初期化前の挙動を理解するべき ← そんな必要ない、C#ならSyntaxError
・セミコロンはどこに打つべきか ← アホか?C++ならSyntaxError

なんだからな。
あいつらがデータ構造について議論した試しがないし、それ以前にOOPも理解していない。
だからあいつらの定義では、

・上級者=新しい文法を使いこなせる人

となり、657や667みたいな投稿が発生する。
(要はJavaScripterは657,667含めて全員ゴミってだけだが)
C++の連中はそんなこと思ってないから、新文法も必要なときに使うだけであって、
必要ないと判断してるから使わないだけ。
積極的に使わないといけないと考えること自体が間違ってる。
C/C++の歴史は長いから、最低限必要な物は既に整備され尽くしてる。
(JavaScriptやPHPみたいなヘルパースクリプト出身ではない)
0671デフォルトの名無しさん (アウアウウー Sa0b-KMj/)2018/07/05(木) 23:25:50.10ID:ZcYhAMJSa
>>669 新文法を必要ないと判断しているということはautoやrange-based forとか使ってないの?
0672デフォルトの名無しさん (ワッチョイ 5f34-M0Jq)2018/07/05(木) 23:27:52.02ID:kXJXvyLk0
古参でも理解できるプログラム書かないと仕事にならない場合もあるから
最悪C++使わないでC言語オンリーになる場合もある
というかC++自由に使える仕事の方が少ないよ
0673デフォルトの名無しさん (アウアウウー Sa0b-KMj/)2018/07/05(木) 23:52:49.42ID:ZcYhAMJSa
C++の仕事にCしか書けない人が参加するのはありなのか?
0674デフォルトの名無しさん (ワッチョイ e7c3-y/Vi)2018/07/05(木) 23:57:07.38ID:LvrOI/wi0
>>666
あなたが無知すぎるでしょ。
趣味で使うのならばなんでも好きなの使えばいいが、
実務で使う場合は周りのことも考慮する必要があるのです。

PHPやPythonでStableというのは
公式インタプリタが正式リリースされたということ。
コミュニティも追従して最新に対応する。

C++の場合、影響力ある実装系がたくさんあるせいか
Stable化するタイミングが分かりにくく
コミュニティも追従してこない。
0675デフォルトの名無しさん (ワッチョイ e7c3-y/Vi)2018/07/06(金) 00:02:48.84ID:CKHx9JNG0
>>669
あなたのいうJSはどのJSですか?
ES5ですか、ES6ですか、ES2016ですか2017ですか
はたまたCoffee Scriptですか、Type Scriptですか

一括りに語ってる時点で何もわかっていない。
0677デフォルトの名無しさん (ワッチョイ 479f-Rmg1)2018/07/06(金) 00:42:23.77ID:sc4caQgm0
>>674
> 趣味で使うのならばなんでも好きなの使えばいいが、
> 実務で使う場合は周りのことも考慮する必要があるのです。
じゃあここで聞くなよメンドクセエ奴だな。

お前が決められる立場なら勝手に決めろ。
ただ、その程度で実務でグループ開発する際に決められる立場にあるとは思えないし、
仮にそうならよほど酷い職場だとしか。

> コミュニティも追従して最新に対応する。
Python3やPerl6見てそう思うのなら頭おかしいだろ。
PHPもいまだに5.4とかだったりするのも俺には謎だが。
(まあ何か理由はあるのだとは思うが)

> C++の場合、影響力ある実装系がたくさんあるせいか
ダウト。組み込み等で選べない場合はそれを使うしか無く、
選べる場合はMSVC/gcc/Clangの3つしかないだろ。

> コミュニティも追従してこない。
だからそういう問題じゃねえんだよ。
お前がどのコンパイラを使うか、それを決めればいいだけなんだよ。

逆にお前が勘違いしている「コミュニティの追従」があったら何が嬉しいんだ?


>>675-676
スレチ
0679デフォルトの名無しさん (ワッチョイ bf9f-1qXk)2018/07/06(金) 00:51:22.50ID:ti7OEIpy0
>>677
お前もダウトだがな。
>MSVC/gcc/Clangの3つしかない
こいつらバージョンが違えば全然違う実装と言っていいくらい違うぞ。
最近はもうバージョン違えば動作違うなんて当たり前なんだから使う方が気を使えやって
立場が多いのかね。
0680デフォルトの名無しさん (ワッチョイ 479f-Rmg1)2018/07/06(金) 01:02:10.76ID:sc4caQgm0
>>679
> 最近はもうバージョン違えば動作違うなんて当たり前なんだから使う方が気を使えやって
> 立場が多いのかね。
自前でガチで組むならコンパイラのバージョンは基本固定だろ。(必要ない限り上げない)
OSSなら基本は最新バージョン追従で、逆に旧バージョンなんてシラネでいいだろ。
(そもそもコンパイラのバージョンが上がって問題になるケースも希だが)

むしろお前はどんな環境でやってるんだ?
0681 ◆QZaw55cn4c (ワッチョイ 5f60-sule)2018/07/06(金) 01:15:00.00ID:XDF8ToBN0
>そもそもコンパイラのバージョンが上がって問題になるケースも希だが

そ・れ・が、
cuda9 はコンパイラ(VS2017) のバージョンが上がって、さっぱりコンパイルできない有様なんです…
0682デフォルトの名無しさん (ワッチョイ 479f-Rmg1)2018/07/06(金) 02:16:34.46ID:sc4caQgm0
>>681
それはcudaの問題で、C++側の問題ではないのでは?

もっとも、cuda環境なら俺なら当然コンパイラもcudaのバージョンも固定、
可能であればディスプレイドライバも固定で行くが。

cudaのOSSなら、それは最新版追従しかないし、
それで旧コードが駄目ってのなら、それはstableではないとしか。
ただcudaの場合はかなり特殊だからなー。
DirectXも「互換性?なにそれおいしいの?」状態だったらしいし。
あの辺は抽象化されてないからどうにもならんでしょ。
むしろ抽象化コストを嫌っているわけだし。
0683 ◆QZaw55cn4c (ワッチョイ 5f60-sule)2018/07/06(金) 02:28:22.24ID:XDF8ToBN0
>>682
VS2015 を今でも使わせてもらえるのなら、もう VS2015 は固定されているので、それでいいのですけれども…今はVS2015は「一般には」公開されていないようです
VS2017 は、なにかを追加するために MS にアクセスすると、ついでにコンパイラのバージョンもあげてしまうのです
もとに戻すのを繰り返しましたが、もう疲れました…

というか、Linux では cuda は gcc を使っているようですから、Windows でもそうしてほしいのですが…
0684デフォルトの名無しさん (ワッチョイ 479f-Rmg1)2018/07/06(金) 02:44:10.71ID:sc4caQgm0
>>683
> VS2017 は、なにかを追加するために MS にアクセスすると、ついでにコンパイラのバージョンもあげてしまうのです
なるー。自動アップデート死ね、って奴か。
それはかなり厳しいね。

回避するには、自前でVS2015マシンとVS2017マシンを分けるのが一番手っ取り早いだろう。
これが無理なら、試しにユーザアカウントを別にしてみればどうだろう?
(VS2017のアップデートも別人に対しては有効化されないだろと予想)

無理なら、、、確かnVidiaはdockerを用意するとか言ってなかったっけ?
Win10ならdockerはデフォで対応してたはずだし。

(つっても俺はcudaは2.2-4.xの頃しか使ったことがないので、現在の状況は詳しくは知らない。
まあ君なりに努力しての結果なんだろうとは思う。話が全然ずれてたらすまん)
0685デフォルトの名無しさん (オッペケ Sr3b-oY+s)2018/07/06(金) 03:43:33.27ID:vodDi731r
関数に引数として渡せるような多次元配列ってどうやってこしらえるのがベストプラクティスなの?
eigenとかは使いたくない
STLなら使える


サイズがコンパイル時に決まってたりはしない予定
0689はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bf6f-UVFs)2018/07/06(金) 18:11:53.41ID:G+eTHi8Q0
結論としては場合によるとしか言いようがないでしょ。
だいたいの場合にこれを使っておけばベストだわって言える方法はないと思う。

コンパイル時には決まらないって言ったって、
オブジェクトを構築した段階では決まるのか、
後から拡張 (縮小) することもあるのかでも判断は変わるだろうし。

ライブラリがユーザに見せる API なら抽象化されたクラスを用意した方がいいけど、
そうでもない内部的なものならポインタひとつと整数ふたつを渡すデザインでも用は足りるし。
0697デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/07(土) 00:10:21.61ID:kLxolQc60
1レコードが可変長の列でもない限り
vectorのvectorとか愚の骨頂
頭ワルイ
0698デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/07(土) 00:15:22.37ID:kLxolQc60
レコード作るたんびに激しいフラグメンテーションがおこるヒープをポコポコ作るとか
頭が超ワルイバカがやることです

よいこのみんなはココにいるバカなヤツラのマネはしないようにな
0700デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/07(土) 00:23:47.27ID:kLxolQc60
はっきりいってな
行列ならvector1個で十分だからな

バカ以外にとっては常識
0702デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/07(土) 00:39:56.87ID:kLxolQc60
否定はしてない

行と列が可変な行列は
vector1個で十分といってる

m*nの列数の列を最初に先行してメモリアロケーションしたほうがいい
そのあとdata()で戻ってきたポインタつかっていじくり倒せばいい

とりあえず行毎にヒープを作る意味がまず皆無
0724デフォルトの名無しさん (ワッチョイ 5fbd-c6cw)2018/07/07(土) 17:12:22.13ID:4FQUFFqD0
>>714のコードは[y][x]式の要素アクセスをしたいというだけのために
arraysクラスにarrayクラスのメンバを持たせているあたりがイヤソ
これがために、[y][x]式の要素アクセスがたとえリードアクセスであってもスレッドセーフでなくなる
パフォーマンスは>>702案と比べて言うほど悪くはないが、
0727デフォルトの名無しさん (ワッチョイ 5fbd-c6cw)2018/07/07(土) 17:33:51.53ID:4FQUFFqD0
>>725
ちょっ乗算なら>>702案にもwidth * y + xみたいなアクセスという形で含まれる件について:
widthを定数だとコンパイラが認識した場合は、単純な>>702案の方が最適化が効いてシフト演算なりになる可能性が高いが
0732デフォルトの名無しさん (ワッチョイ 5fbd-c6cw)2018/07/07(土) 18:26:37.83ID:4FQUFFqD0
画像を90度回すつもりで
for (py=0; py<height; py++) {
for (px=0; px<width; px++) {
dst[px][py]=src[py][px]
}
}
と書いたとしたら、ループ内ではwidth、heightともに定数とみなせるからループ最適化が効いて
dst、srcとも要素特定演算が加算のみになる可能性が微レ存、
この点>>702案に対して>>714のoperator[]はボロいコンパイラの場合は最適化機会を見逃す危険性は高いが
コンパイラからみてarrayに対する副作用がわからない関数呼び出しは含まれないから、原理的に最適化不可能というほどではない。
0735デフォルトの名無しさん (ワッチョイ 5fbd-c6cw)2018/07/07(土) 19:26:22.85ID:4FQUFFqD0
ていうか>>706にすでに書いてあったorz
ただ行や列の追加をしたいという場合は>>706では済まなくて、相応のコピコンを備えた独自クラスでのwrapが多分必要
(データを引き継ぎつつ、異なる行数や列数のオブジェクトを新たに作るコピコンを設ける
0736デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/07(土) 19:35:42.78ID:kLxolQc60
やっぱりな知恵遅れのバカどもはなにも分かってないわ。。。

演算処理で一番ボトルネックになるのはメモリアクセスだからな
高速な演算をしたいのにメモリをあちこちバラバラに配置する知恵遅れはいない

局所参照性を無視して乗算がどうこうといってるレベルだからな。。。
知恵遅れたちにはCPUのキャッシュという概念がない

vector1個のほうが
メモリフラグメンテーションもおきにくいし
このスレのバカどもがどうこういってる演算においても激しく有利だからな

良い子のみんなはこのスレのバカどもがいうことなんか
マに受けたりしたらダメだからな

オレの書き込みだけ信じればいい
0737デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/07(土) 19:53:26.81ID:kLxolQc60
ttp://codepad.org/2sMvNgye
↑アホが書いた典型的なサンプル

良い子のみんなはマネしないようにな
こんなアホがいるというサンプルになってる

http://d.hatena.ne.jp/pknight/touch/20100330/1269945131
↑同じアホでもまだこっちのがマシ

あいかわらずオレのレスは
いつでも針の穴を通すようなカンペキなレスだ
0739デフォルトの名無しさん (ワッチョイ 5fbd-c6cw)2018/07/07(土) 19:58:36.71ID:4FQUFFqD0
>>736
行列のrowを個別のstd::vector<T>とすることによる局所参照性の劣化は
ラスタスキャン順アクセスにおいて第i行から第i+1行に改行する時のみに限られる
(特にたまたま行列の横幅がキャッシュラインサイズの倍数でありかつ行がキャッシュラインに整列しているならば、何のペナルティーも生じない
ランダムアクセスならどっちもどっちになるからでかい配列の場合は言うほど気にしなくて良いんじゃ…
0740デフォルトの名無しさん (ワッチョイ 4750-SFkP)2018/07/07(土) 20:41:37.82ID:vaOvOKvn0
パフォーマンス優先なら

メモリは連続
要素へのアクセスはシンプルに

[][] にこだわる必要はない
(x, y) や [座標] なども考える

乗算が遅い環境なら
要素数は2^nの形にするとか位置をキャッシュするとか
固定座標の処理で良いものはコンパイル時に決定出来るようにとか
0743デフォルトの名無しさん (アウアウウー Sa0b-sule)2018/07/07(土) 23:53:17.73ID:HbEbhDY0a
LINUXで15GBくらいのテキストファイルを読み込みこんでGUIを作ろうとしています。
ファイルが大きいため速度が出せる言語で、かつGUI作成は情報量が多いと調べやすいので、まあまあメジャーな無料のGUIライブラリを使用したいと思っています。

perl>>python>>>>C++ の順で経験があり、C++はあまり詳しくないですが、速度重視でC++で行こうと検討しています。
GUIライブラリを調べているのですが、C++のGUIはあまり情報を見つけられず、めぼしいのはQtくらいしか目に付きませんでした。
会社のサーバのローカルディレクトリにQtをインストールしてみましたが、必要なライブラリが古かったりで、インストールできませんでした。

他に何かおすすめなGUIライブラリはありますでしょうか?
0746デフォルトの名無しさん (ワッチョイ a7d2-UVFs)2018/07/08(日) 00:26:37.61ID:ib3y3idC0
GUIはTkライブラリをPerl/Pythonで作り、重い処理はC/C++プログラムとプロセス間通信と行うのがいいんじゃないですかね。
0750デフォルトの名無しさん (ワッチョイ 4750-SFkP)2018/07/08(日) 01:37:33.05ID:zc7zM8II0
15GBだと読み込みだけで分単位の時間がかかる

UIも難しい
巨大テキストからどうやって表示箇所を選ぶ?
スクロールバーとページめくりだけじゃ目的の箇所を探せないよ
行番号指定ジャンプ?

15GBだとメモリコピーでも秒オーダーの時間がかかるから
1文字入力するごとに後ろをずらすなんてことも出来ないから
データの持ち方も工夫しないと
そもそもメモリに収まりきるのか?
RAMは何ギガ?
0751デフォルトの名無しさん (ワッチョイ 7f81-Gfd3)2018/07/08(日) 01:58:53.01ID:fRwyFHTq0
サーバーって事だから、いっそ使いやすい型式でDBに格納し、
Web画面で表示するっていうのはどうだろう
グラフィック表示はクライアント側に任せてしまう
0754デフォルトの名無しさん (アウアウウー Sa0b-sule)2018/07/08(日) 10:36:48.41ID:FCqbYUBUa
>>744-753
色々な情報ありがとうございます。

>>744
gccなど単体でインストールできるものはローカルディレクトリに最新をインストールしたのですが、
Qtに必要な何かのライブラリの最新版をインストールするのに文字コードがc.utf8が必要なのですが、
今はja_JP.UTF-8しか選択できず、新しい文字コードを使うにはrootでの文字コード再生成が必要なため全体への影響を考え一旦保留としています。

>>745,748
候補としてちょっと調べてみます。

>>746
PythonならCython+Kivyで直接取り込もうと検討しています。
その場合、CythonがどこまでC++の速度に迫れるかの調査から始める必要があるのですが…
少し調べたらCython内で直接C++コードを書ける云々とあったからそれだと速度はクリアできるのかなぁ?というところで一旦ストップしています。
これは深い話するとちょっとスレチな内容になってきますね。。
ちなみに今回作ったものをTCP通信で別のプログラムに接続して使用する予定です。

>>747
Read Onlyで読み込み時に演算したりarray、unordered_map、構造体などに放り込んだりして加工して取り込んだあとは参照のみです。
751さんの話は一旦形式をDBで保存しそれを参照ですが、それに近い感じで使いやすい形式に変換したものをメモリに格納し参照するイメージです。
0755754 (アウアウウー Sa0b-sule)2018/07/08(日) 10:39:18.44ID:FCqbYUBUa
つづき

>>749,750
固定フォーマットです。
メモリはサーバなので数百GBはあります。

>>752
1ファイルなんです。。
解析ソフトから出力された結果です。

>>753
mmapぐぐったらI/Oがネックなときに効果が期待できるものなんですね。
今調べてわかったところでは、

[1-1] fgetsのみ→30秒以下
[1-2] ・fgets, sscanf, fscanfを組み合わせてフォーマットに沿って読み込む→約5分

だったので、scanの変数格納が支配的になりそうなので、次は下記を調査しようと思っています。

[2-2] freadでバイナリで読み込んで空白、改行を判定しながら必要なところだけ文字列や数値に変換すると早いか?
[2-3] fgetcで空白、改行を判定し直接charに入れて行くと早いか?↓
char a[1024];
i=0;
while ( (a[i]=fgetc(fp)) != EOF){
 if(a[i] == " "){
  a[i] = "\0"; //\0を入れるとそこまでをcharの文字列として扱ってくれる??
  break;
 }
 i++;
}
0756754 (アウアウウー Sa0b-sule)2018/07/08(日) 10:52:07.74ID:FCqbYUBUa
あとは下記URLの「ファイルは一括で読み込め」の読み込み速度はどうかも調べてみる予定です。

ttps://qiita.com/kotauchisunsun/items/84e01c6fb621fcc1a647

それと下記も高速化のコーディングの参考にしようかと。

ttps://heavywatal.github.io/cxx/speed.html
0757デフォルトの名無しさん (ワッチョイ 4750-SFkP)2018/07/08(日) 11:00:23.53ID:zc7zM8II0
読み込みと解析は別スレッド
解析はマルチスレッド
関数は専用化
AVXなどのリッチな命令を活用する
キャッシュを効率的に使う(何度も全体スキャンしない)

一般的な効率化技術
0766デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/08(日) 22:07:57.31ID:IBdHDRbb0
まず固定長なら1行のバッファから読みこむだけの仕組みを作ってからの話になる
はっきりいって固定長のレイアウトに従って読みこむだけだからな

読みこみ処理の最適化なんかその後の話になる

固定長でなにをそんなに手こずってるのか意味が分からないしな
レコードのサイズはきまってるのに

fscanfとか書いてるということは末尾に改行が入ったレイアウトなのはなんとなく推定できる

レスを読んでもそもそも1レコードのサイズが何バイトなのか分かってて作ってるのかどうかすら怪しい
ファイルサイズをレコードサイズで割ってちゃんと整数になってるかとか確認してるのかどうかすらも怪しいからな
ファイルサイズだけ書いてレコード数すら書いてないしな

とにかく頭悪いヤツがしょうもないことで四苦八苦してるのは分かる
0767754 (アウアウウー Sa0b-sule)2018/07/08(日) 22:10:28.88ID:nff2cMgla
色々ご意見ありがとうございます。

まずは>>759さんのおっしゃるように、>>758さんのケアをしようと思うのですが、今のfgets+sscanfの組み合わせは下記URLを参考にしたのですが、
どれが激遅でどれが高速かの情報はどこかにあったりしますでしょうか?
(試そうと思っていたfgetcは遅いんですね…)

ttp://d.hatena.ne.jp/s-yata/20100726/1280138663

読み込み時に必要なのは、改行の判定、文字列の判定、int型で読み込んで0.025や0.1などを掛けてfloat型で保持(おそらくこれが一番多い処理)、と考えています。
ちなみに入力フォーマットは、ここから何行は文字列、ここから何行は数字の列(intに掛け算しfloatで保持したい)、という感じになっています。
最適な関数はどんな組み合わせが考えられますでしょうか?

STRING 2
AAA BBB
CCC
INT_TO_FLOAT 10
100 100 110 110
101 101 200 200
〜あと8行
0768デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/08(日) 22:15:17.90ID:IBdHDRbb0
知恵遅れはそれを固定長とかいってんのか
なるほどな

まず知恵遅れとは語彙の一致が成立してない
0769754 (アウアウウー Sa0b-sule)2018/07/08(日) 22:17:42.92ID:nff2cMgla
一行に存在する文字数は固定されておらず、文字列の方は文字数や空白は関係なしに単純に行数分読み込むだけで良いです。
数字の方も桁数は固定されていませんが、空白区切りの4カラムと固定されています。

STRING 3
This is pen.
hoge piyo
hello world.
INT_TO_FLOAT 9
12345 1000 10 12
101 101 999999 444
〜あと7行
0772デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/08(日) 22:36:50.70ID:IBdHDRbb0
1行目はisspaceでぐりぐり回して
SPを\0でおきかえればオシマイ
コレでバッファの先頭のポインタで文字列が拾える
行数は\0のポインタを1バイト分進めて
そのポインタをstrtolに渡せば拾える

2行目以降の数字は
strtolやstrtodで空白に到達したら、
その到達した位置のポインタが引数で拾える
数値も拾える

2行目以降の文字列は省略 
池沼でも拾える

ここまで書けばどんなドカタでも作業はできるハズだ
0773デフォルトの名無しさん (ワッチョイ e7c3-WPlw)2018/07/08(日) 23:16:50.92ID:w/p0hjmq0
テキストのパースなんてそれこそperlやpythonにやらせろよ
そんなところが速度にクリティカルに効いててゴリゴリ高速化しなきゃいけないのは作りがおかしい
0775デフォルトの名無しさん (スッップ Sd7f-SFkP)2018/07/08(日) 23:41:27.36ID:yMyBSsTod
>>767
読み込み以外、ライブラリなんか使わずに全て自分のコードにしてみようか
そうすれば色々とわかるはず
読み込みは16MBずつとかにすれば速い

出力先はファイル?メモリ上?
数値は32bit floatで保存するとして
文字列は?
そのままの形で使う?
読み飛ばす?
0778デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/08(日) 23:54:44.54ID:IBdHDRbb0
な、知恵遅れたちはテキトーなことばっかりいってる
こんなゴミみたいなコードで速攻でかけるのに
0779デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/08(日) 23:55:41.66ID:IBdHDRbb0
ゴミはめちゃくちゃしょうもない簡単なコードを
いちいち複雑にする

そしてもだれもメンテナンスできなくなる
0781デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/08(日) 23:57:09.03ID:IBdHDRbb0
オレはなにも間違ったこと書いてない
0782デフォルトの名無しさん (スッップ Sd7f-SFkP)2018/07/08(日) 23:57:21.06ID:yMyBSsTod
数値の行は以下みたいなドロくさい処理を4回繰り返せば良い

unsigned int n = 0;
do {
unsigned char ch = (unsigned char)(*data++ - '0');
if (ch <= 9)
{
n = n * 10 + ch;
}
else {
break;
}
} while (true);
0784デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/08(日) 23:59:14.83ID:IBdHDRbb0
だいたい分かるわ
やっぱりなPGなんか低学歴しかやらない
0786デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:03:17.82ID:c1VUAguL0
たとえば1行目なんかこんなしょうもないのでとれる

int get_type(unsigned char const* buf, t_baka_type_t* pt_baka_type_t, unsigned char const** pct_next) {
unsigned char const* c_buf = buf;
for (; !isspace(*c_buf); ++c_buf) ;
if (!::strncmp((char const*)buf, TYPE_STRING, c_buf - buf)) {
pt_baka_type_t->baka_type = BAKA_TYPE_STRING;
} else if (!::strncmp((char const*)buf, TYPE_INT_TO_FLOAT, c_buf - buf)) {
pt_baka_type_t->baka_type = BAKA_TYPE_INT_TO_FLOAT;
} else {
fprintf(stderr, "氏ねヴォケ\n");
return -1;
}

pt_baka_type_t->u_records = strtoul((char const*)c_buf, (char**)&c_buf, 10);
++c_buf;

*pct_next = c_buf;
return 0;
}

はっきりいってな、2行目以降の数値も文字列もやりかたなんか同じだからな
ドカタ作業
0787デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:08:20.49ID:c1VUAguL0
ゴミは口だけは達者
しかもアリエナイ頭ワルイことばっかりいうからな
0788デフォルトの名無しさん (スッップ Sd7f-SFkP)2018/07/09(月) 00:08:49.29ID:EkQ+mvr8d
わざわざ標準ライブラリを使うために小細工しなくても良いんじゃないの?
何がどういう順番で書いてあるかはわかってるようだし無駄に重くしなくても
0789デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:10:37.45ID:c1VUAguL0
きっとなオマエが書いたゴミコードより標準ライブラリのほうが
バグもないし早いと思うわ
0791デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:12:54.25ID:c1VUAguL0
な、知恵遅れはこんなとこで書いたサンプルに
エラー処理が入ってると思ってる

もうねコレだから低学歴は困るわけ
0792デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:13:53.01ID:c1VUAguL0
日本のPGは低学歴しかいないのが
このスレで何度も証明されてる
0794デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:19:33.01ID:c1VUAguL0
低学歴に反応してるということは
図星なんだろ

もう分かってるからな

悪いけどなレスみれば低学歴なのは
残念ながらすぐに分かってしまう
低学歴特有のレスというのがある

隠そうとしてもムダ
0796デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:23:07.75ID:c1VUAguL0
あのレベルでポインタいじくりまわしてる?
どんだけオツムが弱いねん・・・
0797デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:26:52.35ID:c1VUAguL0
ようするにポインタが理解できてない
こんなのがプログラマさまきどってるのが日本だからな

そらなこんなのがコードいじくってたら
障害ばっかりおきるハズだわ
0800デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:30:58.58ID:c1VUAguL0
低学歴は自分を大きく見せようとするからな
5f34-M0Jq ← コイツなんか典型的といっていい

わかってしまう
きっとコイツは専門卒
残念なことにレスみればすぐに分かる

だてにいままでいろんなゴミを相手にしてきたワケではない
0801デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:32:10.58ID:c1VUAguL0
何度もスキャン?
一回しかスキャンしてないぞ

まずコードがよめてない
ポインタは後ろにしか進んでないのに
0803デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:34:44.55ID:c1VUAguL0

もしかして
必要な1回の文字列判定を何度もスキャンとかいってるの?
0804デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:36:07.46ID:c1VUAguL0
低学歴によると
通常の字句解析と構文解析を一緒にするのか
なるほどな
0805754 (アウアウウー Sa0b-sule)2018/07/09(月) 00:37:52.14ID:oMFJCZ8na
たくさんの情報大変参考になります。
サンプルコードもありがたいです。
実際に動かしながらどう動いているのか調べてみます。

>>775
読み込みを16MB単位でやってみます。
ファイルに出力することはなくて、読み込んだ情報をGUIでクリックして、
こっちをクリックするとこんな結果になっている、こっちだとこの結果、
というようなビューアを作ろうとしています。
文字列も重要な情報なので、
struct info{
0807デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:43:27.81ID:c1VUAguL0
よしオマエはいい子のようだから
STRINGの部分をとるコードもあげよう

int get_data_string(unsigned char const* buf, t_baka_type_t const* ct_baka_type, unsigned char const** pct_next) {
  unsigned char const* c_buf_b;
  unsigned char const* c_buf_e = buf;
  for (uint32_t i = 0; i < ct_baka_type->u_records; ++i) {
    c_buf_b = c_buf_e;
    for (; *c_buf_e != '\x0a'; ++c_buf_e) ;
    // c_buf_b から始まる c_buf_e - c_buf_b の長さが取得する文字列
    fprintf(stdout, TYPE_STRING":%.*s\n", c_buf_e - c_buf_b, c_buf_b); // ← ココでとれる
    ++c_buf_e;
  }

  return 0;
}
0810デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:50:43.58ID:c1VUAguL0
バリデーションチェックは自分で入れるにきまってるだろ
アホちゃうかコイツラ
0811デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:51:20.09ID:c1VUAguL0
そういうレスしかできないからな
程度が知れるわけ

低学歴らしい
0813デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:53:03.02ID:c1VUAguL0
いいわけ?
マジでいってるわけ?

ホントな頭悪い
0814デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:53:36.22ID:c1VUAguL0
典型的な低学歴のレスといっていい
0816デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:56:18.28ID:c1VUAguL0
ハナクソがオレとなんの勝負すんの
0819デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 00:59:12.63ID:c1VUAguL0
ハナクソは
学歴も書いてないし
コードも書いてない

で?
0820デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 01:01:13.46ID:c1VUAguL0
低学歴知恵遅れは
コミュニケーション能力もゼロに近い

そもそも唐突に
なにがしたいのか
なにがいいたいのか
意味が分からないワケ
0821デフォルトの名無しさん (ワッチョイ 5f2b-ExT7)2018/07/09(月) 01:02:30.85ID:4jZgSN4s0
いまどき自前の字句解析処理をCでポインタ使って書くなんて
バッファ境界のチェックとか面倒だし絶対ミスるからやめた方が良いって話なのに
いきなりエラー処理完全無視したコード出されてドン引きです
0822デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 01:03:34.22ID:c1VUAguL0
どんびきするとかしないとかは
オマエの勝手だからな
0826デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 01:05:40.33ID:c1VUAguL0
scanと解析に時間がかかるとかいってるから
オレはベストプラクティスをだしてる
0827デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 01:07:55.27ID:c1VUAguL0
まず目的が理解できてないからな
0829デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 01:10:13.35ID:c1VUAguL0
ベストじゃないと思うなら
ベストな方法はれよ

臆病者なんか
0831デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 01:10:46.49ID:c1VUAguL0
はよベストなもんはれよ
0833デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 01:54:56.54ID:c1VUAguL0
やっぱりバカの限界というやつだな
オミヤゲだけはって寝よ

1行目とるヤツ
さっきとかわらず

int get_type(unsigned char const* buf, t_baka_type_t* pt_baka_type_t, unsigned char const** pct_next) {
  unsigned char const* c_buf = buf;
  for (; !isspace(*c_buf); ++c_buf) ;
  if (!::strncmp((char const*)buf, TYPE_STRING, c_buf - buf)) {
    pt_baka_type_t->baka_type = BAKA_TYPE_STRING;
  } else if (!::strncmp((char const*)buf, TYPE_INT_TO_FLOAT, c_buf - buf)) {
    pt_baka_type_t->baka_type = BAKA_TYPE_INT_TO_FLOAT;
  } else {
    fprintf(stderr, "氏ねヴォケ\n");
    return -1;
  }

  pt_baka_type_t->u_records = strtoul((char const*)c_buf, (char**)&c_buf, 10);
  ++c_buf;

  *pct_next = c_buf;
  return 0;
}
0834デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 01:56:57.90ID:c1VUAguL0
2行目以降のSTRINGとれるヤツ
※ 次のバッファの継続ポインタの格納をしてなかったので追加

int get_data_string(unsigned char const* buf, t_baka_type_t const* ct_baka_type, unsigned char const** pct_next) {
  unsigned char const* c_buf_b;
  unsigned char const* c_buf_e = buf;
  for (uint32_t i = 0; i < ct_baka_type->u_records; ++i) {
    c_buf_b = c_buf_e;
    for (; *c_buf_e != '\x0a'; ++c_buf_e) ;
    // c_buf_b から始まる c_buf_e - c_buf_b の長さが取得する文字列
    fprintf(stdout, TYPE_STRING":%.*s\n", c_buf_e - c_buf_b, c_buf_b); // ← ココでとれる
    ++c_buf_e;
  }

  *pct_next = c_buf_e; // ← たりなかったので追加
  return 0;
}
0835デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 01:59:16.59ID:c1VUAguL0
2行目以降のTYPE_INT_TO_FLOATとれるヤツ

int get_data_int_to_float(unsigned char const* buf, t_baka_type_t const* ct_baka_type, unsigned char const** pct_next) {
  unsigned char const* c_buf_e = buf;
  int32_t i_val[4]; // とりあえずのテキトーにいれた一時バッファ

  for (uint32_t i = 0; i < ct_baka_type->u_records; ++i) {
    for (uint32_t j = 0; j < 4; ++j) {
      i_val[j] = strtoul((char const*)c_buf_e, (char**)&c_buf_e, 10);
    }
    ++c_buf_e;

    fprintf(stdout, TYPE_INT_TO_FLOAT":%d,%d,%d,%d\n", i_val[0], i_val[1], i_val[2], i_val[3]); // ← ココでとれる
  }

  *pct_next = c_buf_e;
  return 0;
}
0836デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 02:01:59.87ID:c1VUAguL0
とりあえずのテキトーな宣言

#define TYPE_STRING "STRING"
#define TYPE_INT_TO_FLOAT "INT_TO_FLOAT"

typedef enum __ENUM_BAKA_TYPE {
  BAKA_TYPE_STRING,
  BAKA_TYPE_INT_TO_FLOAT,
  BAKA_TYPE_UNKNOWN
} BAKA_TYPE;

typedef struct __tag_baka_type_t {
  BAKA_TYPE baka_type;
  uint32_t u_records;
} t_baka_type_t;

int get_type(unsigned char const* buf, t_baka_type_t* pt_baka_type, unsigned char const** pct_next);
int get_data_string(unsigned char const* buf, t_baka_type_t const* ct_baka_type, unsigned char const** pct_next);
int get_data_int_to_float(unsigned char const* buf, t_baka_type_t const* ct_baka_type, unsigned char const** pct_next);
0837デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/09(月) 02:03:33.03ID:c1VUAguL0
コレでとりあえず動かせる

int main(int argc, char** argv) {
  unsigned char const* buf = (unsigned char const*)
    "STRING 3\x0a"
    "This is pen.\x0a"
    "hoge piyo\x0a"
    "hello world.\x0a"
    "INT_TO_FLOAT 9\x0a"
    "12345 1000 10 12\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a"
    "101 101 999999 444\x0a";
  unsigned char const* c_buf = buf;
  t_baka_type_t t_baka_type;

  // 実際の処理ではt_baka_type.baka_typeをswitchで分岐しながら処理することになる
  get_type(c_buf, &t_baka_type, &c_buf);
  get_data_string(c_buf, &t_baka_type, &c_buf);
  get_type(c_buf, &t_baka_type, &c_buf);
  get_data_int_to_float(c_buf, &t_baka_type, &c_buf);
}
0841デフォルトの名無しさん (ワッチョイ 47b3-rubz)2018/07/09(月) 11:49:18.73ID:gGpmJBA50
そこ突っ込むなら他にも色々あると思うが
なんでC++でtypedef struct/enumなの、とかなんで文字列がunsigned charなの、とか
メタプログラミングじゃない構造体の型名に_tとか付けるな、とか
0842デフォルトの名無しさん (アウアウウー Sa0b-UVFs)2018/07/09(月) 13:05:01.50ID:igQMhEfYa
ざっと見たけどすごいスレだな

10年ぐらい前だったらこういうこともありかなって思った時期があるけど今はもうそんな時代じゃない
で大部分レスができてしまう
0843デフォルトの名無しさん (スッップ Sd7f-SFkP)2018/07/09(月) 13:18:07.24ID:4W5c2ICHd
名前の付け方はどうせそれぞれの環境に合わせるだろうからどうでもいいけど
中途半端な最適化が良くないな

今回は用途もデータ構造もわかっているし
目的が高速化なわけだから
0845デフォルトの名無しさん (ワッチョイ 87b3-q+oR)2018/07/09(月) 15:23:55.96ID:tG10WBhN0
boostを積極的に使っていこう。
0846デフォルトの名無しさん (ワッチョイ 5f7f-KMj/)2018/07/09(月) 16:10:51.38ID:OMEWQnbN0
ほらよ
https://goo.gl/uAcy7u
0847デフォルトの名無しさん (ワッチョイ 87b3-q+oR)2018/07/09(月) 17:19:12.55ID:tG10WBhN0
壮絶ゲームズ株式会社。
0849754 (アウアウウー Sa0b-sule)2018/07/09(月) 20:38:18.02ID:FCmEWxOPa
ご連絡おそくなりすみません。
たくさんのサンプルありがとうございます。
今日はファイル読み込みの対応ができなかったので明日このスレを見ながら試してみようと思います。

ちなみにフォーマットはSTRING行が先にきて、次にINT_TO_FLOAT行がきます。
STRINGで始まり、INT_TO_FLOATで最後は終わります。
後出しの情報になり申し訳ありません。
>>786 でどっちが来るかの判定までしていただいていたので一応ご連絡しておきます。

STRING 2
This is pen.
hello world.
INT_TO_FLOAT 1230
100 100 110 110
101 101 200 200
〜あと1228行
STRING 5
hoge piyo
foobarbaz
It is a July 9 today
It rained all day today
INT_TO_FLOAT 830
100 100 110 110
101 101 200 200
〜あと828行
0850754 (アウアウウー Sa0b-sule)2018/07/09(月) 20:49:04.01ID:FCmEWxOPa
すみません、 >>849 のSTRING 5の部分は4行になってますね。
この場合 STRING 4 になります。。
0851デフォルトの名無しさん (ワッチョイ 4750-SFkP)2018/07/09(月) 20:58:02.33ID:AazuLIX60
作って実験してみたよ
一行に4個の数字がある行を
適当な数値を乗算して構造体のvectorに入れていく
ファイル上の位置も格納するので
間の文字列も必要な時に表示出来る

うちの環境だと
読み込みだけで77.9秒
解析だけで24.3秒
読み込みと解析合わせて78.1秒
アプリはシングルスレッドだけど
勝手にOSが先読みしてくれてるのかな?

読み込み単位は2次キャッシュに確実に収まる1MBくらいが良さそう
0853デフォルトの名無しさん (ワッチョイ 4750-SFkP)2018/07/09(月) 21:10:56.23ID:AazuLIX60
2次じゃなくて3次

struct LOG {
float num[4];
uint64_t line_start;
uint64_t line_end;
};

こんな構造体に入れていくようにしてみた
文字列はクリックした時にファイルを読みに行けば良いよね
0859デフォルトの名無しさん (ワッチョイ 4750-SFkP)2018/07/09(月) 21:26:46.46ID:AazuLIX60
floatの配列は別に用意して

struct LOG {
uint32_t str_start;
uint32_t str_end;
uint32_t str_line;
uint32_t num_start;
uint32_t num_end;
};

みたいな、
ブロックごとの構造体に入れていく方がいいのかな?
0869デフォルトの名無しさん (ワッチョイ 5fbd-c6cw)2018/07/09(月) 23:26:25.24ID:Kh8JJTJK0
>>776
構文的に難しくも無いのにわざわざ遅くする理由がわからん…
ていうかそもそもlexとかyacc使いでも滅多に使わん希ガス

今回の文字列処理の件はワッチョイ 0780-Rmg1の圧勝
0870754 (アウアウウー Sa0b-sule)2018/07/10(火) 00:11:54.08ID:L9+HOK/Ta
>>851
テストまでしていただいだきありがとうございます。
1分ちょっとならとてもいい感じです。
なるほどDRAMよりも高速なCPU内のキャッシュを有効に使うと効果的ってことですね。
そんなこと今まで考えたこともなかったです。勉強になります。

>>854
ご推察の通りです。

>>857
文字列の方はせいぜい10行〜20行です。
数値の方は何万行にもなったりします。

>>858
メモリは10GBつかっても問題にならないくらい潤沢に使えると思うので、まずは速度重視で行こうと思っています。

>>861,862
すみません昨日書き込みエラーになって書き込めなかったのでそのままでした。
クリックするたびに毎回int->float演算したら1項目で何万行もあったりするので
読み込み時に演算しておいた方がよいかなと思っていました。

>つづきます
0871754 (アウアウウー Sa0b-sule)2018/07/10(火) 00:20:12.97ID:L9+HOK/Ta
>>863
全部のフォーマットは複雑になってくるので簡易的なフォーマットをと思って出していましたが
説明していくと細かい話になってきましたのでもう少し具体的なものを書きます。
テストまでしてもらっているのに変わってすみません。。
-------------------------------
SECTION_NAME @
11200 11200 2 Jun 9 23:23:00 2018 A
This is pen. B
hello world. B
x 1 2 C
100 1 -2000 10
101 10 -2001 10
y 2 4
-100 10000
-101 10100
x 3 28
QQ subname -1 0 0 1 -21000000 600000 2 D
100 100 110 110
100 100 110 110
〜あと26行〜
SECTION_NAME E

@GUI表示する
A11200がx or yの個数、3カラム目がテキスト行の個数、それ以降は捨てる。11200のところは1の時もあれば100万超えることもある
BGUI表示する
Cこれが非常に多く、ひたすら繰り返される。x,yはランダムでくる。
1カラム目はx or y固定。x=次行に来る数値は4カラム。y=2カラム
2カラム目は1からインクリメントしていき、Aの11200回出てくる。カウント数値
3カラム目は次行から始まる数値行が何行かの数値
Dx or yの次の行にたまにこの行があります。この行も使いますが、ちょっと複雑なのでまずはスキップで。
Eここからまた@の繰り返し、要するにファイルの最後はCのところで終わる。
-------------------------------
0872754 (アウアウウー Sa0b-sule)2018/07/10(火) 00:23:35.36ID:L9+HOK/Ta
すみません、上記QQはQQという固定文字です。
行頭が"Q"のときはこの行という判定で良いと思います。

>>859,860
格納先は構造体に入れようと思っていて、下記のようにテキスト行も入れようかなと思っていました。

struct x_or_y{
 char type; // x or y
 int num; // Cの2カラム目
 float list;
};
struct elem{
 char section_name;
 char comments;
 array系の何かの型 x_or_y_array; // 配列にしておくと(Cの2カラム目-1)で簡単にアクセスできそう
};
0873デフォルトの名無しさん (ワッチョイ e7c3-WPlw)2018/07/10(火) 01:34:56.63ID:C7bP6ErJ0
なんかのログなんだろうけど、ログ吐く時に読み込みやすいように出し方考え直した方がいいよ
大本が変えられないならパイプ繋いでフィルタ噛まして、読みやすいように直したファイルを並行して吐くとかさ

というかまず単にSECTION_NAMEごとにファイルぶった切っておくだけで良かったりしない?難しく考えすぎてない?
0874デフォルトの名無しさん (ワッチョイ e7c3-WPlw)2018/07/10(火) 01:46:08.72ID:C7bP6ErJ0
どういうGUIが必要なのかわからんから的外れかもしれないけど
ワイならSECTION_NAMEごとに集計したHTMLファイルかなんかを出力するプログラムをワンパスかけてから
後でそのHTMLをブラウザで見ることを考えたくなるんだけどそれじゃダメなの?
0878デフォルトの名無しさん (ワッチョイ 4750-SFkP)2018/07/10(火) 07:26:16.92ID:wSs+8Os00
A
1カラム目と2カラム目は同じ数字?
1カラム目がxの個数、2カラム目がyの個数?

C
y 2 4 の後、データ行が2行だけど4行の間違い?
データ行の値の範囲は?
0880デフォルトの名無しさん (ワッチョイ 4750-SFkP)2018/07/10(火) 07:31:15.21ID:wSs+8Os00
初めて開くファイルは使いやすいように変換して(キャッシュとして)保存しておいて
次回以降それを使うか
全ファイルバッチ処理で事前に変換しておくか

かな

ファイルを開く度に分オーダーかかるのは使いづらい
どちらが良いかは使い方次第で
0883754 (ワッチョイ 7ff1-XcsY)2018/07/10(火) 14:27:03.15ID:VT/DQ/OS0
>>873,874
ソフトが出しているログなので変えられず、並行で吐くこともできないんです…

> ワイならSECTION_NAMEごとに集計したHTMLファイルかなんかを出力するプログラムをワンパスかけてから
これも考えたのですが、元ファイルと加工したファイルが常に等価ではないので、
間違って古いままの加工ファイルを参照する事故を、全員が気にする必要が
出てくるため今は保留とし、どうしてもできない時の最終手段と考えています。
こういうご意見も新しい視点が見えたりするんでありがたいです。

>>877
こんなのをイメージしています。
====================
項目名   | 個数 ※各カラムの説明行
====================
-SECTION1  | 11200
 subname1 | 8800 ※subnameがあれば折り畳みツリー形式。なければ折り畳みなし
 subname2 | 2400
+SECTION2  |  1
+SECTION3  | 666
====================
This is pen. ※SECTION1を選択するとそれに対応するテキストをここに表示
hello world.
====================
1 2 3 4 5 6 7 ※上と同じくSECTIONに対応した数値を特定できる番号を表示
8 9 10 11 12 13 14 ※ここはHTMLぽいものにし、数字クリックでその数値をprint
....
====================
0884754 (ワッチョイ 7ff1-XcsY)2018/07/10(火) 14:39:44.08ID:VT/DQ/OS0
>>878
> 1カラム目と2カラム目は同じ数字?
2カラム目が何の数字かまだ把握できていません。
とりあえず1カラム目と2カラム目の数値比較を行い、違う場合はエラーにしようと思います。
> y 2 4 の後、データ行が2行だけど4行の間違い?
ご指摘の通り4行の間違いでした。
> データ行の値の範囲は?
intの範囲を超えるか?ということですか?
int(-2147483648〜2147483647)で大丈夫と思います。

>>879
ユニークな名前で重複しません。

>>880
仰る通りどちらも一長一短で、今回は874さんに回答した通り、古いキャッシュを参照する事故を防ぐため、まずはテンポラリファイルを作らないことを考えています。

>>881
ファイルは毎回更新されて新しい15GBのファイル1つをインポートします。
15GBも現在のMAXサイズなのでそのうち20GBとかのものが出てくる可能性はありますが、
そこは「読み込みをひたすら待つ」と割り切りで考えています。

>>882
@の行→100行以下
Aの行→SECTIONごとに1行出るので同じく100行以下
Bの行→SECTIONごとにせいぜい20行程度。(20行*100行=20000行)
Cの行→SECTIONごとにたまに数千万のSECTIONあり(全SECTIONだと数千万〜億超えも出てきそう)
1つのSECTIONで数千万や億になり、それ以外のSECTIONは1000以下だったり、
1千万のSECTIONが複数SECTIONになることもあります。
そしてCに対して数値行が1行〜数十行、場合によっては数百行がくるので、Cとそれにかかる数値行が支配的になると思われます。

あと忘れていましたが、テキスト行は日本語がくることもあります。
それ以外は1byte文字です。
0885デフォルトの名無しさん (ワッチョイ 4750-SFkP)2018/07/10(火) 18:26:12.65ID:wSs+8Os00
キャッシュせず
変換して保存しないとなると
ほとんど読み込み時間
解析はそれに比べれば速い

なので
もし高速化したければ
全読みしない方法を考えるしか

全読みの時間くらいは待てるっていうならその方が簡単だけど

読み込み15GB 30秒って異様に速いな
うちの8TB 7200rpmのHDD(内側の方) だと78秒
SSD? RAID? キャッシュ? RAMディスク?
0886754 (アウアウウー Sa0b-XcsY)2018/07/10(火) 18:39:22.79ID:AbfeQ9t7a
>>885
HDDだと思います。
サーバ用なので高速なんですかね。
ちなみに cat /proc/cpuinfo でCPUも調べたらXeonで20コア以上ありました。
(ハイパースレッドかもしれませんが)
〜次キャッシュも民生用CPUより多いと予想されます。
0887754 (アウアウウー Sa0b-sule)2018/07/10(火) 22:05:54.09ID:zwgBQXGGa
>>885
あと、全読みの時間は >>851 を参考にすると2分くらいにはなりそうなので、それくらいなら全然待てます。
fgets, sscanfの時は5分かかっていて、それで我慢するしかないのか、と諦めかけていたので。

評価もscanfもしないでfgets()だけで78秒なんですかね?
大きな違いはCPU、CPU内臓キャッシュ、HDD、メモリあたりと思いますが、それだけで本当に半分以下になるのか少し気になりますね。
0888754 (ワッチョイ 7ff1-sule)2018/07/10(火) 23:40:47.46ID:VT/DQ/OS0
とりあえずみなさんのコードを眺めましたが初めて目にする関数だらけで自分のレベルでは全くついていけてないです。
一つ一つの関数がどんな動作をするのか調べていきます。

>>782,833 を見るとcharのポインタをインクリして読むやりかたとか昔ちらっと読んだことある。程度のレベルなので。。

今833-837の動作確認ができたので、まずはこれがどう動いているかと、バイナリ読み込みの手法について調べていきます。
0889デフォルトの名無しさん (ワッチョイ 4750-SFkP)2018/07/11(水) 00:11:48.47ID:Faj75qU20
>>887
fgetsじゃなくて
freadで1MBずつ読むだけで78秒
庶民の普通のHDDはこんなもんです
解析入れてもほぼ同じなので
読むのに30秒なら解析入れても30秒で終わるよ
もちろんうまく作ればだけど
0908デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/11(水) 23:39:25.00ID:r1UJt2Dq0
やっぱりな低学歴しかいないわ
0910デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/11(水) 23:43:40.24ID:r1UJt2Dq0
そもそも最初のフォーマットと全然違うやんけ
普通にfgetsでとって、必要最低限の位置をマーキングするほうが
メモリに入れるのはそれだけ

位置からメモリブロックをとって、>>834>>835みたいなやりかたで表示が必要になったときに解析
0911デフォルトの名無しさん (ワッチョイ 0780-Rmg1)2018/07/11(水) 23:46:44.47ID:r1UJt2Dq0
そもそも解析アプリが出力してる規定されてるフォーマットなのに
いちいち形式をチェックする必要すらない

ホントな知恵遅れはなにをいってんのか意味不明だからな
クソニートのエアプログラマがテキトーなことばっかりいってんのは分かる
0914デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/12(木) 00:09:52.26ID:LmT6lrwh0
ちなみな
fgets()は知恵遅れのキミラが考えてるよりぜんぜん速い
このスレの知恵遅れが書くようなクソコードより全然速い

書式付の標準関数は書式解析のオーバーヘッドがあるからクソ遅い
0915デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/12(木) 00:14:29.53ID:LmT6lrwh0
ちなみにな手で入力したときは
fscanfやsscanfは使えない
書式より引数が少ない場合簡単に死ぬからな

手で入力してるデータの場合fgets()でデータとって丹念に解析するしかない
つまりfscanfやsscanfの使用も想定する=間違いなく妥当な形式の入力がある
ことを意味する
0917デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/12(木) 00:17:19.69ID:LmT6lrwh0
メモリブロックとるときは
普通にfreadでいい
どうせ改行位置は解析しないといけないから
fgetsにやらせとけばいい

知恵遅れはTPOにあった関数の使い方がわかってないからな
0918デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/12(木) 00:22:11.12ID:LmT6lrwh0
知恵遅れはなにをどういった場面で使うのか分かってないからな
そもそも話がかみあうワケがない

知恵遅れにありがち
電車みて電車の型番いえるだけみたいな頭悪いのが
このスレにはウヨウヨいる
0922754 (アウアウウー Sa21-Y8gp)2018/07/12(木) 00:32:07.09ID:2mlSfrk0a
>>889

なるほどですね。
解析入れてもあまり変わらないのか。
scanfって本当に遅いんですね、嬉しい誤算です。

話題に出ているregexですが、↓ここを見た感じ、

ttps://www.sejuku.net/blog/25962

下記のように感じました。
perlやpythonの正規表現と似た感じなので使えるかもしれません。
1文字づつシフトしてスペースや改行を判定しながら抽出するより早いのであれば試して見ようと思います。

regcomp →正規表現オブジェクト?の作成。()でグループ化。読み込み前にすべてのフォーマットパターンを生成して使い回す。
regexec →正規表現オブジェクトを使ってパターンマッチ
rm_so、rm_eo →マッチの先頭、終端が取れるので文字列が拾える。こんな感じ?→strncpy(&str, data+match[i].rm_so, match[i].rm_eo - match[i].rm_so);
regfree →読み込み終了後にすべてのオブジェクトをこれで開放すればいい?

spirit::qiはググりましたがまったくわかりませんでした。。
0923デフォルトの名無しさん (ワッチョイ 3d50-Se03)2018/07/12(木) 00:34:07.21ID:KB59nVpm0
15GBともなると
関数を呼ぶ時間でもトータル時間に影響するんでね
fgetsの関数コール回数だってバカにならんでしょ

全てのfloatをvectorにpush_backするだけでも
結構な時間ですよ
この辺も工夫しないと
0924デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/12(木) 00:34:22.25ID:LmT6lrwh0
正規表現なんか使ったらコンパイル済の正規表現でも
クソ遅いにきまってるやんけ

そんなもん使うならスクリプトでやったほうがいい
0925デフォルトの名無しさん (ワッチョイ b5b3-kMcx)2018/07/12(木) 09:04:08.15ID:8O8kwVFO0
ディスク読むより遅いでしょうか。
0926デフォルトの名無しさん (ワッチョイ 7db3-iomh)2018/07/12(木) 09:40:21.55ID:yoYPGeS70
>>922
だからregexもspiritも使わなくていいってばw
すでに実例出してくれてるような昔ながらのC言語的な書き方でいいと思う
まともな実例も示さずに「○○使え」は無視していいよ
0928デフォルトの名無しさん (ワッチョイ f1d2-LQig)2018/07/12(木) 13:31:18.35ID:9k08EbFv0
ちなみに gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0 だと、 C++がちゃんとしてて、std::getline()はfread()と同じくらい速い。
各自で実際に試してみるとよいだろう。

Visual Studio だとstd::getline()はfgets()よりも遅い。
コンパイラによって性能に極端な差がでるのがC++のiostream周り。iostreamが地雷扱いされる主因。
0929デフォルトの名無しさん (ワッチョイ 119e-dYrz)2018/07/12(木) 14:27:06.99ID:Jbx8ub/k0
15GB なんて、もし画像ファイルなら、触った途端に、メモリ不足でフリーズするレベル。
普通、8GB ぐらいしか、メモリを積んでいないだろ

1行毎に、読んでは捨てる方式じゃないと無理。
それか、ファイル分割する

Ruby で、HTML, Node.js などが良さそう。
それか、DB
0933デフォルトの名無しさん (ワッチョイ 3d50-Se03)2018/07/12(木) 21:42:21.02ID:KB59nVpm0
>>871のフォーマットでC++で作ったら
解析15GBで8.6秒
1バイト平均2クロック!

これを越えるには
マルチスレッド / AVX命令 /アセンブラ / GPU
に手を出さないと無理かな

----
Haswell
3.4GHz固定
シングルスレッド
C++で1文字ずつ15G文字解析
普通の命令のみ使用(SIMD命令は使用しない)
数値の合計のみ計算して結果を最後に表示
固定4KBを繰り返し解析、トータル15GB分の時間を計測
----
0936754 (ワッチョイ 66f1-Y8gp)2018/07/12(木) 22:08:43.66ID:8VUYfWV40
>>926
おとなしく1文字づつ評価します。

>>933
8.6秒早いですね。

自分はまず初バイナリ読み込みなので勉強から始めてとりあえず1行読みができましたが、
アスキー読み込みのfgetsの方が早かったです、、
コードを載せるのでどこが悪いか見てもらって良いですか?

対象=13GBのファイル(約8億行)。

○fgets版 →約17秒
if((fp=fopen(file_path,"r"))==NULL){
  printf("file not open %s\n", file_path);
 return 1;
}
while( fgets(buf,MAX,fp) != NULL ){
 buf;
}

次にバイナリ読み↓
0937754 (ワッチョイ 66f1-Y8gp)2018/07/12(木) 22:11:04.95ID:8VUYfWV40
○バイナリ読み版 →約44秒
struct CCC {
 FILE *fp ;
 bool read(char* file_path);
 t_read_db read_db;
};
bool CCC::read(char file_path[]){
 FILE *fp;
 if((fp=fopen(file_path, "rb"))==NULL){ printf("ファイルを開けません。%s",file_path); return 0; }
 unsigned char buf[BUF_SIZE];
 int newline_index;
 while( !feof( fp ) ){
  size_t size = fread( &buf, sizeof(buf[0]), sizeof(buf), fp );
  // 終端処理。最大値で取得されてなければそこを末尾にする
  if( size != BUF_SIZE ) buf[size] = '\x00';
  // 取得bufの最後尾が改行でなければfpを改行まで戻す
  if( buf[size-1] != '\x0a' ){
   newline_index = -2;
   for(; buf[size+newline_index] != '\x0a'; --newline_index);
   fseek(fp,newline_index+1,SEEK_CUR);
   // bufの最後の改行の次にx00(null)を入れてそれ以降をカット
   // 「配列参照はポインタの移動より遅い」とあったがbufは実体で移動できないので[]参照で代入。
   buf[size+newline_index+1] = '\x00';
  }
  unsigned char const* c_buf = buf;
  while( c_buf[0] != '\x00' ){
   print_line(c_buf, &c_buf);
  }
 }
}
0938754 (ワッチョイ 66f1-Y8gp)2018/07/12(木) 22:11:35.38ID:8VUYfWV40
bool print_line(unsigned char const* p_buf, unsigned char const** pct_next);
bool print_line(unsigned char const* p_buf, unsigned char const** pct_next){
 unsigned char const* c_buf = p_buf;
 //改行位置を検索
 for(; *c_buf != '\x0a'; ++c_buf);

 char line[LINE_SIZE];
 strncpy( line, (char const*)p_buf, c_buf - p_buf );
 // nullで区切らないと過去に代入した文字数より少ないときにゴミが残る
 line[c_buf - p_buf] = '\x00';

 ++c_buf;
 *pct_next = c_buf;
 return true;
};
0939754 (ワッチョイ 66f1-Y8gp)2018/07/12(木) 22:13:44.64ID:8VUYfWV40
○fgets版 →約17秒
○バイナリ読み版 →約44秒

両方ともとりあえず文字列の読み取りまでしていて、条件は同じではないかと思うのですが、freadのほうが倍以上遅いです。。
0942754 (ワッチョイ 66f1-Y8gp)2018/07/12(木) 22:17:52.40ID:8VUYfWV40
すみません、44秒はfreadの読み込みサイズ(BUF_SIZE)が512byteでした。
16MBにすると34秒になりましたが、それでも倍の差があります。
0944754 (ワッチョイ 66f1-Y8gp)2018/07/12(木) 23:04:55.64ID:8VUYfWV40
>>943
mmapですか。
要チェックですかね。
でもそれだけで数倍早くなるとも思えないし、 >>933 さんの8.6秒は圧倒的パフォーマンスですね。
シングルスレッドで特殊なものは使ってないようだし、たった4KBの繰り返しだし。
根本的なところから違いそう。。

>>933
もし可能であれば、テストしたコードを見せていただくことはできませんでしょうか?
0945デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/12(木) 23:10:07.38ID:LmT6lrwh0
あのな
そこまで読みこみ速度を気にするなら
そもそもFILEポインタ使う関数なんか使うなよ
そもそもFILEポインタ使う関数はバッファリングしてるから
いちいちメモリコピーしてんのに

そこまでガタガタいうなら
openとreadで普通にメモリブロック読みこむ処理にしろよ
ハゲ
0946754 (ワッチョイ 66f1-Y8gp)2018/07/12(木) 23:13:14.06ID:8VUYfWV40
>>940,941
setvbufも初耳です。
941さんのコメントからすると、これまた難しそう。。

色々と情報ありがとうございます。
0947デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/12(木) 23:13:42.35ID:LmT6lrwh0
ちなみになFILEポインタは構造体にファイルデスクリプタもってる
fopenでopenを呼び出してファイルディスクリプタ生成して構造体に保存してる
ファイル読むときはファイルディスクリプタでread使ってバッファリングしながら読みこんでる

このスレの低学歴どもはこういう基本的なことわかってんの
0948デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/12(木) 23:15:00.75ID:LmT6lrwh0
そのsetvbufというのが
バッファリングするバッファのサイズだ
つまり、バッファにたまったメモリをひたすらコピーしてる
0950デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/12(木) 23:18:11.64ID:LmT6lrwh0
32bit越えるmmapとか
そんなやばそうなもん使うのか
まずちゃんと動作するか確認することになるわ
0951デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/12(木) 23:31:34.69ID:LmT6lrwh0
休日にオレのエレガントなファイル読みこみ処理作ってやるから
楽しみにしてなさい
0956754 (ワッチョイ 66f1-Y8gp)2018/07/13(金) 00:20:28.77ID:Zia1PITL0
>>951
ありがとうございます。楽しみにしています。

>>933,952,953
解析と読み込みを分けているんですね、8.6秒は解析で、読み込みがHDDのハード限界の60秒(高速な外側)、77.9秒(低速な内側)。
そこで >>851 の読み込み、解析合わせると78.1秒でほとんどがHDD律速ということか。

>>954,955
ご説明ありがとうございます。 >>782 の動作を調べてみます。
freadの扱いで質問なのですが、byte単位で取得すると最後尾が改行ではなく途中で終わることがあるので、
改行区切りになっているdata変数がだと思って、937に書いたコードでは、自分がわかる知識で考えて、
freadで読み込んだあとに改行のところまでfseekで戻しているんですが、この考え方はあっているのでしょうか?
0957754 (ワッチョイ 66f1-Y8gp)2018/07/13(金) 00:21:42.58ID:Zia1PITL0
data変数がだと思って →×
data変数が必要だと思って →○
0958754 (ワッチョイ 66f1-Y8gp)2018/07/13(金) 00:28:02.06ID:Zia1PITL0
>>952
すみません、あと、 >>936 に書いているfgets版のコードだとどれくらいの速度が出ていますでしょうか?
fgetsで回したものと fread + >>782 のコードでどれくらいの比率になるのか気になりました。
0959デフォルトの名無しさん (ワッチョイ f1d2-LQig)2018/07/13(金) 01:21:45.76ID:5Z2wrzxE0
MS製の金毘羅でfgets(), fgetc()を試す場合は、_CRT_DISABLE_PERFCRIT_LOCKS 必須で。
0962デフォルトの名無しさん (ワッチョイ 3d50-Se03)2018/07/13(金) 07:08:38.04ID:n6X2CtBj0
>>956
読み込みの境目の処理方法はいくつかあります

A. 1行全体が連続してバッファに存在しなくてもいい作りにする
B. リングバッファ
C. fseekでファイルポインタを戻してから読み込む
D. あまりをmemcpyでバッファの先頭にコピーしてから読み込む
E. ほか

読み込み単位が大きければ C. or D. のコストは無視出来るので C. D. で
読みこみ単位が小さければ A. B. なども考える
といった感じかと思います

今回私は解析処理が簡単に作れて、HDDの読み込みに一切影響を与えない、D.で作りました
0964754 (ワッチョイ 66f1-yKfk)2018/07/13(金) 11:12:41.59ID:Zia1PITL0
>>959
ttp://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-8.1.0/gcc-8.1.0.tar.xz
これを使ってるので、まずはMSのオプションは関係なさそうです。
でもMSのコンパイラは早いという記事をこの前読んだのでそっちの方に乗り換えた方がいいのかな。
完成した後に両方テストして良好な方を検討しようと思います。

>>962,963
A,Bは難易度高そうですね。
Cは自分がやった手法のようですが、Dはポインタを戻す分の再取得が無いのでCより良さそうに見える。
Dを検討してみます。

fgetsもfreadも同じ時間ですか。
となるとfgets 13GB 17秒だから、そのレベルの速度は出るはずなのか。

今782のコードを調べて動作がわかってきました。
char演算で文字コードを数字の始点に移動させ9以下で数字以外(スペースor改行)を判定。
*10で桁を表現し、文字コードの番号で演算。(文字→数字変換していない!!)
このファイルで支配的な数字行が文字→数字変換が一度もないおかげですごく効きそう。
原理がわかるとなるほど!となるけど、1桁ずつ演算、文字コード演算は自分がやってたら絶対にたどり着かない発想です。
0965デフォルトの名無しさん (ワッチョイ 119e-dYrz)2018/07/13(金) 11:27:35.12ID:oo2UOY380
text/byte stream は異なる。
文字列はバイトじゃなく、テキスト

バイトは構造体など、構造が決まっているもの

改行区切りで、改行の位置が変わるものは、テキスト処理
0971デフォルトの名無しさん (ワッチョイ 3d93-x/6u)2018/07/13(金) 20:14:02.67ID:Zuzc5Uab0
C99の可変長配列はC++には取り入れられなかったし、
C11ではオプションに格下げされたんじゃなかったっけ?

年式でフラフラする機能の典型例のような記憶がある。
0974はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5e6f-LQig)2018/07/13(金) 20:56:12.79ID:dep+wTpc0
>>971
VLA のことと誤解してないか?
ここで言ってる「可変長構造体」は構造体の最後の要素が不完全型であることを許すルールのことだと思う。

struct a {
int a;
int b[];
};

このとき sizeof(struct a) は要素 b を含まない大きさを返す。
malloc(sizeof(struct a)+(bの大きさとして確保したい大きさ)) とすれば b が可変長な構造体として使える。

このルールが出来る前 (C89) は仕様に沿ってこのようなことをしようと思うと
配列 b の大きさを便宜上 1 として指定しておく、
つまりは

struct a {
int a;
int b[1];
};

としておいて malloc のサイズ指定のときに要素一個分の大きさを差し引いて調整するようなことをしていた。
0976971 (ワッチョイ 3d93-x/6u)2018/07/13(金) 21:06:27.07ID:Zuzc5Uab0
すまん、皆の言う通りだ。ちゃんと読めば
構造体の末尾メンバの0サイズ配列の話だと分かる流れだったのに、
なんでか裸の配列の要素数だと思いこんでしまった。
0978はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5e6f-LQig)2018/07/14(土) 02:09:53.78ID:Eblv1Llg0
>>977
ゼロが返ってきたぞ。

ただし、 C/C++ におけるオブジェクトはメモリの一部を占有するものでありポインタで示せるものという要求があるので、
それと矛盾なく使うには色々と気を付けないといけないかもしれない。

ちなみに、クラスのメンバにストレージを割り当てないこと (要するにサイズゼロのオブジェクト) を許す [[no_unique_address]] という属性が C++20 で追加されてる。
0981デフォルトの名無しさん (ワッチョイ 7db3-mkVh)2018/07/14(土) 10:41:27.91ID:uSYNDUAh0
>>979
非staticなメンバを一つも持たない上、そのクラスのポインタを扱わない(=多態性を必要としない)のに
継承したりメンバとして持ったときに1バイト追加されるのがうざいからだろ
0992デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/14(土) 13:55:09.44ID:1N2GRIlb0
linuxと聞いてた(>>743)のになんでMSのコンパイラの話がでてんねんと

まず実機でコレ走らせて試験をしなさい

@ 下のソースをコンパイルしてbaka_testという名前の実行オブジェクトをつくりなさい

 linuxなら↓こっち
 https://ideone.com/e9iA5m

 windowsなら↓こっち
 https://ideone.com/D4T1zh

A で、こんな試験をする
 https://ideone.com/82BnFZ

ちなみにwindowsはバッファサイズを
セクタバイト数の倍数でないとちゃんと動作しない
それはwindowsの仕様だからな(メモリアドレスはmallocで返ってくる先頭のポインタオフセットで問題ないことは分かってる)

バッファサイズを何バイトにするのが読みこみで効果的か
決めたほうがいい
試験結果をちゃんと報告するようにな

 あとOSは64bitでいいんだな
 それによっても話がかわってくる
0993デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/14(土) 14:04:41.54ID:1N2GRIlb0
ちなみにwindowsでopenとかread使うのはクルクルパーだからな
msのランタイムがウンコなのは有名だからな

msウンコランタイムのopenでCreateFile呼び出してる
msウンコランタイムのfopenでopen呼び出してる

msウンコランタイムのreadでReadFile呼び出してる
msウンコランタイムのfgetsやfreadでread呼び出してる

わかった?
0994デフォルトの名無しさん (ワッチョイ 66f1-Y8gp)2018/07/14(土) 15:10:33.64ID:FOAGvAbs0
>>993
ありがとうございます。

g++ -o baka_test $file_name
echo 512,`./baka_test $input 512` > baka_result.txt
echo 1024,`./baka_test $input 1024` >> baka_result.txt


上記を13GBのファイルで試したら下記結果が出ました。

512,13
1024,7
2048,5
4096,3
8192,2
16384,2
32768,2
65536,2
131072,1
262144,3
524288,2
1048576,2
2097152,2
4194304,2
8388608,2
16777216,3
33554432,2
67108864,3
134217728,3
268435456,3
536870912,3
1073741824,3
0995デフォルトの名無しさん (ワッチョイ 66f1-Y8gp)2018/07/14(土) 15:11:30.95ID:FOAGvAbs0
これは一度に読み込むサイズは4KBを超えると速度に影響はなく、
>>962 のC,Dパターンの場合だと、最低1行分のバッファが必要なので、
その場合、一行のバイト数のMAX値で決めれば良い。
ということでしょうか?
0996デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/14(土) 15:28:09.27ID:1N2GRIlb0
どんだけ速いHDDやねん。。。
すでにキャッシュされてんのか

その13とか7とか5とかいう数字は
ディスク読みこみ(ディスクの内容をバッファにコピー)にかかった時間は秒だぞ
ちゃんとコード書いてmsecにして計測したほうがよかったのかもな

暇だったら、シェルで精度の高い計測値だせるように工夫しなさい
数十秒はかかると思ってたからmsecなんか考えてもなかったわ

で、実機のOSは64ビットでいいのか
ここ結構重要だからな
0997デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/14(土) 15:31:55.15ID:1N2GRIlb0
めんどいから128Kで2秒かからない
でいいや
0998デフォルトの名無しさん (ワッチョイ 66f1-Y8gp)2018/07/14(土) 15:43:51.17ID:FOAGvAbs0
すみません忘れてましたlinux 64bitです。

> 128Kで2秒かからない
これのことですね。 →131072,1

昨日の夜(今日の朝5時)までやって >>962 のCパターンでようやく一通りファイルを
読み込めるようになりましたが、やはり速度が出ていません。

13GBファイルで確認

fgetsのみ解析なし →17秒
freadで各文字列解析、数値行の演算を行ったもの →1分超え

コード書いてて気になる箇所がいくつかあるので質問しようと思ったけどもう1000になりますね。
次スレで質問させてもらいます。
0999デフォルトの名無しさん (ワッチョイ a580-lT5f)2018/07/14(土) 15:45:39.42ID:1N2GRIlb0
なんかよく分かってもらえてないようだが
この値はブロックで読みこむ固定のバッファリングサイズ
1行分とか関係ない

プログラムではきっと
バッファリングされたメモリを解析することになる

とりあえず今回は、必ず128K単位で読みこむ
128K単位のメモリを
正直もっと増やしてもいいとは思う

あととりあえず行の最大バイト数は256バイトで十分でいいや
10011001Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 36日 16時間 10分 3秒
10021002Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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