C++相談室 part151

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

前スレ
C++相談室 part150
https://mevius.5ch.net/test/read.cgi/tech/1584975873/
このスレもよろしくね。
【初心者歓迎】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/06/25(木) 23:52:04.02ID:Dxq2c9AW
>>661
どーしろと? (駄洒落)
2020/06/26(金) 07:52:12.45ID:UtOMuHDg
不変のアブストラクトクラスを作っておいて
実装はそこの派生クラスでやり
使用者はポインタで使う
2020/06/26(金) 19:50:48.55ID:9IxUvn/4
>>663
冴えてる!
いつもすてきなはちみつさんですね!
2020/06/26(金) 20:05:18.50ID:jgcbTaF5
糞コテ集合
2020/06/26(金) 22:39:47.73ID:2sQMfeSo
あと蟻人間とかいうやつが揃えばジャックポット
2020/06/26(金) 22:59:40.41ID:ReyCZ0Ra
よーし、みんな呼んじゃうゾ

void君、rubyガイジ、jquery房ーっ
2020/06/27(土) 00:11:14.27ID:rOaH6R8n
蟻ははちみつが大好き。
ハチとアリは同属。
2020/06/27(土) 03:40:34.85ID:W+OG+j+5
   ∩___∩         |
   | ノ\     ヽ        |
  /  ●゛  ● |        |
  | ∪  ( _●_) ミ       j
 彡、   |∪|   |        J
