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(木) 22:01:17.65ID:W+LR7rOf
ライブラリなんだから
メンバ関数は全てライブラリ側で実装するだろ普通

テンプレートとか別途リンクが不要なことが売りなライブラリならともかく

何のためのライブラリだか
635632
垢版 |
2020/06/25(木) 22:05:49.15ID:Q7o8gz5q
>>633
ヒント:仮想関数、コピー不可、Factory
2020/06/25(木) 22:06:38.78ID:Q7o8gz5q
てかこの要件だと>>617ですでに答え出てる気がする
2020/06/25(木) 22:06:48.48ID:W+LR7rOf
案を出せない人間が何を言っても負け犬の遠吠え
2020/06/25(木) 22:09:27.67ID:W+LR7rOf
>>636
>>572に対してメリットあるか?
2020/06/25(木) 22:11:36.08ID:W+LR7rOf
>>635
あれ?
もしかして
互換性保持した修正はギブアップで
依頼者の要件を無視した案を言ってる?
2020/06/25(木) 22:14:20.52ID:Q7o8gz5q
>>637
っ[鏡]
てかID変えたんか?

>>638
>>573
2020/06/25(木) 22:15:15.45ID:Q7o8gz5q
>>639
>>633に対して反論したんだが
すり替えてんじゃねーよ
2020/06/25(木) 22:16:59.09ID:W+LR7rOf
外部から直接アクセスしない変数を置き換えるに決まってるたろ

連想配列だと
初期化順とかスレッド安全とかパフォーマンスとか
色々と心配だねえ
2020/06/25(木) 22:20:39.99ID:lze6mCYp
>>636
どこが答えだよ
>>617 は無理だよ
アプリ側でnew/deleteされたことをライブラリ側はトラッキングできない
アプリ側でnew/deleteされてないのだったら問題になってない
アプリに手を加えていいのだったらバイナリ互換考えなくていい
2020/06/25(木) 22:20:56.12ID:W+LR7rOf
>>641
>>632はお前だろ?
2020/06/25(木) 22:26:37.67ID:Q7o8gz5q
>>643
新しいthis来たら新しく作るだけだろ
deleteに対してはどうにもできんけど

>>644
馬鹿かお前は
ポインタで扱う前提に乗っかったのはお前だろ
バカにしようとして自爆したのに逆ギレか
2020/06/25(木) 22:26:45.54ID:W+LR7rOf
コピーを使わない、もしくはインラインじゃないなら>>595

コンストラクタ、デストラクタ、コピーがインラインじゃないなら
>>572で良い

new deleteはアプリ側でもライブラリ側でも問題ない
2020/06/25(木) 22:29:26.54ID:Q7o8gz5q
何言ってんだこいつ
2020/06/25(木) 22:29:51.27ID:W+LR7rOf
コンストラクタはインラインでも>>572で問題ないね
2020/06/25(木) 22:35:32.05ID:W+LR7rOf
>>643より>>572の方が良いね
隙間があってコピーで問題なければ>>595
2020/06/25(木) 22:36:49.66ID:W+LR7rOf
>>643じゃなかった
連想配列案
2020/06/25(木) 22:47:52.28ID:Q7o8gz5q
インラインじゃないならって、普通コンパイルオプションやnoinlineで指定してない限り、
実装が見えているメンバ関数は全てインライン展開はされうるんだぞ

そんな厳しい前提がOKなら>>645で言ったdeleteの問題だって対処できる
2020/06/25(木) 22:50:51.97ID:W+LR7rOf
>>572>>617
デストラクタがインラインだとダメなのは同じ
コピー時の制約も同じ

速度、スレッド安全性、初期化順などの心配事に関しては>>572の勝ち

>>572は外部からアクセスしていないポインタサイズの変数の存在が条件
2020/06/25(木) 22:54:30.29ID:W+LR7rOf
>>651
ヘッダにない関数はインラインにしようがない
2020/06/25(木) 22:59:14.54ID:W+LR7rOf
>>572>>595のスペースが全く無いなら他の方法を考えるしかないけど
2020/06/25(木) 23:01:53.27ID:W+LR7rOf
デストラクタ問題に対応出来るのは今のところ>>595だけ
2020/06/25(木) 23:05:32.49ID:Q7o8gz5q
暗黙定義のものが一つも無ければね
(=ヘッダに宣言はあるが実装は見えないものだけ

てか別に>>617じゃないといけないとは言ってないが
>速度、スレッド安全性、初期化順
速度が必要とか一言も書いてないし
スレッド安全性て、連想配列使うのはライブラリ内だけなんだからライブラリ側で対処すればいいだけ

>>655
ユーザーが使ってない変数や領域に新しいメンバを含む構造体へのポインタを入れる案も
根本的には連想配列案と一緒だよ、デストラクタが非インラインでなければ解放できないぞ

まぁ今ある情報だけで議論してもどうにもならんが
2020/06/25(木) 23:06:38.16ID:Q7o8gz5q
>>656の最初は>>653
2020/06/25(木) 23:11:48.74ID:W+LR7rOf
>>656
>>595を勘違いしてる
ポインタを入れるわけじゃない
隙間に変数そのものを入れる
2020/06/25(木) 23:23:27.92ID:W+LR7rOf
コンテナやスマポなど、コピーやデストラクタで処理される物の中身を少し大きくするとか
close()みたいな最後に必ず呼ばれる関数があればそこに入れ込むとか
中身がわかればもっと別の案も出るかも
2020/06/25(木) 23:30:07.30ID:W+LR7rOf
>>656
速度が必要と書いてなければ速度無視が前提って...
なかなか衝撃発言ですねえ

C++なんだから組み込みのチープ環境かもしれないし
リアルタイム処理かもしれないし
もしかしたらISR内部かも
(ISRならnewも問題になるか)

速度がどうでもいい用途でいまだにC++を使うって
どんな業界かな?
2020/06/25(木) 23:34:58.25ID:Q7o8gz5q
ほんとにド素人だな・・・呆れた
2020/06/25(木) 23:41:46.09ID:W+LR7rOf
負け宣言?
雑魚が
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の機能を使わなきゃ良いだけ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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