!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
C++相談室 part165
https://mevius.5ch.net/test/read.cgi/tech/1698705458/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C++相談室 part166
1sage (ワッチョイ 8732-NXaD)
2025/04/26(土) 10:34:58.41ID:pbPDl6lv0540はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3732-SsbA)
2025/07/10(木) 15:54:02.04ID:UMLMi9p20 >>539
ゲームのフレームワークでは全てのエンティティを登録してそれに対する更新を繰り返すというモデルがありふれているが、 C++ 的にそれが普通というわけではない。
ゲームのフレームワークでは全てのエンティティを登録してそれに対する更新を繰り返すというモデルがありふれているが、 C++ 的にそれが普通というわけではない。
541デフォルトの名無しさん (ワッチョイ bfad-3agI)
2025/07/10(木) 16:45:53.90ID:1drjG1ps0 >>539
一度デバッガで実行をトレースしてみ?
一度デバッガで実行をトレースしてみ?
542デフォルトの名無しさん (ワッチョイ 9f88-D0JT)
2025/07/10(木) 18:55:50.32ID:y21Xxg220543デフォルトの名無しさん (ワッチョイ 576b-4VWQ)
2025/07/10(木) 21:11:59.82ID:pWdjbLc50 >>540-541
ありがとうございます
リストを自作するなりstd::listを使うなりして
printfみたいな文字出力をする時も、出力部分をタスククラスにぶっこんでラッピングして
出力は派生クラスでオーバーライドしたc->draw();みたいなのに任せる、というのはゲーム専用で他ではあまりされないんですね
ありがとうございます
リストを自作するなりstd::listを使うなりして
printfみたいな文字出力をする時も、出力部分をタスククラスにぶっこんでラッピングして
出力は派生クラスでオーバーライドしたc->draw();みたいなのに任せる、というのはゲーム専用で他ではあまりされないんですね
544はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 176c-SsbA)
2025/07/11(金) 01:51:13.39ID:/nWuXYnL0 C++ は設計理念のひとつとして「人に何かを強制しない」というのを挙げていて、やりたいように書けることを重視してる。
同じパターンでプログラムを書いているように感じるなら単にあなたがそのやり方しか知らないだけ。
分野ごとに大枠ではやりやすいパターンが定着していたりはするので、ひとつの分野だけ見ていると頻出パターンがあるように見えることはあるかも。
同じパターンでプログラムを書いているように感じるなら単にあなたがそのやり方しか知らないだけ。
分野ごとに大枠ではやりやすいパターンが定着していたりはするので、ひとつの分野だけ見ていると頻出パターンがあるように見えることはあるかも。
545デフォルトの名無しさん (ワッチョイ 9f15-sH2C)
2025/07/11(金) 11:58:09.09ID:nUxw0t1Z0 BASICも同様の理念で作ればいいのに
546デフォルトの名無しさん (ワッチョイ bff3-4Q3H)
2025/07/11(金) 12:28:00.28ID:36pXyECQ0 >>544
Z世代にはRuby on RailsやRustのほうが良いかもしれませんね
Z世代にはRuby on RailsやRustのほうが良いかもしれませんね
547デフォルトの名無しさん (スフッ Sdbf-zcFv)
2025/07/11(金) 14:36:44.91ID:zLrVPFvnd >>543
RustのDisplayやDebugなんてまさにそれだが
RustのDisplayやDebugなんてまさにそれだが
548デフォルトの名無しさん (ワッチョイ 1fb7-p46g)
2025/07/12(土) 13:34:42.02ID:Y1veRsrW0 C++でデフォルトコンストラクタで確保したリソースだけデストラクタで破棄したくてコピーコンストラクタやコピー代入ムーブコンストラクタやムーブ代入で得たリソースはデストラクタで破棄させたくないときどうする?
rustみたいな所有権システム必要になるんですか?
rustみたいな所有権システム必要になるんですか?
549デフォルトの名無しさん (ワッチョイ f74e-Wka8)
2025/07/12(土) 14:19:56.77ID:tjRcyRc80 なんでそんなことが必要なのかわからないけど、破棄するかどうかのフラグを持っておけばいいんじゃないの?
設計から見直した方が良いようなきがするけどw
設計から見直した方が良いようなきがするけどw
550デフォルトの名無しさん (ワッチョイ f7c2-z8QQ)
2025/07/12(土) 17:03:35.88ID:BGsI/m1X0 >>548
俺もなんでそんなことが必要なのかわからないけど、pip使ってデフォルトコントラスタのオーナーだけにshared ptrでリソース管理させるとか?
これだとバグが怖いから、素直にshared ptrでリソースを共有したほうがいい気がする。
俺もなんでそんなことが必要なのかわからないけど、pip使ってデフォルトコントラスタのオーナーだけにshared ptrでリソース管理させるとか?
これだとバグが怖いから、素直にshared ptrでリソースを共有したほうがいい気がする。
551デフォルトの名無しさん (ワッチョイ 9f02-cEtd)
2025/07/12(土) 17:24:13.44ID:1YAX70Df0 ゲームプログラムをマルチスレッドにするとき、何をマルチスレッドにするの?
ストレージのロードとかはともかく
ストレージのロードとかはともかく
552デフォルトの名無しさん (アウアウウー Sa9b-zcFv)
2025/07/12(土) 18:45:10.30ID:/RtKayKia マルチスレッドにしたいものをマルチスレッドにする
553デフォルトの名無しさん (ワッチョイ f7bd-eG3U)
2025/07/12(土) 19:12:52.47ID:LUVzIFWA0 遠景のテクスチャのロードなんかは別スレッドかな?
当たり判定などのロジックは遅延なく1フレーム16ミリ秒以内にやらなきゃいけないのでメインスレッドでやるしかない
ゲームでマルチスレッド使うのって難しいよね
当たり判定などのロジックは遅延なく1フレーム16ミリ秒以内にやらなきゃいけないのでメインスレッドでやるしかない
ゲームでマルチスレッド使うのって難しいよね
554はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3732-SsbA)
2025/07/12(土) 20:02:23.86ID:5KyGwfre0 排他処理が入ると並列化の恩恵がだいぶん減るので高速化の意図でマルチスレッドを使うなら排他が不要な部分を見つけるのが第一だね。
メモリなどの各種のリソース管理の後始末を別スレッドに任せるという例も聞いたことはある。
デストラクタが起動するとサブオブジェクトのデストラクタも連鎖的に起動するからワンフレームの時間が限られている状況では間に合わないということも起こる。
だからデストラクタは後始末が必要なリソースをテーブルに登録するだけにして、別スレッドが実際の後始末をするってことね。
もう使うことの無いリソースだというのは分かってるから排他は少なくてすむ。
(ヒープメモリの管理テーブルはスレッド共通だから排他がゼロとはいかないと思うけど。)
後始末が少しくらい遅れてもどうということはないし。
メモリなどの各種のリソース管理の後始末を別スレッドに任せるという例も聞いたことはある。
デストラクタが起動するとサブオブジェクトのデストラクタも連鎖的に起動するからワンフレームの時間が限られている状況では間に合わないということも起こる。
だからデストラクタは後始末が必要なリソースをテーブルに登録するだけにして、別スレッドが実際の後始末をするってことね。
もう使うことの無いリソースだというのは分かってるから排他は少なくてすむ。
(ヒープメモリの管理テーブルはスレッド共通だから排他がゼロとはいかないと思うけど。)
後始末が少しくらい遅れてもどうということはないし。
555デフォルトの名無しさん (ワッチョイ e202-oEHq)
2025/07/13(日) 11:30:27.40ID:WDtYO/xJ0 まあ、
アクションとか以外の、1/60秒で同期させなくていい処理ですかね…
遠くのPhysXの物理とかもできるのかな…
数年ぶりで、レイトレーシングとか未経験だわ…
アクションとか以外の、1/60秒で同期させなくていい処理ですかね…
遠くのPhysXの物理とかもできるのかな…
数年ぶりで、レイトレーシングとか未経験だわ…
556デフォルトの名無しさん (ワッチョイ e202-oEHq)
2025/07/13(日) 11:36:28.87ID:WDtYO/xJ0557デフォルトの名無しさん (ワッチョイ cecd-YjA1)
2025/07/13(日) 21:38:10.94ID:e/4c/Agi0 ・人間は犯罪を起こす種族と言い切っている
地球はすでに丸見え、レーダー電波で宇宙人に居場所をさらしている
公開: 2025-07-13 21:00
https://karapaia.com/archives/524757.html
>>明らかに人工的なもので、200光年以内にある知的文明なら、地球の場所を把握できる可能性が高い。
>>アレシボ天文台のような超高感度の望遠鏡を使えば、理論上は6万光年先からでも地球の電波を検出できるとされている。
>>に宇宙空間で“丸見え”の状態にあり、その状況は75年前から続いているのだ。問題は、彼らが友好的な文明であるという保証がまったくないことだ。
★>>可能性としては、(我々人間のように)きわめて敵対的かつ侵略的な種族であるケースも十分にあり得る。
地球はすでに丸見え、レーダー電波で宇宙人に居場所をさらしている
公開: 2025-07-13 21:00
https://karapaia.com/archives/524757.html
>>明らかに人工的なもので、200光年以内にある知的文明なら、地球の場所を把握できる可能性が高い。
>>アレシボ天文台のような超高感度の望遠鏡を使えば、理論上は6万光年先からでも地球の電波を検出できるとされている。
>>に宇宙空間で“丸見え”の状態にあり、その状況は75年前から続いているのだ。問題は、彼らが友好的な文明であるという保証がまったくないことだ。
★>>可能性としては、(我々人間のように)きわめて敵対的かつ侵略的な種族であるケースも十分にあり得る。
558デフォルトの名無しさん (ワッチョイ ce59-YjA1)
2025/07/14(月) 12:26:06.28ID:D5VD7WG/0 GPT-4.1超えの中国製AIモデル「Kimi K2」が無料公開される、複数のテストでGPT-4.1やClaude 4 Opusを打ち負かしエージェントタスクもこなす
2025年07月14日 11時10分
https://gigazine.net/news/20250714-ai-kimi-k2/
>>Kimi K2はベースモデルの「Kimi-K2-Base」と事後学習済みモデルの「Kimi-K2-Instruct」の2種類に分かれてリリースされています。以下の図は「Kimi-K2-Instruct」「DeepSeek V3」「Qwen3-235B」「GPT-4.1」「Claude 4 Opus」「Claude 4 Sonnet」「Gemini 2.5 Flash」のベンチマークスコアを並べたものです。Kimi-K2-InstructはすべてのテストでオープンモデルのDeepSeel V3とQwen3-235Bを超えるスコアを記録し、一部のテストでGPT-4.1やClaude Sonnet 4などの商用モデルに勝利しています。
◇上記サイト内にダウンロードリンクがある
2025年07月14日 11時10分
https://gigazine.net/news/20250714-ai-kimi-k2/
>>Kimi K2はベースモデルの「Kimi-K2-Base」と事後学習済みモデルの「Kimi-K2-Instruct」の2種類に分かれてリリースされています。以下の図は「Kimi-K2-Instruct」「DeepSeek V3」「Qwen3-235B」「GPT-4.1」「Claude 4 Opus」「Claude 4 Sonnet」「Gemini 2.5 Flash」のベンチマークスコアを並べたものです。Kimi-K2-InstructはすべてのテストでオープンモデルのDeepSeel V3とQwen3-235Bを超えるスコアを記録し、一部のテストでGPT-4.1やClaude Sonnet 4などの商用モデルに勝利しています。
◇上記サイト内にダウンロードリンクがある
559デフォルトの名無しさん (ワッチョイ a9d9-jjSx)
2025/07/14(月) 14:37:25.45ID:4jx6FCSc0 >>540
お前ゲーム作ったこと無いやろ・・・
お前ゲーム作ったこと無いやろ・・・
560デフォルトの名無しさん (ワッチョイ 370b-VyTm)
2025/07/14(月) 16:00:51.76ID:sJl0ASyp0 ただエンプティ言いたいだけ違うんかと
561デフォルトの名無しさん (ワッチョイ 915f-YjA1)
2025/07/14(月) 16:18:22.23ID:CQ+aGKeG0 画面描画FPS(frames per second)を固定させる為に、以下の待ち処理を入れるとFPSがメッチャ安定する:
while (system_clock::now() < t_after_sleeping) {
Sleep(0);
}
しかし強制フリーズさせてるみたいで、ハード痛めたりしないか不安なんだが。どうなん実際の所?詳しい人教えて
while (system_clock::now() < t_after_sleeping) {
Sleep(0);
}
しかし強制フリーズさせてるみたいで、ハード痛めたりしないか不安なんだが。どうなん実際の所?詳しい人教えて
562デフォルトの名無しさん (ワッチョイ 30a6-4yYS)
2025/07/14(月) 16:27:01.51ID:NLDJkZue0 マルチスレッドのセオリーとしてはSleepせずにビジーループするほうが問題
なんだけど、Sleepだと精度悪すぎてちゃんとFPS担保できるのか心配にはなる。動いてるならそれでいいけど
なんだけど、Sleepだと精度悪すぎてちゃんとFPS担保できるのか心配にはなる。動いてるならそれでいいけど
563はちみつ餃子 ◆8X2XSCHEME (ワッチョイ bd32-2YuX)
2025/07/14(月) 17:49:12.87ID:23SHNwVj0 >>561
定石と言えるレベルの普通の処理だよ。
既に指摘されているようにタイマーの精度の問題はあるので工夫を入れる必要はあるけど、
精度が悪くても処理が遅れる (想定より FPS が下がる) 可能性があるだけ。
どういう理屈で不安に思っているのかがよくわからないので何を間違っているのか説明できない。
Sleep(0) が何をやってるかわからない (これが何らかの危険な処理だと思っている) ってこと?
定石と言えるレベルの普通の処理だよ。
既に指摘されているようにタイマーの精度の問題はあるので工夫を入れる必要はあるけど、
精度が悪くても処理が遅れる (想定より FPS が下がる) 可能性があるだけ。
どういう理屈で不安に思っているのかがよくわからないので何を間違っているのか説明できない。
Sleep(0) が何をやってるかわからない (これが何らかの危険な処理だと思っている) ってこと?
564デフォルトの名無しさん (ワッチョイ 915f-YjA1)
2025/07/14(月) 20:03:36.26ID:CQ+aGKeG0 test
565デフォルトの名無しさん (ワッチョイ 915f-YjA1)
2025/07/14(月) 20:04:22.78ID:CQ+aGKeG0 >>563
ありがとう。Sleep(0)が何をやっているかはわかっている
ありがとう。Sleep(0)が何をやっているかはわかっている
566デフォルトの名無しさん (ワッチョイ 915f-YjA1)
2025/07/14(月) 20:05:51.19ID:CQ+aGKeG0 >>561のwhile中を空にする(Sleep(0)しない) > while中でSleep(0)する > while中でSleep(1)する(時間単位を1msにして待ち時間を1ms縮める)
という具合にCPU占有率が上がる。精度は落ちるがSleep(1)を入れた方がCPUの負荷は減るので、何となく安心する。
という具合にCPU占有率が上がる。精度は落ちるがSleep(1)を入れた方がCPUの負荷は減るので、何となく安心する。
567デフォルトの名無しさん (ワッチョイ 915f-YjA1)
2025/07/14(月) 20:06:23.37ID:CQ+aGKeG0 >>561のwhileの中でSleep(0)しつつ準ビジー状態を強行するのがどれだけハードに悪影響なのか、その辺りの実績経験を盗みかった。卑しい盗人を助けてくれ下さい
568デフォルトの名無しさん (ワッチョイ 7001-jjSx)
2025/07/15(火) 00:13:36.01ID:KEPxDdxR0 C++スレ的にはthis_thread::yieldかと思ったんだが
569デフォルトの名無しさん (ワッチョイ 6268-3HIJ)
2025/07/15(火) 04:24:49.25ID:4J45BJq00570デフォルトの名無しさん (ワッチョイ cda1-2ooF)
2025/08/04(月) 06:40:16.41ID:0gfRmGh70 ちょっ質問なのですが
unsigned long m_ulAbortReasonBmp;
std::mutex m_mutex;
std::atomic<unsigned long> m_ulBias;
に対し、
m_mutex.lock();
m_ulAbortReasonBmp |= fooBmp; // (1) : m_mutex.lock()期間内
m_mutex.unlock();
m_ulBias.store(barVal, std::memory_order_release); // (2) : m_mutex.lock()期間外だがm_mutex.lock()期間の後
としたとき、
Q1. m_mutex.lock()している他スレッドから見て(1)、(2)の操作の順序(m_ulAbortReasonBmpが変化した後、m_ulBiasが変化する)は保証される?
Q2. m_mutex.lock()していない他スレッドから見てんも(1)、(2)の操作の順序(m_ulAbortReasonBmpが変化した後、m_ulBiasが変化する)は保証される?
unsigned long m_ulAbortReasonBmp;
std::mutex m_mutex;
std::atomic<unsigned long> m_ulBias;
に対し、
m_mutex.lock();
m_ulAbortReasonBmp |= fooBmp; // (1) : m_mutex.lock()期間内
m_mutex.unlock();
m_ulBias.store(barVal, std::memory_order_release); // (2) : m_mutex.lock()期間外だがm_mutex.lock()期間の後
としたとき、
Q1. m_mutex.lock()している他スレッドから見て(1)、(2)の操作の順序(m_ulAbortReasonBmpが変化した後、m_ulBiasが変化する)は保証される?
Q2. m_mutex.lock()していない他スレッドから見てんも(1)、(2)の操作の順序(m_ulAbortReasonBmpが変化した後、m_ulBiasが変化する)は保証される?
571デフォルトの名無しさん (ワッチョイ cda1-2ooF)
2025/08/04(月) 07:34:20.02ID:0gfRmGh70 Q1については、他スレッドから見てm_ulBiasのreadが
m_mutex.lock()期間(クリティカルセクション)内のm_ulAbortReasonBmpへの書き込みより
先行するようなことが起きるとクリティカルセクションの意味が消失するから保証される
Q2についてはm_ulBiasのreadがプロセッサコアにどう計画されるかわからないから
m_ulAbortReasonBmpへの書き込みの後になることは一般に保証されない、
が、現在人類が手にしているクリティカルセクションの実装(lock期間に入るときと出るときそれぞれで
いかなるreadもwriteも無差別にバリアする)により、lockしないスレッドから見ても順序が実質的に保証される、
でおk?
m_mutex.lock()期間(クリティカルセクション)内のm_ulAbortReasonBmpへの書き込みより
先行するようなことが起きるとクリティカルセクションの意味が消失するから保証される
Q2についてはm_ulBiasのreadがプロセッサコアにどう計画されるかわからないから
m_ulAbortReasonBmpへの書き込みの後になることは一般に保証されない、
が、現在人類が手にしているクリティカルセクションの実装(lock期間に入るときと出るときそれぞれで
いかなるreadもwriteも無差別にバリアする)により、lockしないスレッドから見ても順序が実質的に保証される、
でおk?
572デフォルトの名無しさん (ワッチョイ cda1-2ooF)
2025/08/04(月) 08:33:59.43ID:0gfRmGh70 訂正orz、
Q2のケースでは保証されない
現在人類が手にしているクリティカルセクションの実装(lock期間に入るときと出るときそれぞれで
いかなるreadもwriteも無差別にバリアする)のが真実だとしても、
それはm_ulAbortReasonBmpやm_ulBiasをwriteする側のスレッドがwrite順を守るというだけで、
m_ulAbortReasonBmpやm_ulBiasをreadする側のスレッドにはメモリバリアするコードが無いから
read順を好きに計画され、writeした順でreadされる保証が無い
Q2のケースでは保証されない
現在人類が手にしているクリティカルセクションの実装(lock期間に入るときと出るときそれぞれで
いかなるreadもwriteも無差別にバリアする)のが真実だとしても、
それはm_ulAbortReasonBmpやm_ulBiasをwriteする側のスレッドがwrite順を守るというだけで、
m_ulAbortReasonBmpやm_ulBiasをreadする側のスレッドにはメモリバリアするコードが無いから
read順を好きに計画され、writeした順でreadされる保証が無い
573デフォルトの名無しさん (ワッチョイ 5f79-1HMX)
2025/08/04(月) 08:41:31.47ID:3rv0HXUI0 >ちょっ
かわいい
…舐めてんの?
かわいい
…舐めてんの?
574デフォルトの名無しさん (ワッチョイ e3b9-Psuq)
2025/08/04(月) 16:26:39.26ID:Tt4A7oMm0575デフォルトの名無しさん (ワッチョイ 7f4e-W9J6)
2025/08/10(日) 21:35:26.79ID:gXfPFnW/0 男きたああああああああああ
576デフォルトの名無しさん (ワッチョイ d322-PSkW)
2025/08/22(金) 07:16:07.15ID:iDw/vpGA0 初心者だけど、
Pythonみたいにreturnを複数ってできないの?
touple使うくらい?
Pythonみたいにreturnを複数ってできないの?
touple使うくらい?
577デフォルトの名無しさん (ワッチョイ 5bfd-Srv/)
2025/08/22(金) 07:35:30.89ID:8V9ySHS/0 複数の値を一つにまとめればいいだけ
返す型次第
返す型次第
578デフォルトの名無しさん (ワッチョイ 5b85-ZBQJ)
2025/08/22(金) 08:55:40.38ID:LQncxxKI0 複数返したいならタプルでいいんじゃない
引数に出力渡すのが多いと思うけど
引数に出力渡すのが多いと思うけど
579はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5932-86vp)
2025/08/22(金) 10:34:20.59ID:s1oN92u00 Python でも返却値として複数の値を返すことは出来ない。
Python で return にカンマ区切りで複数の式を書くとタプルになってる。
受け取る側で複数の変数を書いておけばタプルが分配 (unpack) されたりはするけど……
関数が返却しているのはあくまでもひとつの値という理屈。
複数の値 (いわゆる多値) を関数が返せる言語はそれほど多くない。
LISP 系は多値のサポートがあることが多いけどそれ以外だと Go くらいじゃないかな?
(マイナー言語だとわからんけどよく知られている主要な言語にはほとんどないと思う。)
シンタクス的には C++ で return にカンマ区切りで複数の値を渡そうとしたとき、
つまり
return 1, 2, 3;
というように書いたときのカンマはカンマ演算子として解釈される。
カンマ演算子は左辺の結果を捨てる (評価はする) ので 3 だけが返却値になる。
C++ で複数の値をひとまとめにするには波括弧で囲む記法があって
std::tuple<int, int, int> foo(void) {
return {1, 2, 3};
}
というように書けるんだが……
この波括弧は初期化の記法であってタプルのリテラルというわけではないのでそこんところは注意。
Python で return にカンマ区切りで複数の式を書くとタプルになってる。
受け取る側で複数の変数を書いておけばタプルが分配 (unpack) されたりはするけど……
関数が返却しているのはあくまでもひとつの値という理屈。
複数の値 (いわゆる多値) を関数が返せる言語はそれほど多くない。
LISP 系は多値のサポートがあることが多いけどそれ以外だと Go くらいじゃないかな?
(マイナー言語だとわからんけどよく知られている主要な言語にはほとんどないと思う。)
シンタクス的には C++ で return にカンマ区切りで複数の値を渡そうとしたとき、
つまり
return 1, 2, 3;
というように書いたときのカンマはカンマ演算子として解釈される。
カンマ演算子は左辺の結果を捨てる (評価はする) ので 3 だけが返却値になる。
C++ で複数の値をひとまとめにするには波括弧で囲む記法があって
std::tuple<int, int, int> foo(void) {
return {1, 2, 3};
}
というように書けるんだが……
この波括弧は初期化の記法であってタプルのリテラルというわけではないのでそこんところは注意。
580デフォルトの名無しさん (ワッチョイ d1d6-uNzz)
2025/08/22(金) 10:49:05.94ID:hiXhYkKD0581デフォルトの名無しさん (ブーイモ MMb3-Srv/)
2025/08/22(金) 11:06:34.54ID:HM+/3rtsM582デフォルトの名無しさん (スププ Sdb3-im2P)
2025/08/22(金) 11:49:05.11ID:ZeYv0pFNd C++も昔に比べれば随分と楽になった
583はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5932-86vp)
2025/08/22(金) 12:07:46.82ID:s1oN92u00 >>580
タプルは単にタプル型の値なので普通に受け取れる。
auto bar = foo();
といったように書ける。
タプルから要素を取り出すのは std::get<0>(bar); といった要領になる。
受け取るときに変数に分配するやり方もあって
atuo [r1, r2, r3] = foo();
というようにも書ける。
これを構造化束縛という。
おそらくこれが期待していたものなんじゃないか?
この記法はタプルに限らずタプルライクな型、配列型、データメンバが全て公開直接メンバであるような型などであれば使える。
タプルは単にタプル型の値なので普通に受け取れる。
auto bar = foo();
といったように書ける。
タプルから要素を取り出すのは std::get<0>(bar); といった要領になる。
受け取るときに変数に分配するやり方もあって
atuo [r1, r2, r3] = foo();
というようにも書ける。
これを構造化束縛という。
おそらくこれが期待していたものなんじゃないか?
この記法はタプルに限らずタプルライクな型、配列型、データメンバが全て公開直接メンバであるような型などであれば使える。
584はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5932-86vp)
2025/08/22(金) 12:23:44.06ID:s1oN92u00 もし使っているコンパイラが MSVC なら MSVC のデフォルトでは C++14 になってるはずだからそのままだと構造化束縛を使えないかも。
(構造化束縛は C++17 から。)
私は MSVC を利用していないから具体的なやり方は知らんけど必要なら適当に設定してね。
(構造化束縛は C++17 から。)
私は MSVC を利用していないから具体的なやり方は知らんけど必要なら適当に設定してね。
585デフォルトの名無しさん (ワッチョイ d1d6-uNzz)
2025/08/22(金) 17:49:52.20ID:hiXhYkKD0 どもです。構造化束縛ね。なんか聞いた事あるかなという程度だった。
使うかなぁ・・・
使うかなぁ・・・
586デフォルトの名無しさん (ワッチョイ c1ad-F95I)
2025/08/22(金) 21:41:35.66ID:NcnZjMQ+0 構造体ほど強いまとまりではなく、返り値だけのゆるいまとまりなら構造化束縛の方が便利だけどねぇ
587デフォルトの名無しさん (ワッチョイ d38d-PSkW)
2025/08/22(金) 21:41:55.58ID:iDw/vpGA0 >>579
std::tuple<int, float, long> foo(void) { return {1, 2.1, 99}; }
atuo [r1, r2, r3] = foo();
って書いたら、
r1に1が、r2に2.1が入るの?
まあそれでもいいかな
PythonからC++に移植中で、ちょっと読みづらいと思ったので…
std::tuple<int, float, long> foo(void) { return {1, 2.1, 99}; }
atuo [r1, r2, r3] = foo();
って書いたら、
r1に1が、r2に2.1が入るの?
まあそれでもいいかな
PythonからC++に移植中で、ちょっと読みづらいと思ったので…
588デフォルトの名無しさん (ワッチョイ d38d-PSkW)
2025/08/22(金) 21:45:40.16ID:iDw/vpGA0589デフォルトの名無しさん (ワッチョイ c1ad-F95I)
2025/08/22(金) 22:11:20.77ID:NcnZjMQ+0 Python でも複数return ってできないと思うけど?
カンマ演算子でタプルを作って返してるだけでしょ
カンマ演算子でタプルを作って返してるだけでしょ
590デフォルトの名無しさん (ワッチョイ 51a5-VfJp)
2025/08/22(金) 23:03:10.61ID:5NhjtIih0 そうやね。Pytnonのカンマは、言語仕様上は演算子とは一応区別されているみたいだけど、感覚的には演算子だよね。何で演算子ではないんだろうというのはちょっとした疑問だけど(1, みたいなのを後置演算子と呼ぶのはちょっと変とかそういうことかな?)
591デフォルトの名無しさん (ワッチョイ d1d6-uNzz)
2025/08/23(土) 01:30:59.35ID:ynkOCuVA0 //こんな感じ?
#include <iostream>
#include <tuple>
using namespace std;
tuple<int, float, long> foo() {
return {1, 2.1, 99};
}
int main(){
auto [r1, r2, r3] = foo();
cout<<r1<<endl;
cout<<r2<<endl;
cout<<r3<<endl;
return 0;
}
#include <iostream>
#include <tuple>
using namespace std;
tuple<int, float, long> foo() {
return {1, 2.1, 99};
}
int main(){
auto [r1, r2, r3] = foo();
cout<<r1<<endl;
cout<<r2<<endl;
cout<<r3<<endl;
return 0;
}
592デフォルトの名無しさん (ワッチョイ 7101-Im4V)
2025/08/23(土) 01:57:32.43ID:HIKpDy1T0 構造化束縛を調べてみたら
fooの返り値はtupleでなくてもpairで返しても良さそうなんだけど
どういうルールなの? キモい
fooの返り値はtupleでなくてもpairで返しても良さそうなんだけど
どういうルールなの? キモい
593はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5932-oZZu)
2025/08/23(土) 02:11:02.56ID:CHT0FIec0 >>592
それがタプルライクの概念。
std::tuple_size の特殊化など、いくつかのインターフェイスを実装すればタプルと同じように扱ってくれる仕組み。
それとは別に配列の場合とか、全てのデータメンバが公開直接メンバなクラスもありということになってるのは単純に箇条書きで数種類のパターンを示す形になってる。
それほどパターンが多くはないがひとつの原則で表せるわけでもない。
それがタプルライクの概念。
std::tuple_size の特殊化など、いくつかのインターフェイスを実装すればタプルと同じように扱ってくれる仕組み。
それとは別に配列の場合とか、全てのデータメンバが公開直接メンバなクラスもありということになってるのは単純に箇条書きで数種類のパターンを示す形になってる。
それほどパターンが多くはないがひとつの原則で表せるわけでもない。
594デフォルトの名無しさん (ワッチョイ 7101-Im4V)
2025/08/23(土) 02:22:04.99ID:HIKpDy1T0595デフォルトの名無しさん (ワッチョイ 2b10-fgJ7)
2025/08/23(土) 09:17:36.36ID:rBYkDYvT0 構造的部分型とか静的ダックタイピングって呼ばれるやつ?
596デフォルトの名無しさん (ワッチョイ d326-PSkW)
2025/08/23(土) 13:12:32.34ID:wVRYzYK20597はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 51e2-oZZu)
2025/08/23(土) 13:15:39.41ID:DefMPT1k0 代入のときは tie を使う。
598デフォルトの名無しさん (ワッチョイ c9bc-zJwz)
2025/08/23(土) 15:01:16.09ID:p3yrvAiP0 テンプレートの黒魔術で脳汁出てからが本番
599デフォルトの名無しさん (ワッチョイ 5be0-Srv/)
2025/08/23(土) 15:37:03.06ID:T+HzfXMC0 >>596
別の言語っぽくって考えは捨てた方が身のため
別の言語っぽくって考えは捨てた方が身のため
600デフォルトの名無しさん (ワッチョイ 9379-XJDV)
2025/08/23(土) 19:08:06.22ID:VwZegIlc0 666!
601デフォルトの名無しさん (スフッ Sdb3-im2P)
2025/08/23(土) 19:56:19.30ID:k0uySdFmd struct {
int r1,
float r2,
long r3
} t;
t = foo();
って描きたい
struct に tuple からのコンストラクタを実装すれば良いのかな
int r1,
float r2,
long r3
} t;
t = foo();
って描きたい
struct に tuple からのコンストラクタを実装すれば良いのかな
602はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5932-86vp)
2025/08/23(土) 20:18:30.70ID:CHT0FIec0 >>601
最初から foo がその型で返せばいいんでないの?
最初から foo がその型で返せばいいんでないの?
603デフォルトの名無しさん (ワッチョイ 6dad-W0Wb)
2025/08/24(日) 12:07:46.50ID:HqphwiLf0 C言語から続くカンマ演算子が分かってないんでは?
604デフォルトの名無しさん (ワッチョイ fee0-ea+o)
2025/08/24(日) 12:09:48.21ID:gU3L8vdd0 Pythonあがりだから型を定義する意味がわかってないんだと思う
605デフォルトの名無しさん (ワッチョイ 15d6-VoZ8)
2025/08/25(月) 07:55:54.04ID:O202BBJ90 a=10
a=’hello'
翻訳しながらだからできるんだろうけどね。
a=’hello'
翻訳しながらだからできるんだろうけどね。
606デフォルトの名無しさん (ワッチョイ 86cf-tcs3)
2025/08/25(月) 08:19:19.75ID:X23BjBGY0 >590
左辺にも現れるからじゃね?
左辺にも現れるからじゃね?
607初心者プログラマー (ワッチョイ d5ce-rKTE)
2025/08/28(木) 17:50:07.17ID:GULY1B8W0 cppでbazelでmediapipeのビルド方法を教えてくれる方はいませんか?
自分の環境
Visual Studio Community 2022
Windows11 64 ビット
scoopでbazel 5.3.0
Python 3.10.0
自分の環境
Visual Studio Community 2022
Windows11 64 ビット
scoopでbazel 5.3.0
Python 3.10.0
608青木康善 (アウアウウー Sa47-Rd44)
2025/09/07(日) 03:16:03.97ID:Fgms30k2a なんか、javaより簡単に思えてきました。
609はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1732-F+lb)
2025/09/07(日) 06:54:14.37ID:Ur1gsBeL0 そうか。
610デフォルトの名無しさん (ワッチョイ dbd6-ERpe)
2025/09/07(日) 07:39:38.11ID:yhbLpr+z0 obj1=obj2;
の後obj2を変更すると、obj1が書き換わってまってびっくりして
その後、Javaが怖い親父です。
の後obj2を変更すると、obj1が書き換わってまってびっくりして
その後、Javaが怖い親父です。
611デフォルトの名無しさん (ワッチョイ 7f5f-Z2G8)
2025/09/07(日) 13:56:14.79ID:ZFShxqYO0 C/C++もポインタを代入するとそうなるよ
612デフォルトの名無しさん (ワッチョイ a380-1jR+)
2025/09/07(日) 15:17:34.87ID:DiKqvn8B0 この親父他の言語ほぼ使えんだろ
613デフォルトの名無しさん (アウアウウー Sa47-Y7lD)
2025/09/07(日) 15:34:33.99ID:AK/wIzqla614デフォルトの名無しさん (ワントンキン MMe6-+IOe)
2025/09/07(日) 16:53:15.89ID:2DaEs5aKM615デフォルトの名無しさん (ワッチョイ dbd6-ERpe)
2025/09/07(日) 17:20:59.28ID:yhbLpr+z0616デフォルトの名無しさん (ワッチョイ 1ba6-aHNR)
2025/09/07(日) 17:34:06.57ID:5bTmv8Qp0 参照メインの言語で書き換えを頻繁に行うとそりゃ事故るよ、注意力にも限界がある
値の書き換えをするならC++のように変数が直接値を持つ言語がいいし
参照をメインにするなら関数型言語のようにimmutableを基本にするべきだ
値の書き換えをするならC++のように変数が直接値を持つ言語がいいし
参照をメインにするなら関数型言語のようにimmutableを基本にするべきだ
617デフォルトの名無しさん (オッペケ Sr3b-wO3q)
2025/09/07(日) 18:17:46.03ID:kASsF2K3r ないしは、q=p; ってしたときに、pがダメになってくれるか
618デフォルトの名無しさん (ワントンキン MMe6-+IOe)
2025/09/07(日) 22:03:02.60ID:2DaEs5aKM >>615
C++では参照の競合があってもエラーとならず安全性は保証されないよ
例えば以下の挙動
std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7};
int& fifth = v[5];
v.push_back(100);
std::vector<int> w{8, 8, 8, 8, 8, 8, 8, 8};
fifth = 555;
std::cout << "v[5] = " << v[5] << std::endl;
std::cout << "w[5] = " << w[5] << std::endl;
C++では参照の競合があってもエラーとならず安全性は保証されないよ
例えば以下の挙動
std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7};
int& fifth = v[5];
v.push_back(100);
std::vector<int> w{8, 8, 8, 8, 8, 8, 8, 8};
fifth = 555;
std::cout << "v[5] = " << v[5] << std::endl;
std::cout << "w[5] = " << w[5] << std::endl;
619デフォルトの名無しさん (ワッチョイ dbd6-ERpe)
2025/09/08(月) 07:59:15.17ID:It1Ffdlu0620はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 1732-F+lb)
2025/09/08(月) 10:27:54.64ID:bx3qX9/R0 状況を一から説明すると……
これは fifth が古い無効になった場所を参照する可能性があることが問題。
std::vector の各要素は連続した空間に配置されることが保証されている。
要素の増減でその場所の都合が悪くなれば再配置される可能性があり、
再配置が起こったときは要素を指していたイテレータや参照は無効になるというルール。
無効なイテレータや参照を通じてアクセスしたら何が起こるかわからない。
再配置が起こる可能性がある操作については個々に仕様に書かれているけれど、
キャパシティを変更する (可能性がある) ような操作はどれも再配置が起こりえると覚えておけばいい。
そんでもってこれのややこしいところは「可能性がある」ってところで、
キャパシティをどれくらい拡大するか実装によって差があるし、
状況によっては場所を移動せずに大きさを伸ばせるかもしれない。
つまり問題が顕在化しないかもしれない。
一般論として倍々に延ばす実装がよく知られているからこの例では最初に要素を 8 個にして
顕在化しやすいようにしたんだろう。
これは fifth が古い無効になった場所を参照する可能性があることが問題。
std::vector の各要素は連続した空間に配置されることが保証されている。
要素の増減でその場所の都合が悪くなれば再配置される可能性があり、
再配置が起こったときは要素を指していたイテレータや参照は無効になるというルール。
無効なイテレータや参照を通じてアクセスしたら何が起こるかわからない。
再配置が起こる可能性がある操作については個々に仕様に書かれているけれど、
キャパシティを変更する (可能性がある) ような操作はどれも再配置が起こりえると覚えておけばいい。
そんでもってこれのややこしいところは「可能性がある」ってところで、
キャパシティをどれくらい拡大するか実装によって差があるし、
状況によっては場所を移動せずに大きさを伸ばせるかもしれない。
つまり問題が顕在化しないかもしれない。
一般論として倍々に延ばす実装がよく知られているからこの例では最初に要素を 8 個にして
顕在化しやすいようにしたんだろう。
621デフォルトの名無しさん (ワッチョイ dbd6-ERpe)
2025/09/08(月) 10:47:28.92ID:It1Ffdlu0 >>620
どもです。要素数8ってのもさすがって感じでした。
どもです。要素数8ってのもさすがって感じでした。
622デフォルトの名無しさん (ワンミングク MM8a-+IOe)
2025/09/08(月) 22:24:25.56ID:EA0JjXQaM >>620
今回の問題に限ればその通り
ただし問題の本質は二つの参照(変数fifthとpush_back呼び出し時の参照)を使ったこと
今回はダングリング参照で問題を分かりやすく示したがメモリ問題もvectorも本質ではなく任意のデータに対する参照で問題が起きる
既に参照fifthを持つ状況で同じデータを指す別の参照を関数push_backに渡してデータが書き換えられた
参照fifthが指す値は当初から値が変更されてしまったりダングリングで無効な値になる可能性がある
これが二つの参照の競合による問題で値がいつの間にか書き換わってしまっていることでバグも誘発する
両方の参照が書き換えを伴わないreadonlyの時のみ安全になる
片方もしくは両方の参照が書き換えを伴うと安全でなくなる
今回の問題に限ればその通り
ただし問題の本質は二つの参照(変数fifthとpush_back呼び出し時の参照)を使ったこと
今回はダングリング参照で問題を分かりやすく示したがメモリ問題もvectorも本質ではなく任意のデータに対する参照で問題が起きる
既に参照fifthを持つ状況で同じデータを指す別の参照を関数push_backに渡してデータが書き換えられた
参照fifthが指す値は当初から値が変更されてしまったりダングリングで無効な値になる可能性がある
これが二つの参照の競合による問題で値がいつの間にか書き換わってしまっていることでバグも誘発する
両方の参照が書き換えを伴わないreadonlyの時のみ安全になる
片方もしくは両方の参照が書き換えを伴うと安全でなくなる
623デフォルトの名無しさん (ワッチョイ e3ad-ckwE)
2025/09/08(月) 23:06:53.70ID:HoahUzIM0 再配置が行われるものに参照使って、その生存期間を超えてアクセスするのは未定義動作になるわな。C++に慣れてればそんなコードは書かないが、初級者向けではない。readonly より、lifetime の問題でしょう
624デフォルトの名無しさん (ワッチョイ 177c-h0AF)
2025/09/09(火) 00:29:11.16ID:TMUamLpP0 参照が無効になる条件は規定されてるし、先にcapacity設定するとか避ける方法も用意されてる
「問題の本質」とやらはただのライブラリ仕様の無理解だろ
分かりにくいとか間違えやすいとかの批判なら分かるけど
「問題の本質」とやらはただのライブラリ仕様の無理解だろ
分かりにくいとか間違えやすいとかの批判なら分かるけど
625デフォルトの名無しさん (ワントンキン MM8a-+IOe)
2025/09/09(火) 07:24:41.95ID:DVL1/TmTM626デフォルトの名無しさん (ワントンキン MM8a-+IOe)
2025/09/09(火) 07:29:27.85ID:DVL1/TmTM627デフォルトの名無しさん (スフッ Sdba-bj1o)
2025/09/09(火) 10:47:02.21ID:g327vfuJd readonlyでない競合する参照を禁止している言語もある
628デフォルトの名無しさん (ワッチョイ 97e4-1jR+)
2025/09/09(火) 12:16:08.28ID:iPWQv8Oa0 はいはい線型論理言いたいだけ
629デフォルトの名無しさん (アウアウウー Sa47-Rd44)
2025/09/10(水) 00:51:51.50ID:BnR46AnOa >>618
これはvにpush_backしたところでキャパ超えて別の場所にリアロックされ、ともない元のvの領域が空になって、即座にwがスポンとそのvが元あった場所に配置されたってことなのですか?
これはvにpush_backしたところでキャパ超えて別の場所にリアロックされ、ともない元のvの領域が空になって、即座にwがスポンとそのvが元あった場所に配置されたってことなのですか?
630デフォルトの名無しさん (スッププ Sdba-j4tR)
2025/09/10(水) 02:12:52.51ID:IF/zSGeMd そうだよ。
規格上は何の保証もないから、処理系とかによっては全然違う結果になるかもしれないけど。
規格上は何の保証もないから、処理系とかによっては全然違う結果になるかもしれないけど。
632デフォルトの名無しさん (ワッチョイ 4e1f-bj1o)
2025/09/10(水) 10:13:08.62ID:zTYInGVv0 >再構築されて新規の要素を保持してしまったで合ってますか
こう聴かれると「違う」と返事したくなる
こう聴かれると「違う」と返事したくなる
633デフォルトの名無しさん (ワッチョイ 177c-h0AF)
2025/09/10(水) 18:40:20.64ID:Vv9EwJFH0 未定義動作だからな
たまたま鼻から悪魔が出る代わりにそうなっただけだ
たまたま鼻から悪魔が出る代わりにそうなっただけだ
634デフォルトの名無しさん (ワッチョイ a75f-ckwE)
2025/09/10(水) 22:18:27.54ID:RAO/BxQt0 参照の競合という用語に違和感。並行性に関わる競合状態 (race condition) の話をしようとしているのか?
635デフォルトの名無しさん (ワッチョイ b68c-1jR+)
2025/09/10(水) 22:31:03.50ID:BZTqerG60 してない
636デフォルトの名無しさん (ワッチョイ a3d6-X2Ee)
2025/09/22(月) 23:24:45.15ID:ZT49UQS30 でわ 簡単?な話題を。
int data{}; ってやります? int data{0}; ってやります?
int data{}; ってやります? int data{0}; ってやります?
637デフォルトの名無しさん (ワッチョイ 7f7c-3pIy)
2025/09/23(火) 06:55:15.77ID:S9rfzcfC0 int data = 0; ってやる
638はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-BMc3)
2025/09/23(火) 10:47:53.44ID:0b1Ncss10 auto data = 0;
とか、型が明示的なのが好みなら
auto data = int();
といった選択肢もある。
私は
int data = 0;
派だけど。
とか、型が明示的なのが好みなら
auto data = int();
といった選択肢もある。
私は
int data = 0;
派だけど。
639デフォルトの名無しさん (ワッチョイ 8a02-CSnM)
2025/09/23(火) 10:57:08.68ID:NP1ck5iL0640はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7f32-BMc3)
2025/09/23(火) 11:12:21.28ID:0b1Ncss10レスを投稿する
ニュース
- 橋下徹氏 外務省幹部の訪中受け「口だけ番長」へ痛烈指摘 「喧嘩は日本の完敗…なんとかっこ悪い日本か」 [冬月記者★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 経団連会長、日中は建設的対話を 経済3団体が高市首相と初会談も日中関係は話題に登らず… [BFU★]
- 中国で「クレしん」公開延期 対日報復、エンタメに波及 [蚤の市★]
- 東京株式市場 インバウンド関連株が下落 中国政府の渡航自粛要請で [バイト歴50年★]
- 有識者「高市総理が発言を撤回したり、辞職するしかないと言っている人は、それで日中関係が今まで通りになると思ってる?」 [834922174]
- 戦争は無くならないし殺人は起きるし女はレイプされるし子供は餓死するし
- 女性検診なんでオナニーしてグチョグチョで行ってやる
- 日経時間外、5万円割れ 垂直落下始まる [402859164]
- ( ´・ω・` )朝ですぞー
- 【悲報】男性人気アイドルグループJO1、中国公演中止wwwwwwwwwwwwwwwwwwwwwwwwwww
