C++相談室 part143

■ このスレッドは過去ログ倉庫に格納されています
2019/06/15(土) 13:51:53.57ID:DKQ0QQLH0
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

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

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

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvv:1000:512:----: EXT was configured
2019/07/04(木) 00:19:04.81ID:Evy1L2/hM
クロックとか言ってるやつもロートルだな
全く世の技術についていけてない
2019/07/04(木) 00:19:14.34ID:QgrgqeUu0
>>597
ない
2019/07/04(木) 00:19:40.29ID:OupeWpkE0
>>596
>>598」にも書いたが、要素のサイズが大きい場合や、要素のコンストラクタの
重い場合には、reserve()はとても遅くなる。要素のコンストラクタの中で
メンバの確保やコピーのためにnewが1つでも行われる場合には、listよりもほぼ必ず
遅くなる。コンストラクタ内のnewがN個だとlistのN倍遅くなる。
2019/07/04(木) 00:21:13.94ID:Evy1L2/hM
ハイパフォーマンス必要なとこでlistなんか使わないからど素人さん
2019/07/04(木) 00:25:40.63ID:OupeWpkE0
>>601
それに、reserve()のためには、一般的には、要素は、コピー・コンストラクタを
持つ必要がある。一方、listの場合には、コピ・コンを省略できる。
C++を使っていると分かるが、デフォルト・コンストラクタを作ることはほぼ必須
だが、コピ・コンはめんどくさいので書きたくないことが多い。その場合に、
listの方が楽。
2019/07/04(木) 00:26:45.21ID:OupeWpkE0
>>602
vectorとreserve()の組み合わせはもっと駄目だ。
2019/07/04(木) 00:27:30.60ID:OMb74HbU0
forward_list
とか知らないんだろうな
バカそうだし
2019/07/04(木) 00:31:07.37ID:+bvr5vAX0
>>601
要素既知の配列と同様の用途の場合、まともなスキルのあるプログラマなら、サイズ指定constructor、empty状態でのresize、empty状態でのreserve
のいずれかを使う。
そうするとmalloc一回と、前者二つは要素数分の要素型の配置newデフォルトもしくはコピーconstructorが呼ばれる。
2019/07/04(木) 00:31:14.53ID:z3/vg39Q0
>>604
お前の頭中、vectorかlistしかないのなw
もとの生ポ押しはどうしたの?w
2019/07/04(木) 00:36:08.58ID:+bvr5vAX0
vector相当にcapaciry()+xなreserve相当をするCArrayってのがあってだな
MS自身がどうしてもこれじゃなきゃ駄目な場合以外使うなと言うくらいの糞
2019/07/04(木) 00:36:47.68ID:OupeWpkE0
>>606
要素数既知なら、最速が TYPE aaa[N] で次が new TYPE[N]。
逢えて vector を使う意味がない。

empty状態の reserve() とかしてまで vector にこだわる意味が分からない。
2019/07/04(木) 00:38:37.52ID:OupeWpkE0
>>607
むしろ逆で、生配列使えばいい場面で、何故か vector に固執する人がいるんだよ。
2019/07/04(木) 00:39:15.33ID:aorw8zR90
どこにそんな人居たの?
レス番あげてよ
2019/07/04(木) 00:48:01.35ID:+bvr5vAX0
サイズ完全固定ならstd::array
最大サイズが既知なら少し無駄だがvector
格納領域内包する最大サイズ指定のvector擬きがあればベストなんだが
2019/07/04(木) 00:51:39.87ID:+bvr5vAX0
後はサイズが大きくてスタック上に確保したくない時もvector使うだろ。
2019/07/04(木) 00:53:59.44ID:OupeWpkE0
>>613
その場合は、TYPE *pAaa = new TYPE[N];
2019/07/04(木) 00:56:53.06ID:knl8K+q10
まだやってるのかw
2019/07/04(木) 01:00:33.98ID:+bvr5vAX0
>>614
それ最悪
例外安全性放棄ほぼ確定
2019/07/04(木) 01:02:18.21ID:jo/K3cJX0
自称天才すげーな
自分が何かいてるのか分かってないんだろうな
規格も読んでなさそう
2019/07/04(木) 01:05:54.39ID:+bvr5vAX0
>>614
てか今時こんなコード書く奴いたら、できうる限り関り合いにならないようにするね。

