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(木) 19:36:15.68ID:g2od3l7G
いや、はじめからバイナリ互換させる前提で設計したライブラリでもない限り、小手先の対応でなんとかなる場面は物凄い限られるよ
2020/06/25(木) 19:38:38.17ID:aCPUEpAO
>>593
それは互換性を保つ技術が無いから
2020/06/25(木) 19:41:06.01ID:aCPUEpAO
メモリアラインメント調整等で発生する隙間を集めて変数として使う
っていう手もある

データ構造互換だとよくやる手法
2020/06/25(木) 19:41:55.04ID:L+/QiPNH
>>590
そんなもん、GC実装して無理やりゴミ集めするしか無いだろ。
最後はアプリ終了時にOSが処分してくれることを期待するしかない。
2020/06/25(木) 19:42:42.30ID:g2od3l7G
バイナリ互換前提で開発されていないから、問題が出ているんじゃないの?

appがコンパイルされた時点で、デストラクタやらコピコンやら代入やらをすべて明示的に外部定義していないと、コード中で必要に応じてデフォルトが呼ばれて、当然inline化もされてしまう
2020/06/25(木) 19:43:40.85ID:jUSiql3P
>>591
必ずインライン化されてるとは言えないけど、可能性はあるよね?

結局のところ具体的なコード要件を >>548 が言わない限りは不毛な気もする。
2020/06/25(木) 19:44:07.37ID:aCPUEpAO
>>597
>>592
2020/06/25(木) 19:45:52.88ID:aCPUEpAO
ライブラリを作った事がないヤツが
ライブラリの互換性についてアドバイスしようとしてて笑える
2020/06/25(木) 19:47:42.56ID:g2od3l7G

ライブラリ作ったことあるからこその内容だろうに
GCするとか、リークしたままOSに回収させるとかそれこそライブラリとしてあり得ない対応だろう
2020/06/25(木) 19:51:39.44ID:aCPUEpAO
なんでデストラクタがインラインだと思うんだ?
2020/06/25(木) 19:55:22.62ID:g2od3l7G
デフォルトだとinlineのデストラクタが生成されるのがc++の仕様だろ
じゃないと単なるプレーンな構造体でもデストラクタの呼び出しするはめになる
2020/06/25(木) 20:01:17.97ID:aCPUEpAO
クラスをライブラリ化するのにメンバ関数がインライン?

ご冗談を
2020/06/25(木) 20:02:21.68ID:aCPUEpAO
デストラクタがインラインなら>>595
2020/06/25(木) 20:05:18.94ID:g2od3l7G
バイナリ互換想定してないなら、inlineしない方が稀じゃね
全部外部定義だと、高速化の妨げになるじゃないか
世の中のc++用ライブラリを見てみれば良いさ
inlineが無いどころかheader onlyが幅を利かせている
2020/06/25(木) 20:08:52.95ID:g2od3l7G
alignmentサイズの隙間に入れたところで、コピーの時にコピーされるかどうかも不明
と言うか、単体だとまずされない
まあコピーも外部定義されていれば置き換え可能だけど
2020/06/25(木) 20:10:03.10ID:L+/QiPNH
>>599
そもそもバイナリ互換を考慮していないライブラリを今さら何とかしようとするウンコな発想ありきだからな。

まともなライブラリ実装者なら
「そんなクソとっとと便所に流してマトモなもの作り直せ」
としか言わんわ。
2020/06/25(木) 20:11:42.55ID:Y+MR3z5H
>>606
テンプレートだろそれ
2020/06/25(木) 20:13:29.88ID:Y+MR3z5H
>>607
コピーもインライン前提か?
2020/06/25(木) 20:14:36.46ID:g2od3l7G
inlineじゃないtemplateのヘッダオンリーでも、バイナリ互換保つの無理だよね
例えinline化されてなくても、各obj内で実体化されたtemplate関数が同一じゃないと何が起こっても文句言えない
2020/06/25(木) 20:15:41.12ID:g2od3l7G
明示的なinlineもだけど、定義せずコンパイラに任せた場合デフォルトで出来るものはinline扱いになる
2020/06/25(木) 20:16:21.51ID:Y+MR3z5H
なんでobj?
ライブラリっていってるんだからlibだろ
2020/06/25(木) 20:18:38.89ID:g2od3l7G
libはobjの集合だろうに
2020/06/25(木) 20:19:42.46ID:Y+MR3z5H
インライン混じりのライブラリ
ならメンバ変数を増やすのを心配する以前だろ

問題が変わってる
2020/06/25(木) 20:27:59.07ID:Y+MR3z5H
>>611
だからヘッダは基本変更しない
2020/06/25(木) 20:29:04.78ID:iE0yhaVV
どうしても必要なことなら、
ライブラリの中にスタティックな連想配列置いて、thisアドレスをキーにして追加したいメンバ変数引くようにしたら?
トリッキーでないし確実に動く
2020/06/25(木) 20:29:54.44ID:g2od3l7G
コピーされなきゃ良いよね
2020/06/25(木) 20:30:23.57ID:g2od3l7G
vectorで持たれてても再配置されたら困るし
2020/06/25(木) 20:32:18.93ID:Y+MR3z5H
>>617
インラインかもよ
コンストラクタもデストラクタもコピーも
追加したメンバ変数へのアクセスも
2020/06/25(木) 20:34:29.24ID:Y+MR3z5H
何の互換性を保ちたいのかわからなくなってきた
2020/06/25(木) 20:42:06.05ID:N8mY4JDD
同感
2020/06/25(木) 21:13:19.28ID:Y+MR3z5H
ライブラリを使う(一部の)コードはコンパイル済みでリコンパイル出来ない

コンパイル済みのコード内で使ってるクラスのメンバ変数を追加したい

当然
クラスのサイズは変えられないし
コンパイル済みのコード内の(インライン展開されてる)関数も変えられない

どの関数がコンパイル済みコード内にあって
どの関数がライブラリ内にあるかは不明
2020/06/25(木) 21:14:06.17ID:Y+MR3z5H
こんな感じ?
2020/06/25(木) 21:25:58.94ID:GV91Na/E
ほとんど読んでないけどID:aCPUEpAOとID:Y+MR3z5Hがド素人なのはわかった
2020/06/25(木) 21:27:27.39ID:Y+MR3z5H
はいはいwww
2020/06/25(木) 21:32:36.99ID:GV91Na/E
ヘッダの変更無しにどうやって新しい機能追加すんだよ
2020/06/25(木) 21:39:56.91ID:Y+MR3z5H
機能を追加したいなんて言ってたか?
2020/06/25(木) 21:40:05.85ID:GV91Na/E
と思ったら>>548が前提なのか、すまん
とりあえずインスタンスそのままで扱うのは無理じゃね
ユーザー側が一貫してポインタで扱うのは必須だと思う
2020/06/25(木) 21:46:21.80ID:Y+MR3z5H
なにそのド素人発言
2020/06/25(木) 21:47:56.11ID:GV91Na/E
>>610,613,615
2020/06/25(木) 21:49:41.84ID:GV91Na/E
インスタンスで扱ってるなら暗黙定義された関数の動作が変わる可能性くらいすぐ気づけやド素人が
2020/06/25(木) 21:58:47.71ID:W+LR7rOf
ポインタで扱うとインライン関数がリコンパイル無しで変えられるって?
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
同じプライオリティがダブらないならこれでも
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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