/     ∩ノ ⊃  ヽ
(  \ / _ノ |  |
.\ “  /__|  |
  \ /___ /
2020/06/27(土) 03:55:34.00ID:aqzZKmXR
心底どうでもいい
2020/06/27(土) 10:40:14.09ID:rOaH6R8n
片山右京
2020/06/27(土) 13:08:47.90ID:5dDNakqG
杉下右京
2020/06/27(土) 14:16:45.56ID:rOaH6R8n
博文
2020/06/27(土) 22:55:32.89ID:XmSaDv1W
今時のmodern c++で、マルチスレッドやるにはどうすればいいでしょうか。とりあえず今はC++17でコンパイルしてますが
1.c++20のコルーチンとコールチンライブラリを使う
2.固定スレッド数のスレッドプールなら簡単に実装できるので自分で実装、もしくは素敵なライブラリがある?
3.std::thread,std::asyncでいいや
2020/06/27(土) 22:59:52.80ID:4SruWd+v
>>675
std::threadとOpenMPが基本かな。
2020/06/27(土) 23:00:22.36ID:XmSaDv1W
とりあえず、MSVCを使ってます
1は時期尚早?
2はMSVCだとTask Parallel Libraryがあるけど、プライオリティキューを使いたいとなるとやっぱ自前?
3はね
皆さんはどんな感じでしょうか
2020/06/27(土) 23:06:40.51ID:TsX0h7IG
マルチスレッドやる
がわからん

何をしたいの?
2020/06/27(土) 23:10:16.30ID:XmSaDv1W
タスクの実行を(優先順位付きで)スケジュールしたり、キャンセルしたりしたいです
非同期処理?
なんてイエバいいのだろう
2020/06/27(土) 23:12:59.91ID:TsX0h7IG
環境は?
2020/06/27(土) 23:14:55.69ID:XmSaDv1W
MSVCのWindowsアプリです
2020/06/27(土) 23:24:28.13ID:TsX0h7IG
MFC
Windows API
std::thread

どれでも出来るけど

求めるものは?
性能?作りやすさ?移植性?
2020/06/27(土) 23:26:07.41ID:XmSaDv1W
まぁ、windowsにはwin32でthread pool apiがあったり、ATLでCThreadPoolクラスみたいのがあるっぽいんですが、昔より今時の方法で..

性能はあんま気にしてません
作りやすさですね
2020/06/27(土) 23:26:45.37ID:TsX0h7IG
普通に自作すれば?
仕様を好み通りに出来る
2020/06/27(土) 23:29:23.19ID:XmSaDv1W
性能はあんま気にしてませんが、テスト的にstd::threadで今は実装してますが、セマフォなりで全く制御してないのでCPU使用率がはねあがって、セマフォで制御するくらいならスレッドプールくらいは導入したいなと
2020/06/27(土) 23:35:09.74ID:XmSaDv1W
>>684
優先順位付きとかやると色々自前が楽かなぁと思ってたんですが、やっぱ自前ですか
ありがとうございます
2020/06/27(土) 23:51:55.88ID:IY07Q1dO
msvcならasync使えばthread pool使われてたような
async|deferredでは問題ないけど、asyncのみだと仕様的にアウトっぽいから将来的に修正されるかもしれんが
2020/06/27(土) 23:55:27.13ID:TsX0h7IG
プライオリティキュー
自体を既に使ってるなら
待つ仕組みだけ追加すれば良いのでは?
2020/06/27(土) 23:58:18.31ID:TsX0h7IG
while (1){
イベント待ち
イベントクリア
キューから取得
処理
}

----

キューに追加
イベントセット
2020/06/28(日) 00:14:46.55ID:En8ZMxKR
>>687
そんなこんなこと書いてありますが、std::asyncってdetachできないですよね?
こういう作りがいいのか知りませんが、基本UIスレッドから非同期処理実行して完了したらWinAPIのPostMessageで完了通知してます
ので、std::threadみたくdetachしたいのです

>>689
プライオリティキューはこれから実装するんですが、単にstd::set使ってlessパラメーター指定すればできあがり?とはいかない?
2020/06/28(日) 00:19:31.12ID:BWJrAYP0
while (1){
イベント待ち
イベントクリア
while (キューから取得){
処理
}
}

----

キューに追加
イベントセット
2020/06/28(日) 00:21:59.78ID:BWJrAYP0
こうだった

std::set / less
同じプライオリティがダブらないならこれでも
2020/06/28(日) 00:25:52.98ID:En8ZMxKR
プライオリティはダブルんですけど、要素がプライオリティじゃなくて、プライオリティと例えば実行するstd::functionのペアで、このペアオブジェクトがダブらないはず
2020/06/28(日) 00:27:09.32ID:h/QEc5EX
お前は人の相談に乗れるレベルなのか?
2020/06/28(日) 00:33:11.03ID:BWJrAYP0
>>693
同じfunctionが複数セットされても
実行が1回になってもいいなら
それでいいんじゃない?
2020/06/28(日) 00:42:37.03ID:En8ZMxKR
>>695
unordered系しか本格的に使ったことしかないんですけど
std::pair使わずに独自ペアオブジェクトじゃだめそうだな..
std::pairをstd::shared_ptrでラップすればOKそうに見える
2020/06/28(日) 00:43:43.83ID:BWJrAYP0
lessもプライオリティとfunctionのペアってことね

同じプライオリティの処理が
キューにセットした順にはならなくなるけど

個人的には
キューにセットした回数分実行するために
multisetにしたい
2020/06/28(日) 00:46:39.83ID:BWJrAYP0
プライオリティが多くないなら
ブライオリティ別のdequeにすれば
公平性は保たれるし比較も不要
2020/06/28(日) 00:46:53.66ID:En8ZMxKR
multisetですか、ちょっと調べてみます
2020/06/28(日) 00:56:32.40ID:En8ZMxKR
あー。multisetでいいですね。それにします。
ありがとうございます
2020/06/28(日) 06:20:46.65ID:vMsHglGs
ここまでintel TBBなし
2020/06/28(日) 06:44:27.88ID:8Xgo7zrJ
>>675
C++17ならstd::execution::parが使えるぞ
2020/06/30(火) 18:13:09.56ID:W+MWiusu
C++17を指定する#pragmaない? gccかclで
2020/06/30(火) 20:39:19.04ID:8IN9xg77
>>703
引数じゃいかんのか?
2020/06/30(火) 21:05:33.59ID:W+MWiusu
本当はC++17をデフォにする設定とかあればいいんだけど
探しても見つからんかった
2020/06/30(火) 21:06:36.98ID:W+MWiusu
「現行規格」をデフォにできねえのおかしいだろ
作業が必要でも構わんが方法がないのは
2020/06/30(火) 21:12:22.03ID:Y/VrOCax
エイリアスしたらだめなの?
全然見当違いなこと言ってる?
2020/06/30(火) 21:12:29.49ID:e6PapWOV
おかしいのはお前
2020/06/30(火) 21:15:58.24ID:8IN9xg77
Makefileか*shrcにでも書いておけばいいだろ…
2020/06/30(火) 21:15:59.68ID:64JVWZe8
あるだろ
-std=c++17
2020/06/30(火) 21:34:29.72ID:Awxu+7Gs
普通の人
オプションないのはおかしいだろ
→あるはずだから探そう
2020/06/30(火) 22:05:18.46ID:ZpGOlbch
GCC なら specs に書いておくという方法もあるよ。
2020/07/01(水) 01:50:44.15ID:Rk3KIbda
GCC 11からデフォルトで17になるよ
やったね
2020/07/01(水) 10:19:56.89ID:rbRREsWh
C++で作られているモダンなマテリアル風デザインのWindows用デスクトップアプリのソースを見ると
Direct2dやGDIを駆使して自前で描画していたのですが、ここまでしないといけないものなんでしょうか…?
2020/07/01(水) 10:45:42.03ID:BkFpWX8v
ソレがイヤなら金だして買え
C++BuilderやらMFCやら色々あるぞ
716デフォルトの名無しさん
垢版 |
2020/07/01(水) 12:12:18.25ID:IfUrt5hg
コンパイルオプションであるのは当たり前だけど
それだとソースとmakefileみたいに別管理になる
ソースにコメントでC++17以上とか描くくらいなら
最初からpragmaでC++17以上指定とかしたいって
自然な要求だと思うけど
2020/07/01(水) 12:22:38.02ID:BzwPXT9B
C++17の機能を使わなきゃ良い
718デフォルトの名無しさん
垢版 |
2020/07/01(水) 12:30:52.21ID:IfUrt5hg
0x以前でも動くのが理想
2020/07/01(水) 12:33:19.40ID:bZXPscHV
>>714
別にそこまでしなくても良いけど自前描画は割とメリットも多い
Win32のコントロールって一つ一つは割と大きなオブジェクトだからね
それを省いて絵だけで完結させると驚くほど軽くなったりする
WinFormsに対するWPFの発想がこれ
ただしWPFは抽象化に抽象化を重ねた結果、返って重くなってしまったという産廃だが
2020/07/01(水) 12:49:57.46ID:gL8G43CT
>>716
元の質問者は引数じゃいけない、エイリアスじゃいけないとは一言も説明してないのに、回答を無視してできないのはおかしいとか言ってるから、はあ?できるだろって叩かれてるんだと思うが。

あと、プリプロセッサで指定バージョン以下のコンパイラを使ったときにエラーにすることは今でもできる。
2020/07/01(水) 13:20:57.29ID:lJkrSuwc
>>716
指定して何をしたいんだ?
17に対応しないコンパイラを使ったら排除したいのか?
そんなもんマクロ使えよ
2020/07/01(水) 13:24:24.14ID:lJkrSuwc
そもそもpragmaは無視しても問題ないんだぞ
こんなもんで17指定してなんの意味があるんだか
2020/07/01(水) 20:22:39.52ID:OO2qW6bI
static_assert(__cplusplus >= 201703, "C++17 or later only");
これだと、せっかくC++17できるコンパイラなのにエラーという愚かなことになるだろ
#pragmaとは言ったけど、has_includeみたいな標準に何か追加でもいいんだけど
2020/07/01(水) 20:35:37.32ID:8lUxucUi
C++17の機能を使わないのが一番
2020/07/01(水) 20:37:50.71ID:KhLQxxHt
またABIか変わるかもしれないのにソースファイルごとに勝手にコンパイラが変わったら困るんじゃないの?
2020/07/01(水) 21:14:42.95ID:b6g5MaOw
コンパイラオプションつけるのになんの問題が
2020/07/02(木) 04:30:05.73ID:qK+Va6mV
ダメだ通じてない
2020/07/02(木) 08:58:39.89ID:Xcy/mciM
そりゃ意味ないからな
configureに準拠規格オプション探すマクロ1つ入れとけば済む話だし
2020/07/02(木) 10:53:47.11ID:qK+Va6mV
// this program is C++17
と書いて手作業に期待するのを
#pragma C++17
で自動化するのは意味がないと言うのか?

自動認識はそう珍しい話ではないと思うが
2020/07/02(木) 11:27:53.06ID:JVdKJwPF
今でもconfigure.acに
AX_CXX_COMPILE_STDCXX_17
って書くだけで済むから
2020/07/02(木) 11:40:05.93ID:JVdKJwPF
他人に巻くプログラムならビルドパッケージでどうとでもなるし
自家用ならmakefileにオプションまでベタ書きでいいし
何にこだわってるのか知らん
2020/07/02(木) 12:20:13.78ID:qK+Va6mV
プログラム1つのためにGCCをわざわざビルドしろだと?
おちょくってんのか
2020/07/02(木) 12:21:08.29ID:5hT1fktY
C++17の機能を使わなきゃ良いだけ
2020/07/02(木) 12:23:23.48ID:jaxwQaY9
素人はあれこれツール使いこなすのいやなんだよね
わかる
2020/07/02(木) 12:27:34.40ID:Kyu9Eer8
>>732
え?
自分で作ってるプログラムのconfigure作るときのはなししてんだけどwwww
2020/07/02(木) 12:29:59.81ID:Kyu9Eer8
今ある機能でどうとでもなることを
将来搭載されても後方互換性がなくて結局今ある機能に頼る羽目になる新機能をつけろつけろと騒がれても困りますよw
2020/07/02(木) 12:30:50.81ID:qK+Va6mV
729へのリプライでそういうこと書くか?
2020/07/02(木) 12:32:13.62ID:qK+Va6mV
>>736
すまん、俺はイウォーク語はわからん
日本語でしゃべってくれ
2020/07/02(木) 12:39:44.74ID:Kyu9Eer8
configur.acといわれてgccをビルドするとか思っちゃう人はヒューマンステージが低いのでもっと修行してくださいwwww
2020/07/02(木) 12:40:24.89ID:qK+Va6mV
typoするほどプルプルしてんの?
2020/07/02(木) 13:32:58.91ID:Kyu9Eer8
>>740
ミスしか突っ込めない時点で負けだよw
742デフォルトの名無しさん
垢版 |
2020/07/02(木) 15:38:52.42ID:Vurtjy2V
ウェブ系の人にはなじみが無いかもしれないけど、C/C++のライブラリってバイナリだよ。
2020/07/02(木) 16:22:54.35ID:fs1yx03v
��
2020/07/02(木) 18:12:48.64ID:O1gKlzQs
Makefileに書けばいいじゃん
2020/07/02(木) 18:31:29.81ID:pD7vCP0t
俺の環境のgccのバージョン10だぜ
2020/07/02(木) 20:04:26.96ID:tTltJbRW
>>729
Makefile なりなんなりで別管理になることを問題だと思ってるのはあなただけ。
具体的に何がどれだけの問題なのか、よく考えて示してくれないとたぶん伝わらない。

単に面倒だということなら、多くの人は新たな #pragma の仕様を定めて実装するほうが面倒だとわかるので、
それがあって当然だなどという主張にはならない。
2020/07/02(木) 20:17:30.19ID:EhH78vwe
コンパイラは対応する仕様決まらないままファイルの読み込み、パースをしなきゃいけないわけ?

必ず先頭行に書くとかなら未だしも
途中で現れたらどうするの?
引数で指定されているのと矛盾したらどうするの?
複数異なる指定があったら?
748デフォルトの名無しさん
垢版 |
2020/07/02(木) 20:19:59.76ID:Vurtjy2V
>>746
Perlのソースコードをjavacでコンパイルする事はない。
ということは、言語をソースコードの属性としたほうが良いのでは?
という考え方は理解できるかな。
一概に否定しない。

とはいえ、C++ではどっちにしろビルドシステムが必要なので、ソース内で指定できることに意義を感じない。
2020/07/02(木) 20:22:38.02ID:EhH78vwe
メンバ関数定義の際にクラス内の型名を使った戻り値型を先に書く場合、クラス名::戻り値型 って書かなきゃいけないくらいパーサに配慮した仕様になっているのに、そんな面倒くさい要望に対応されるとは考えにくい
2020/07/02(木) 20:23:33.54ID:R/kQb57d
自分で作ったならバージョンわかってるやろ
ライブラリとして配布するならpkg-configでも書いとけばいい
何が問題だよ
2020/07/02(木) 20:24:28.66ID:EhH78vwe
拡張子で分けるのが一番自然だよね
xxx.cc17とかxxx.17.ccとか
2020/07/02(木) 20:24:41.75ID:R/kQb57d
標準のバージョンなんかよりたくさん環境依存あって
それを自動解決する方法はいろいろあるのだから
それを使えばなんの問題もないんだよ
2020/07/02(木) 20:25:20.06ID:1S4E8SKc
ライブラリとして配布するのに
C++17を要求するって

使ってもらう気無いだろ
754デフォルトの名無しさん
垢版 |
2020/07/02(木) 20:27:04.96ID:Vurtjy2V
ライブラリを使ってくださるお客様にC++17を用意させるのは心苦しいかもしれないな。
2020/07/02(木) 20:27:07.52ID:EhH78vwe
今時c++17必須でも大丈夫だろ
msvcですら使い物になる程度まで対応しているんだぞ
2020/07/02(木) 20:28:23.76ID:1S4E8SKc
>>755
組み込みは未経験か?
757デフォルトの名無しさん
垢版 |
2020/07/02(木) 20:28:44.61ID:Vurtjy2V
むしろ20はよ来いと思ってますが。
2020/07/02(木) 20:34:28.40ID:EhH78vwe
組み込みのほうがwindowsより規格対応早いくらいじゃね
まあ全部は使えないけど、それは03だろうが同じだ
むしろコンパイル時に出来ることが増えた分組み込みには新しい規格のほうが向いている
2020/07/02(木) 20:36:35.79ID:1S4E8SKc
小規模組み込みは未経験か?
2020/07/02(木) 20:43:28.28ID:EhH78vwe
小規模だとコンパイラ使えるだけでも御の字
コア部分は結局アセンブリで書くし
そもそも自由にスタックすら使えなくね?
761デフォルトの名無しさん
垢版 |
2020/07/02(木) 20:47:32.39ID:Vurtjy2V
RAM16バイトしかないしね。
無理ですわ。
2020/07/02(木) 21:00:59.82ID:qK+Va6mV
>>746
あなただけって他の人が支持しているレスも出てるよ?
自演だろって言うんだろうけど違う
マウントしたいんだろうね
2020/07/02(木) 21:02:30.64ID:qK+Va6mV
>>756
その言葉をそのまま返す
ARM以外の何かをやってる人?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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