こんなのが先輩面して新人に教育してたらもう最悪
2019/07/04(木) 01:21:19.34ID:OupeWpkE0
>>618
あなたは、C++とC#の速度が変わらないと思ってる系統の人だよね。
2019/07/04(木) 01:21:50.22ID:vGw4d28b0
>>597
ベクトル演算とか、並列処理とか

OpenCL, CUDA とか
2019/07/04(木) 01:52:09.26ID:GHUD7qNB0
shared_array はまだ標準化されてないんだね。
2019/07/04(木) 02:32:03.47ID:z3/vg39Q0
たぶんこのおっさん例外安全って何かわかってないw
2019/07/04(木) 02:56:32.67ID:OupeWpkE0
>>622
std::array を使うと例外安全が確保されて、
TYPE *pArr = new TYPE[N];
だと確保されないと思うのはなぜ?

絶対に確保できないと言い切れる根拠でもあるの?
2019/07/04(木) 02:58:14.89ID:boKHx0+g0
>>623
誰がヒープ回収するねん...
2019/07/04(木) 03:00:26.38ID:QgrgqeUu0
とりあえずnewとかmake_sharedとかIDEがなくても型が明らかな場合はauto使おう
2019/07/04(木) 03:00:52.24ID:OupeWpkE0
>>624
「ヒープを回収する」
とはどういう意味か分からない。

メモリ確保の失敗は大体回復不可能なはずなんだけど、どうするつもりなの。
2019/07/04(木) 03:01:53.76ID:OupeWpkE0
「メモリ確保に失敗したこと」のメッセージを出す以外に対処法はないと
思うんだけど。
2019/07/04(木) 03:16:52.36ID:+bvr5vAX0
なんでnewで例外起こる話しているんだか
本当に全くわかっていないのね
2019/07/04(木) 03:47:53.77ID:P4gQiU7c0
どうでもいい話はやめて今までにない新しい画期的なテクニックの話をしてくれ
頼む
一生のお願い
2019/07/04(木) 05:48:37.09ID:Vr4LlPEB0
>>549
> n * (P * 2 - E * 0.5) > H2 - H1.
> n > (H2 - H1) / (P * 2 - E * 0.5).
> となる。
(P * 2 - E * 0.5)がマイナスだと不等号が逆転するのを忘れている
3 > 2 の両辺を-1で割ると -3 < -2
2019/07/04(木) 07:22:01.27ID:Ic4+qAXvM
>>629
そんなテクニックはここに書かない
2019/07/04(木) 08:41:24.64ID:boKHx0+g0
>>626
newの例外の話なんてしてしてません。
本当にレベル低いやっちゃな
2019/07/04(木) 08:52:16.87ID:yrHYMywV0
TYPE *pArr = new TYPE[N];
と同じスコープ内(のdelete pArrの前)で例外が発生した場合に
>>624
>誰がヒープ回収するねん...
という話ですな
2019/07/04(木) 09:10:15.58ID:MHKH+BBjd
また話それたのかw
ポインタもコンテナも結局都合の悪いレスはスルーしてるからこうなる
2019/07/04(木) 09:34:14.60ID:8zHkL2vVM
こいつC++98で時間止まってるからな
20年かけてSTLコンテナの使い方学んで
その結果がvectorよりlist、それ以上に生ポインタが最強って結論
どうせ40代おっさん低収入だろうけど、自分を天才と呼び、
数学ががどうのこうの言うわり、単なる足し算掛け算をどや顔でさらすし、
本当読んでて可哀想になってくる
2019/07/04(木) 10:15:53.90ID:mwmcFkvyM
要素数固定ってコンパイル時に固定の意味と実行時にある値に決まるって意味があると思うけど
前者では T Arr[N]
後者では std::unique_ptr<T[ ],>
を使ってしまう。
それ自体をreturnしないときは std::array を使うのがかったるく感じてしまう
2019/07/04(木) 10:35:11.99ID:VBCrH1IpM
>>636
arrayはもうひと頑張りしないとだめだな。
宣言時に値を初期化するとき、値の数をテンプレートパラメータに手打ちとか
要素数省略できるCスタイル配列に負けてる
2019/07/04(木) 11:36:25.81ID:Bk1vOaTSa
>>637
c++17から推論補助が出たので要素数指定不要です。
c++14以前はmake_arrayとか作ればいける
2019/07/04(木) 11:42:55.77ID:mwmcFkvyM
でも std::begin std::end があるからスコープ内の単純な配列に std::arrayを使う
メリットがいまいちわからないんだよねー
2019/07/04(木) 11:55:46.77ID:zoOerLpiM
begin endは普通の配列にも使えるだろ
2019/07/04(木) 11:56:48.16ID:tdjije7mM
>>638
おお、ほんまや。
かゆいところに手が届いて行くのぅ
2019/07/04(木) 12:06:11.23ID:VQxD4eRSd
template関数で受けたときにポインターにならないからauto lambdaで受けてもsizeがとれる
2019/07/04(木) 12:17:57.65ID:mwmcFkvyM
>>640
だから普通の配列を使ってしまうという話なんだが
2019/07/04(木) 12:19:43.85ID:mwmcFkvyM
>>642
その場合にはそうだね
でも関数に渡すとき大抵 begin end だからなあ
2019/07/04(木) 12:49:15.77ID:bmYDtW5Wp
>>642の言ってるのは配列の参照にキャストされないからだと思うんだけど(自分もそれが不便だと思う)
そのキャストを実装しない理由あるんかね?
中身ただの配列なんやろ?
2019/07/04(木) 12:50:55.35ID:zoOerLpiM
>>643
変なところで改行するなよ
2019/07/04(木) 15:52:29.03ID:mwmcFkvyM
>>646
なるほどすまん
100人中98人位が誤解する改行だた
2019/07/04(木) 17:29:10.64ID:XTdeRRSwa
構造体をchar配列にシリアライズする方法を教えてください
2019/07/04(木) 17:31:04.99ID:QgrgqeUu0
memcpy
2019/07/04(木) 17:32:23.03ID:MlPmA9V9M
キャストしてぶっ込め
なお環境とアドレスによってはバスエラーが発生したりするよ
2019/07/04(木) 17:41:18.95ID:DFmBoT0+d
>>645
cとの互換性に起因した過去コードとの互換性保つために、配列を引数で渡そうとするとpointer渡しになるのだろう。
受け側でtemplate使ってT (&arr)[N]みたいに明示的に引き取らない限りは

