C++相談室 part149

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2020/02/18(火) 06:19:41.54ID:xvjipUWj
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part148
https://mevius.5ch.net/test/read.cgi/tech/1580471646/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://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/ (日本語)
2020/02/18(火) 07:30:53.57ID:6S1dA7EZ
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

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

---- テンプレ ここまで ----
2020/02/18(火) 07:50:56.98ID:KHr4ndHy
std::functionを使うなと言われたのは残念だが
newのときたまの遅さの可能性に警鐘を鳴らしたから勝利宣言しちゃおうかなっ
かなっ
2020/02/18(火) 08:39:06.73ID:vOZ3pUbp
>>1
2020/02/18(火) 10:35:35.23ID:xvjipUWj
function・・・それだけか?
なんか組み込みにC++は向かないとまで
大きく出る理由として弱すぎね?
2020/02/18(火) 10:36:23.95ID:xvjipUWj
あ、IDは気にしないでね
スレ主としての発言じゃないよ
2020/02/18(火) 10:43:38.96ID:TnY2bwh5

それ言ってたのは別の人だし過剰反応しすぎだろ

というかあのキッズを叩くと必ず単発煽りが出てくるのは恐らく同一人物だろうな

>>3
標準ヒープ使われてもいいなら使えばいいじゃん
2020/02/18(火) 10:48:05.96ID:xvjipUWj
君は誰?
組み込みにC++は向かないなんて思ってないなら
俺はそれ以上言うことないけど
2020/02/18(火) 10:55:26.54ID:TnY2bwh5
>標準ライブラリでもallocatorが指定できないものもあるんだよ
の人ではないよ

というか何がそんなに気に入らないのかね
組み込みに向かないと言ってた人はArduinoがどうこう言ってたろ
実際RAMが少ない環境ではかなり慎重に使わざるを得ないんだろ、知らんけど
2020/02/18(火) 11:00:57.59ID:Nm2LYTxd
std::function は (呼び出しの型が一致さえすれば) どんな関数オブジェクト (または関数ポインタ)
でも格納できるというのは強いんだが、
実際にはコンパイル時に型が確定できる場合の方が多いと思うので
std::is_invocable_r で制約を付けた方が少し性能は良いと思う。

でもテンプレートって型引数ごとに実体化されちゃうから、
素朴に考えると引数をラムダ式で与えてたら呼び出しごとに実体化されることになっちゃうよな……。
(最適化で上手く統合されることもあるかもしれないけど。)
どちらを選んでもいいことばかりではないので、結局は場合によるとしか。
2020/02/18(火) 11:05:28.20ID:xvjipUWj
>>9
何がってそのままだよ
組み込みにC++は向かない、という意見に反対だ
2020/02/18(火) 11:09:15.65ID:TnY2bwh5
だから過剰反応しすぎだろ
functionの話してた人はゲームだろうが
反対するなら根拠を示せばいいし
少なくとも別の人の話は混同するな
2020/02/18(火) 11:11:12.73ID:TnY2bwh5
>>10
ラムダなら実体化っつっても毎回関数オブジェクト作るのと変わらんやろ
2020/02/18(火) 11:13:33.03ID:xvjipUWj
IDなんかアテにならない
基本的に匿名掲示板なんだから
人違いはそう言えばいい

もっとも、それを信じるかどうかは別だが
2020/02/18(火) 11:19:56.99ID:TnY2bwh5
まさか前スレID:tDJaHP5Kじゃないだろうな?
2020/02/18(火) 11:42:54.44ID:xvjipUWj
>>15
いや俺tDJaHP5Kだよ
過剰反応するなっていうおまえさんこそ
なんでそんなにとんがってるんだ?
色々勘ぐってしまうぞ
2020/02/18(火) 11:48:32.16ID:TnY2bwh5
>「後で」かw
>もう1000間近だし期限切らないでおけば時効だろってか?
こんなん書いてよく開き直れるな
側から見てて気分悪かったぞ
ちなみに俺は前スレnfQlnp9bな
2020/02/18(火) 11:55:50.57ID:Nm2LYTxd
>>17
それは妥当だろ。
あの場面ではライブラリにアロケータを指定できない場合があると主張しながら例を示さない
のは議論の仕方がわかってないクズだし、そういう奴に遠慮してたら話が進まねーよ。
2ch って元々そういうところじゃん。
2020/02/18(火) 11:59:04.13ID:xvjipUWj
ああ、あいつか
元々newの話だったのに
mallocの話だってクレーム垂れてきたやつね
2020/02/18(火) 11:59:40.16ID:TnY2bwh5
は?頭湧いてんのか?
最終的に例出されたなら反論か謝罪かどっちかだろ
そこで逃げるという選択が取れる方がよっぽどクズだと思うがな
2020/02/18(火) 12:01:31.50ID:TnY2bwh5
毎回荒れる原因作ってんのお前らだろ
さんざん煽って言い返せなくなったら別人に成り済まして単発煽り入れたり
マジ邪魔だわ
2020/02/18(火) 12:03:20.38ID:xvjipUWj
それから俺は元々特定のレスや人物に異を唱えたわけではなく
流れ全体に対しておかしいと思ったことを言ったのが968だったぞ
2020/02/18(火) 12:07:30.24ID:Nm2LYTxd
>>20
前スレで野党に喩えたのはそういうとこね。
事実関係は議論の前提だから、共有しないで先延ばしする理由はない。
カルトクイズに答えられない相手を見て悦に入るようなやつがクズでなくてなんなんだ。
2020/02/18(火) 12:08:17.71ID:xvjipUWj
だいたい喧嘩売ってきたのは978で
それまで平和的に話していた俺が
ひとこと言い返したのだけ取り上げて
気分悪いとかどういうバイアス持ってるんだよ
2020/02/18(火) 12:11:28.72ID:TnY2bwh5
>前スレで野党に喩えたのはそういうとこね。
それはどうでもいい、問題にもしてない

>カルトクイズに答えられない相手を見て悦に入るようなやつがクズでなくてなんなんだ。
悦に入ってたかどうかは本人に聞け
というか調べ方は出してくれてただろうが

お前も都合の悪いことからはとことん逃げるから、悪いが相手したくない
2020/02/18(火) 12:14:37.63ID:TnY2bwh5
>>24
>>978もそれまでのお前の態度と同程度には平和的だと思うが
どういうバイアス持ってるんだよ
悪いがもうキチガイキッズの相手はしたくない、絡んで悪かったな
2020/02/18(火) 12:17:59.50ID:xvjipUWj
自己弁護にしか見えねえ
どうやら勘ぐりは当たってたようだな
2020/02/18(火) 12:21:22.79ID:TnY2bwh5
アホか
俺が前スレ>>978本人だったらもっといじり倒してるわ
2020/02/18(火) 12:27:49.37ID:xvjipUWj
言えば言うほどドツボだぜw
2020/02/18(火) 13:53:54.86ID:Nm2LYTxd
MinGW のライブラリを見てたら std::function にも SSO が入ってる。
データメンバの総計が 16 バイト以下の関数オブジェクト (キャプチャした変数が少ないラムダ) なら new は呼ばれない。

※ string ではないのにこの最適化を SSO と呼んでいいものなのかどうかわからん
※ 16 バイトというのは環境によるだろうし、 SSO がないこともあるだろう
※ とはいえ、主要な実装ではだいたい有ることを期待できるのではなかろうか

間接参照にはなるから std::function はわずかにコスト高には違いないかもしれないけど、
ちょっとしたことに使う分には急激に実行コストが上がるというほどではない。