c++20でstd::spanが使えるようになれば楽になるな。
それでも完全転送は通らないけど
2019/07/04(木) 17:42:05.56ID:Bk1vOaTSa
配置newで出来たりしますか?
2019/07/04(木) 20:00:03.82ID:C9xm0dvc0
>>651
いや、受け側でそう書いても、普通の配列はいけても
arrayは通らないんだわ・・自分の書き方が間違ってるのかもしれんけど
https://wandbox.org/permlink/LBzgUfB6MRtk9P12
2019/07/04(木) 20:05:01.64ID:SRe/Pasd0
使ってるコンパイラのArrayヘッダの実装見てそのメンバ変数名をしらべてそれを指定すれば通る
2019/07/04(木) 20:12:08.06ID:DFmBoT0+d
reinterpret_castならいけたけど未定義かどうかは知らん
2019/07/04(木) 20:40:50.48ID:C9xm0dvc0
別に無理に通そうとしてるわけじゃないんだぜ
arrayの不備のひとつではないかな、ってだけ
2019/07/04(木) 20:53:10.33ID:SRe/Pasd0
暗黙変換定義すれば出来るんだろうけど、出来ない方が自然な気がする
2019/07/04(木) 20:54:01.06ID:GHUD7qNB0
>>636
以下コードがちゃんと動くの今知った。サンクス。
std::unique_ptr<Test[]> test(new Test[5]);
2019/07/04(木) 21:48:13.92ID:WSU/R6xT0
確かに内部配列の参照を取得する手段はあってもいい気がする
先頭のポインタはdata()で取れるけど、配列型そのものへと読み替える手段って標準の範囲にはないんだな
ちょっと意外
2019/07/04(木) 22:18:07.85ID:MlPmA9V9M
えっじゃあdataはどこをさしてんのよ
2019/07/04(木) 22:36:36.22ID:j4C7DC1D0
>>659の言う「配列型」が要素数まで含んだ型のことなら無くて当たり前。
要素数を含まないのなら先頭要素へのポインタと同等。
なにを意外に思ったのかわからん。
2019/07/04(木) 22:41:46.89ID:C9xm0dvc0
>>660
いや、わかりにくかったかもしれんけど
配列の参照にキャスト出来れば配列またはarrayから、静的に要素数が取れるのよ
現状だとそういう時array版と配列の参照版の2つを書かなきゃいけない
ので配列の参照のキャスト演算子も定義しててくれたらなぁ・・
と思ったらポインタへのキャストも無いのね