リソースの限られた組み込み環境だといずれにしても基本的なライブラリも
自前で用意せざるを得なかったりもするだろうし、
標準ライブラリをフルセットで使えるほどの環境ならみみっちくリソース消費量を抑える必要もないだろうから、
使いどころが適切であれば全体としてはあまり問題にならなさそうという感想。 (あくまでも個人の感想です!)
31デフォルトの名無しさん
垢版 |
2020/02/18(火) 17:23:06.88ID:iYoDhrK1
ちゃうねん。
2020/02/18(火) 17:35:08.64ID:Nm2LYTxd
そうか (´・ω・`)
33デフォルトの名無しさん
垢版 |
2020/02/18(火) 17:37:59.36ID:iYoDhrK1
僕はArduinoこそC++パワーが必要と言ってるんですよ。
34デフォルトの名無しさん
垢版 |
2020/02/18(火) 17:41:06.24ID:iYoDhrK1
Arduinoは様々な亜種があるので、テンプレートでゴニョゴニョすると、何かいいことが起きるのではないか?
そんなことを議論してほしいわけですよ。
メモリーは2KBしかないけれども。
35デフォルトの名無しさん
垢版 |
2020/02/18(火) 17:45:54.66ID:iYoDhrK1
ちなみにエルチカとこんな感じ。
最大32256バイトのフラッシュメモリのうち、スケッチが932バイト(2%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が9バイト(0%)を使っていて、ローカル変数で2039バイト使うことができます。
2020/02/18(火) 17:46:01.07ID:Nm2LYTxd
>>33-34
僕って誰や?

ランタイムのパワーが必要ないものはリソースの少ない環境用に積極的に活用するべきだとは思う。
Arduino についてはよう知らんけど、ドキュメントを見た感じだと type_traits のような
(実行時の) マシンパワーが要らないようなものまで除く必要はないやろという気持ちになる。
37デフォルトの名無しさん
垢版 |
2020/02/18(火) 17:48:36.87ID:iYoDhrK1
C++標準ライブラリはないけどテンプレートは使えます!
38デフォルトの名無しさん
垢版 |
2020/02/18(火) 17:51:48.28ID:iYoDhrK1
魔術師が活躍する舞台として最高だと思いますが。
なぜ参入してこないのか。
39デフォルトの名無しさん
垢版 |
2020/02/18(火) 17:58:28.64ID:iYoDhrK1
Running 5 test cases...
---------- std_algorithm__adjacent_find_1 ----------
std::vector<std::uint32_t>
size(): 104,857,600
std::adjacent_find: 66ms

---------- std_algorithm__is_sorted_1 ----------
std::vector<std::uint32_t>
size(): 104,857,600
std::is_sorted: 66ms

---------- std_algorithm__sort_1 ----------
std::vector<std::uint32_t>
size(): 1,048,576
std::sort: 119ms

---------- std_algorithm__unique_1 ----------
std::vector<std::uint32_t>
size(): 5,242,880
std::unique: 4ms

---------- std__vector__copy_1 ----------
std::vector<std::uint32_t>
size(): 104,857,600
copy assignment: 220ms
new std::uint32_t[]
size: 104,857,600
std::memmove: 55ms

*** No errors detected
40デフォルトの名無しさん
垢版 |
2020/02/18(火) 17:59:19.58ID:iYoDhrK1
一億個コピーで220msだった。
2020/02/18(火) 18:04:45.17ID:Nm2LYTxd
>>38
たぶん探せばそれっぽいライブラリもあるんちゃう?
https://www.google.com/search?q=Arduino++C%2B%2B+template+library
42デフォルトの名無しさん
垢版 |
2020/02/18(火) 18:05:23.55ID:iYoDhrK1
ありがとん。
2020/02/18(火) 18:08:56.36ID:sX1qjJQt
>>30
SSO = Small-string optimization
44デフォルトの名無しさん
垢版 |
2020/02/18(火) 18:13:40.86ID:iYoDhrK1
Arduinoも一応newは使える。
使わないけど。
2020/02/18(火) 18:25:28.71ID:Nm2LYTxd
>>44
new を使わずに、かわりにどうすんの?
46デフォルトの名無しさん
垢版 |
2020/02/18(火) 18:27:32.40ID:iYoDhrK1
2KBしかないからローカル変数。
47デフォルトの名無しさん
垢版 |
2020/02/18(火) 18:31:23.28ID:iYoDhrK1
基本的にグローバル変数を駆使するしかないけど、結構強烈に最適化かかるので、意外と2KBで何でもできる。
2020/02/18(火) 18:45:24.62ID:Nm2LYTxd
プログラムが極端に小さいなら高度な抽象化をする甲斐がない。
抽象レイヤを挟むことで綺麗になるよりも複雑さが増すだけになりがち。
本当に使いまわす部品は綺麗に整理するに越したことは無いけど、
メモリ 2KB かそこらの環境ならベタ書きで十分でしょ。 (YAGNI 原則)

C++ が組み込みに向いていないとは言わないけど、
そのレベルで極端にリソースが制約されている状況では必要でもないと思う。
49デフォルトの名無しさん
垢版 |
2020/02/18(火) 18:46:17.48ID:iYoDhrK1
パソコンでは、恐れることなくnew使って良いと思うけど、static_vectorというのも自作した。
2020/02/18(火) 18:48:40.47ID:Nm2LYTxd
>>48
もちろん単にやるのが楽しい! というのも動機としてはありうるので趣味でやる分にはどんどんやったらいいと思うけど。
51デフォルトの名無しさん
垢版 |
2020/02/18(火) 18:48:49.63ID:iYoDhrK1
>>48
まあ確かに。
でも使いまわし出来ると便利だし、C++なら...やってくれる!
2020/02/18(火) 18:58:47.76ID:CLqeafa/
いやいや、固定小数点とか組み込みだからこそのtemplateがふさわしい場面は結構あるよ
53デフォルトの名無しさん
垢版 |
2020/02/18(火) 19:00:28.24ID:iYoDhrK1
小数点難しいよね。
難しすぎるわ。
2020/02/18(火) 19:15:07.85ID:Nm2LYTxd
>>49
どういう意味で static なの?
大きさが固定ってこと?
2020/02/18(火) 19:17:56.69ID:CLqeafa/
ストレージ内蔵だけど内蔵キャパまでの可変長対応とかかね
知らんけど
56デフォルトの名無しさん
垢版 |
2020/02/18(火) 19:20:46.06ID:iYoDhrK1
>>54
std::arrayにsize()をプラスした。
2020/02/18(火) 22:11:25.01ID:xmvP8wvk
std::arrayは最初からsize()持ってるんだけどどういうこと?
2020/02/18(火) 22:36:37.92ID:OK0tQotL
static_vectorってまんまboostにある
最大の長さが確定してるvectorで
メモリ確保は初期化時だけってやつ
それこそ組み込みやゲームでは有用
上の人のと同じかどうかは知らんが
2020/02/18(火) 23:58:14.54ID:2AC9Ct1n
組み込みでboostとかwwwwwwww
2020/02/19(水) 00:04:41.69ID:SdiIukjt
>>11
向くか向かないかなんて主観なんだからそこを力説してもしゃない
向くと思うなら自身の経験をもとに定性的に説明してみなはれ

あと組み込みってもピンキリだから
マイコンでモーターをPID制御するのと、
組み込みLinuxでメディアサーバー作るのとでは全く異なる世界
そこは区別しないと意味ある議論はできないね

後者は両論あるだろうけど前者はどうだろう?
そもそもモダンなc++で開発できる環境あるのかな?
2020/02/19(水) 00:14:57.80ID:SdiIukjt
>>59
省メモリデザインなクラスがあったりする
2020/02/19(水) 11:06:52.75ID:YKckgIGu
>>59
駄目ですか?
使えるなら使っていいンじゃなすか?
2020/02/19(水) 11:43:37.70ID:91lcAktP
YAGNI // "You ain't gonna need it" : 機能は実際に必要となるまでは追加しないのがよいとする。
Ajail 開発

↑こういう開発哲学の様なものは他にどんなものがありますか?
真逆の哲学でも構いません。
2020/02/19(水) 11:49:31.95ID:91lcAktP
>>63
【KISS の原則 (英: KISS principle)】
「Keep it simple stupid.」(シンプルで愚鈍にする)、もしくは「Keep it simple, stupid.」
(シンプルにしておけ!この間抜け)、もしくは「Keep it short and simple.」(簡潔に単純にしておけ)
という内容の、1960年代の米国海軍において言われた、経験的な原理・原則の略語。
その意味するところは、設計の単純性(簡潔性)は成功への鍵だということと、不必要な複雑性は避けるべきだ、ということである。

【なし崩しの機能追加主義】
KISSの原則に反して、仕様が徐々に複雑化していくことは、ソフトウェア開発の世界でよくみられる。
これは、「なし崩しの機能追加主義」として知られる。
ソフトウェアが複雑になるにつれて、使い方を習得する時間が増えたり、操作に手間取ったり、どれが重要な機能なのか分からなくなったりする。
さらには、ハードウェアへの要求スペックが高くなったり製品価格が高くなったりもする。
しかし、大多数のユーザーが実際に使用する機能は、そのごく一部であったりする。
ユーザへの負担や開発コストを考えると、単純なソフトウェアの方がユーザフレンドリかつ生産性が高い可能性がある。
2020/02/19(水) 12:01:28.84ID:2IDaZuEt
今風の入門でおススメの方法はありますか?
2020/02/19(水) 12:14:44.61ID:26AgvMdu
KISSの原則、俺は正しいと思う
オーバースペックなものを作っても、その「オーバー」な部分が
あとで必要になったとき不十分なんてことが起きやすいからな
案件の「今」を最大限に最適化するのは義務と言ってよい努力だし

なし崩しの法則は、変更要求に対する不適切な対応が積み重なって起きることだ
既存のソースコードや回路図の微修正で済ませようとするあまり
それまでの反省を踏まえてきれいにリメイクすれば解消する問題が
ずっと影を落とし続ける現象はそこいら中あふれかえっている
2020/02/19(水) 12:18:11.23ID:26AgvMdu
車輪の再発明なんて例えをよく見かけるが
じゃあ今の車輪はまだ木で出来ていたり
パンクしやすいチューブタイヤだったりするのか
進歩の原動力たる、たゆまぬ努力に対する
アイディアキラーは見逃しちゃダメだ
2020/02/19(水) 12:25:05.81ID:mcS2XXQq
>>63
契約プログラミングとかもそうかな?
C++20 にサポートが入る予定だったが、次以降に延期された。
まあ言語としてのサポートがあろうとなかろうと関数が機能するための前提条件
を意識したり明記したりするのは良いことだと思う。

文芸的プログラミングという考え方もある。
説明文とコードを分離せずに書くようなもの。
提案者 (クヌース) が考えていたのは文章説明を中心にする考え方で
コードの方が従属するようなものだけれど、
コメントとしてドキュメントを書くようなものなら doxygen や Javadoc はよく使われているね。
コードを書いているときはちゃんと把握できているからドキュメントを後回しにしがちだし、
コードがドキュメントであるようなものが理想とか言う人もいるんだけど、
数日前に書いたものさえ割と忘れるのが人間なので文書で残すのは大事だと思う。

テスト駆動開発も割とメジャーかもしれない。
仕様をテストコードとして書いて、それを満たすように実装を進める手法。
テストできるように作らなければならないという点で実装に制約が付くのが嫌われがち
ではあるようだけど、仕事でやる開発なら客にアピールしやすい気がするなぁ。
2020/02/19(水) 12:33:07.39ID:1d0evbZI
doxygenで作られたドキュメントあんま役に立たないよ
特にテンプレートリッチなコードだと余計なものや個々の実体化までドキュメントに入る
まぁそれを避ける方法が無いわけではないしdoxygen用にコメントをきっちり書くのは良いことなんだけど
2020/02/19(水) 12:36:18.94ID:mcS2XXQq
>>67
車輪の再発明っていうのは、車輪を知らないで「発明」することだよ。
既に普及しているものを知らず、学ばずに思いつきでやって既出の失敗を繰り返す愚かさを言ったもので、
学んだ上であらためて自分で作ることや改良することを否定してはいない。
2020/02/19(水) 12:38:12.62ID:mcS2XXQq
>>69
個別のツールについては私は良く知らないんだ。
ここではドキュメントとコードを同時進行で作るという考え方の話。
2020/02/19(水) 12:39:50.65ID:91lcAktP
>>70
ところが、「車輪の際発明」と言って批判する人こそが、全く試しもせずに妄想していることも多い。
この言葉をインド人が言っているのを見て、だから後進国のままなんだな、と思った。
2020/02/19(水) 12:49:36.29ID:2IDaZuEt
車輪を題材にした慣用句であり、世界中で使われている。

「広く受け入れられ確立されている技術や解決法を知らずに(または意図的に無視して)、
同様のものを再び一から作ること」

を意味する。
2020/02/19(水) 12:50:53.30ID:2IDaZuEt
MS officeのフリーの互換製品を作ることは違う
2020/02/19(水) 12:53:30.09ID:26AgvMdu
>>70
同じことだ
学生や新米が何か思いついて実験してみてるところへ
身も蓋もないことを言ってやる気なくさせる老害は進歩の邪魔だ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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