まぁあくまでSTLフレンドリーな配列ってことなんだろう
2019/07/04(木) 22:51:51.05ID:GHUD7qNB0
ポインタ使うなと言ったそばからイテレータ使ってたら同じだろ、と誰も言わない優しいスレ
2019/07/04(木) 22:52:31.12ID:8zHkL2vVM
バイナリ肥大を屁とも思わず静的解決マンセーのやつに名前つけたいんだけどなんかないかな?
2019/07/04(木) 23:07:27.43ID:OMb74HbU0
イテレータ渡してるならdistanceで取ればええやん
2019/07/04(木) 23:11:39.07ID:+bvr5vAX0
バイナリむしろ減ることも多いしな
バイナリ肥大が許せないなら多少の工夫で何とでもなる
2019/07/04(木) 23:30:20.81ID:kZ6AZY+J0
バイナリ肥大を気にするならそもそもc++じゃなくてc使えや。
2019/07/04(木) 23:32:41.86ID:+bvr5vAX0
c使っても変わらんだろ
無駄に面倒臭くなるだけで
c++のままバイナリ肥大対策した方が楽だし効果も変わらない
2019/07/04(木) 23:34:32.32ID:kZ6AZY+J0
なんだ真性のバカか。
2019/07/04(木) 23:35:07.30ID:gNJuQcZk0
std::vector::resize(size_t n)ならn要素きっかりになるお
および(>>439もご存知のはずの)std::vector::reserve()で10とか20に指定することもできるお
(その通りのメモリ確保が行われるかどうかは最適化に依存し得るが

>>439
そのサンプルコードでは不適切で、最適化が利いている可能性があるお
だってコンパイラが見渡せる範囲で要素のpush_back()をしていないし…
(していたとしても定数回数のループならやっぱ最少サイズになり得る
2019/07/04(木) 23:36:33.90ID:gNJuQcZk0
訂正;
誤:だってコンパイラが見渡せる範囲で要素のpush_back()をしていないし…
正:だってコンパイラが見渡せない範囲で要素のpush_back()をやられる可能性が無いコードやし…
2019/07/04(木) 23:37:50.01ID:OMb74HbU0
お前らそんなにカツカツのターゲットで仕事してるの?
フリースタンディング環境でトースターの制御マイコンとかそういう世界?
2019/07/04(木) 23:42:16.32ID:+bvr5vAX0
マイコンでRAM1キロとかでもc++つかうよ。
ヒープどころかスタックすら殆んど使えず、ループカウンタすらstatic使うような状況でも、高級マクロとしての性能はc++の方が上
オーバーロード使えるだけでもありがたい
2019/07/04(木) 23:44:44.77ID:gNJuQcZk0
しかしポインタは悪という考えには賛成する
全てのオブジェクトはimmutableであるべきだが現実にはそうではない
(オブジェクト指向プログラミングはmutableなオブジェクトを作る仕事だと一般に理解されている
するとポインタや参照の使用はオブジェクトの参照透明性を失わせる究極の悪となる
2019/07/04(木) 23:45:53.18ID:+bvr5vAX0
バイナリ肥大は余り気にしなくていい
ROM容量はRAMとは桁違いに余裕あるし
速度稼ぐためにテーブル作って持っておくとかでもc++だとやり易いw
2019/07/05(金) 00:42:05.40ID:iD2vPqXr0
ポインタは悪いは草
プログラムの性質そのものだろw
良いも悪いもない
2019/07/05(金) 00:50:35.24ID:sXJnPGx/0
>>675
おいおい
今時組み込みでrom実行する環境ほとんどないだろ
だいたい普通肥大化したかどうか比較できん
2つ作ることなんてまずないし
もし容量が足りなくなったら実行コードより他のでかいデータがやり玉になるので目立たない
678デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/05(金) 01:08:22.53ID:V2Gzd6Sr0
参照子を長い時間や広い空間で保持する行為が危険なのはどんな言語でも同じ。
2019/07/05(金) 01:20:04.09ID:RI4o57M10
>>678
全部値コピー(deep copy)ならそうはなんね

>>67
ポップアップトースター…
2019/07/05(金) 01:20:13.88ID:pqoXwmD60
ファームウェアのバージョンアップとかなら容量との戦い出てくるんでないの
2019/07/05(金) 01:20:46.48ID:Gz4SaY1k0
rom実行する業界ですまん
自分とこの環境はrom容量も限られてるけどロジックでの肥大化よりデータの肥大化の方が圧倒的に大きいからそこまで気にならんけど
2019/07/05(金) 01:29:54.68ID:RI4o57M10
すまん全部immutableならと書こうとして手が滑った、
2019/07/05(金) 01:33:18.52ID:RI4o57M10
ポップアップトースターのファームウェア(入力はほとんど時間と温度だけ、出力は動作だけ)で
実行コードより他のでかいデータが生じるケースとは
なんじゃらほい
2019/07/05(金) 01:33:25.26ID:iD2vPqXr0
高級アセンブラの役割があること理解してる奴いないな
2019/07/05(金) 01:48:21.75ID:84H5xbwY0
シンプルなポップアップトースターに電子制御はいらんし
電子制御するような高機能トースターなら音声データくらい入ってるかもしれん
2019/07/05(金) 02:03:59.75ID:iD2vPqXr0
転倒したときに加熱が停止するようにするくらいの制御はいるでしょ
2019/07/05(金) 02:10:23.60ID:RI4o57M10
>音声データ
なおROMに置ける固定データはコードに含めるものとする
>>675も事実上そう言っているのだから後出しではナイ

>>686
それは「出力は動作だけ」に含まれる
転倒したときプログラムがやることは、姿勢判定用センサと温度とタイマーの入力を受けて状態変数を何個か弄りつつヒーターを切るだけなんじゃ…
データの生成というプロセスは無い
2019/07/05(金) 02:11:34.20ID:84H5xbwY0
転倒時の停止なんかに電子制御はいらん
床面に接触するとオンになり、離れたら回路が切断される、というような単純なスイッチだけで十分
2019/07/05(金) 02:12:54.60ID:RI4o57M10
もっとも、状態変数みたいなmutableで邪悪なものを使わずに
全てimmutablueなオブジェクトでスマートに済ませるなら、オブジェクトの生成がデータの生成に該当し、多少RAM容量を消費するが
な、
2019/07/05(金) 02:20:38.54ID:iD2vPqXr0
>>688
なるほど
2019/07/05(金) 07:41:44.43ID:RDJzDNDNM
Rom実行でC++のテンプレートばりばり使ってバイナリ肥大しても問題ない環境ってどんなの?
プロセッサ、OS、メモリのサイズあたりどんなもん?
2019/07/05(金) 08:32:12.48ID:Gz4SaY1k0
OSは無し、CPUは数百Mhz、RAMは数十KB
誤解を招いたかもしれんが環境がこういう感じなんでテンプレートばりばりなんて無理なんだ
693デフォルトの名無しさん (ワッチョイ)
垢版 |
2019/07/05(金) 10:27:12.65ID:V2Gzd6Sr0
C++はろくに使いもしない巨大モジュールがプログラムのビルド時にリンクされるから実用性ないわな・・・
2019/07/05(金) 11:53:33.73ID:RDJzDNDNM
>>692
そのレベルの組み込みならわかる
C++全面的に使ったりしないよね

謎なのが
>>673
その環境でどうやってC++使い倒してんの?
例外ありなんだよね?
2019/07/05(金) 12:05:00.53ID:vxFjgZssM
またCで十分おじさんか
2019/07/05(金) 12:26:27.03ID:8Dqkh8+pd
もちろん例外なし、RTTIなし、標準コンテナなし、仮想関数無し、new mallocも無し
だよ
templateで組み込みのC関数呼び出しに変換する固定小数点クラス作ったり、peripheralの実アドレスにmapしてメンバ関数で制御可能なラッパー作ったりと、メモリやバイナリ肥大しない様に使うのでも、c++機能は色々使い手が多い
2019/07/05(金) 13:02:54.74ID:yhA0U74XM
いわゆるBetter Cだろ
俺もそう言うのよくやる
2019/07/05(金) 13:20:11.14ID:RDJzDNDNM
>>696
バイナリ肥大気にしないって言った人?
言うこと変わってんじゃんw
2019/07/05(金) 13:31:43.83ID:h+45fasi0

元々バイナリ肥大全く気にしないとかではないだろ
template使うとバイナリが必ず肥大するってのが大嘘なのよ
うまく使えばCよりユーザー側の負担を減らしたまま、バイナリサイズ減る方向に誘導出来る
ifdefのスイッチを型で分岐して自動指定するようなことが出来るからね
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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