C++相談室 part146

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

前スレ
C++相談室 part145
http://mevius.5ch.net/test/read.cgi/tech/1568362404/

このスレもよろしくね。
【初心者歓迎】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/ (日本語)
2019/12/11(水) 18:17:08.59ID:bM/oaPHs
>>776
スマン。XOR交換命令ではなく、xchg命令だった。
2019/12/11(水) 18:20:46.73ID:NtLrnXCf
goよりかはrustの方が全然マシやと思うぞ
最近go案件振られること多いけどC言語触ってるみたいで好きになれんわ〜
2019/12/11(水) 18:30:30.06ID:/1t9T7AP
>>776
xchgはsequential consistencyが必要な場合だよ
今回のように単にatomicにread/writeできればいいだけなら不要
お前さんも含めてよくわからん人は使わないのは正解
2019/12/11(水) 18:36:33.88ID:bM/oaPHs
>>779
正直言って、俺は、lock, xchg, mfence, prefetch,
キャッシュ制御付き(?)mov各種(大量)
に付いてはちゃんと理解出来てないことは認める。
781デフォルトの名無しさん
垢版 |
2019/12/11(水) 18:38:56.23ID:bM/oaPHs
MFENCE
PREFETCH
MOVNTDQA
LFENCE(?)
XCHG
LOCK prefix
WC Memory

↑沢山あるけど、よく分からない。
xchgもちゃんと理解できてない。
2019/12/11(水) 18:39:59.12ID:bM/oaPHs
MFENCE, LFENCE, SFENCE。

服のサイズみたいだ。分からん。
2019/12/11(水) 18:46:12.74ID:bM/oaPHs
>>779
xchgは、2つ以上のCPUが1つの事柄に関する lock を同時に獲得しようとした時に
1 CPU だけが lock を獲得できて、他はすべて獲得できないようにするための
ためのようですね。今回とは余り関係ないようです。
2019/12/11(水) 21:50:49.53ID:10jfhd7e
>>777
XORを使った交換テクニックがあったのを思い出した
2019/12/12(木) 00:31:42.87ID:n5d2iAqE
>>765
その場合でも排他制御は基本的には必要。
たとえば読み込んで範囲チェックをした後に値が変わってしまったらまずいでしょ。
別メモリにコピーを取っていてから処理しているつもりでも、最適化が気を利かして削除しちゃうこともあるだろうしね。
2019/12/12(木) 00:36:46.28ID:n5d2iAqE
>>765
あとはアレだな、変数の構造にもよるけど、変数を読み込んでる最中に、上位ワードを読み込んだ後に値が変わって下位ワードだけ新しくなるなんてことも
可能性としては0とは言えない。
2019/12/12(木) 00:54:16.98ID:UvCIGzud
AVXを使えば256bitを1命令で
AVX512を使えば512bitを1命令で
読み書き可能
2019/12/12(木) 01:00:12.24ID:UvCIGzud
x86系だとCMPXCHG命令
ARMだとLL, AC命令

がデータの一貫性確認に使える
789デフォルトの名無しさん
垢版 |
2019/12/12(木) 03:03:25.42ID:hmkgwwLY
とんちプログラミングはもう流行らなさそう。
2019/12/12(木) 03:28:17.88ID:J/GuvI9A
とんちプログラミングwww
2019/12/12(木) 03:55:57.93ID:g+q4RhTJ
> これを避けるには、80386の設計者は、XOR交換命令を使うことを想定
> していたらしい。

当たり前じゃね?アトミックな命令を使うのは基本だと思うが
2019/12/12(木) 07:30:46.73ID:UvCIGzud
XOR
2019/12/12(木) 07:43:20.40ID:Vt8W+oPZ
xor rax,rbx
xor rbx,rax
xor rax,rbx
これでswap rax,rbx相当ってことね
2019/12/12(木) 07:53:00.21ID:UvCIGzud
>>777
2019/12/12(木) 10:43:59.85ID:r0VN1UlG
condition_variableで待機しているスレッドがない状態でnotify_allしたときの動作ってどうなりますか?
2019/12/12(木) 10:56:19.34ID:WJA8YZFG
時空が逆流し、針の先から悪魔が生まれる
797デフォルトの名無しさん
垢版 |
2019/12/12(木) 11:06:56.29ID:a67Hqgb2
jsに対するTypeScriptみたいな感じで
C++に対するRustっていう認識は間違ってるが
それならC++に対するそれは何が適当なんかある?
2019/12/12(木) 11:10:12.33ID:Vt8W+oPZ
allに該当する要素の数が0なのを特別視する必要はなさそう
2019/12/12(木) 11:21:14.68ID:NrsugUJv
非同期な操作やしその瞬間何も起きんなら単にスルーするだけ
2019/12/12(木) 12:01:38.93ID:Z8SHCwDj
>>797
無い。
2019/12/12(木) 12:26:43.11ID:gL/Y8Ccu
>>797
Managed C++とかC++/CLIとか
2019/12/12(木) 13:04:34.98ID:Z8SHCwDj
>>801
それだと余計に変になっているので、JS ---> TypeScript の関係とは違う。
803デフォルトの名無しさん
垢版 |
2019/12/12(木) 13:08:42.86ID:b3wcvAqB
C++は型安全だからC++はC++
2019/12/12(木) 14:17:55.83ID:CNmkwPhj
型安全認定された!
2019/12/12(木) 14:59:18.45ID:ZWrMIDdu
ていうかTypeScriptはJSが型があまりにもザルすぎて危険だよね、Javaやら
C/C++ほど堅くないにしてもある程度の型はいるよね?っていう発想ででてきた
ものだから C++ から寄せていくならむしろ型をユルくしてくパターンだな
そんなクソ言語には興味がないので具体的に何?ときかれても知らんがな
2019/12/12(木) 16:27:22.69ID:AVYkL4QT
JSが危険ってどういう事?

C/C++は型がない=危険だけど
JSなんかは型安全な言語だからちゃんと例外になって、
メモリ保護エラーとか起こすこと無いけど?
807デフォルトの名無しさん
垢版 |
2019/12/12(木) 16:39:21.91ID:hmkgwwLY
Treeの節(Node)は部分木を表すRangeだと考えて差し支えないですかね?
808デフォルトの名無しさん
垢版 |
2019/12/12(木) 16:47:21.68ID:hmkgwwLY
C++20のレンジってもしかしてDBのカーソルとかに応用できませんかね?
2019/12/12(木) 18:38:14.77ID:Ijd1d2r8
毎回フルスキャンしたいならどうぞ
810デフォルトの名無しさん
垢版 |
2019/12/12(木) 18:59:14.59ID:hmkgwwLY
ビューで制限できるし遅延評価を目的としたストリームを代弁できるんじゃないかなって思ったのですが。
2019/12/12(木) 19:07:50.30ID:Z8SHCwDj
>>806
型も宣言も無い事が危険になることが多い。
例えば、関数を定義しても仮引数に型がないので、全く間違った実引数列
を指定してしまっても処理系がエラーを出してくれない。関数を修正して
仮引数列の真ん中あたりに新しい仮引数を一つ増やしたとする。
この場合、この関数を呼び出す側もちゃんと全て修正する必要がある。
Cだと型をチェックしてくれるので修正の仕方を間違うとエラーになって
くれることが多い。ところがJSだと間違っても全くエラーを出してくれない。

また、JSの場合、ローカル変数とグローバル変数を間違って使ってしまい、
グローバル変数にいれたつもりがローカル変数になってしまっていることがある。

また、変数を1文字間違えた場合も全くエラーにならず、新しいグローバル変数
が使用されたと解釈されてしまう。

どれも、C言語だとエラーになってくれるので安全だが、JSだと危険。
2019/12/12(木) 19:25:03.70ID:AVYkL4QT
>>811
お前が型安全の意味を間違ってるってことはよく分かった。

メモリ保護エラーなど言語で解決されないエラー
(OSがトラップするエラー)になってしまうことを
型安全じゃないっていうんだよ

言語で例外になるならそれは型安全
2019/12/12(木) 19:44:50.53ID:Vt8W+oPZ
ぬるぽ
2019/12/12(木) 20:29:23.98ID:f2lx0DlC
ツンッ
2019/12/12(木) 20:46:51.94ID:6QhfdrtV
>>808
おそらくできると思う
816デフォルトの名無しさん
垢版 |
2019/12/12(木) 22:31:55.78ID:hmkgwwLY
boost.property_treeはノードはコンテナだって書いてる。
アルゴリズムイントロダクションにはポインタ三つ組みのツリー表現が紹介されてるけど、これがノードがコンテナ的な感じだろか。
2019/12/12(木) 22:36:00.00ID:2qfVB5NM
>>812
???
>>811は型安全なんて一言も言ってないけど?
818デフォルトの名無しさん
垢版 |
2019/12/12(木) 22:37:04.02ID:hmkgwwLY
仮に、ノードにSTLのリストやベクターを持たせて子ノードを格納すると、別の部分木のイテレータが互換性を持たなくなる。
これはちょっとまずい。
ある部分木の途中からある部分木の途中までを注目することはよくあるから。
819デフォルトの名無しさん
垢版 |
2019/12/12(木) 22:45:48.06ID:hmkgwwLY
ノードの物理量が必ず同じであることを利用すれば、データ構造ヒープを木として使うのが良いんだろか。
これなら、メモリーの確保はSTLのベクターが使え、木全体でイテレータが互換性を持てる。
820デフォルトの名無しさん
垢版 |
2019/12/12(木) 22:52:26.39ID:hmkgwwLY
考えれば考えるほど、ノードに子ノード格納用のSTLコンテナを持たせるのは現実味がなく思える。
821デフォルトの名無しさん
垢版 |
2019/12/12(木) 22:59:41.49ID:hmkgwwLY
つまり、型安全はプログラムの健全性を担保するものではなく、C++は型安全とは言えないって事で良いのでは。
2019/12/12(木) 23:02:50.75ID:+RpJiFi7
jsてのは女子小学生の意味か?
823デフォルトの名無しさん
垢版 |
2019/12/12(木) 23:04:10.87ID:hmkgwwLY
型が無いと僕たちには辛すぎるよね。
ミスを発見してくれないから。
2019/12/12(木) 23:36:51.22ID:Rc7qy7fw
型はまあ重要だけど型ガーばっか言ってる奴は揃ってバカだよな。
825デフォルトの名無しさん
垢版 |
2019/12/13(金) 00:21:19.32ID:0IHjBlJG
型が無いとinsertがinsert_from_intとかinsert_from_stringとか別々にしないといけなくなって、色々大変そう。
呼び出し側が責任を持つということになるのかも。
826デフォルトの名無しさん
垢版 |
2019/12/13(金) 00:22:24.50ID:0IHjBlJG
型演算をコンパイラに任せることが出来なくなって、すべてプログラミングしないといけなくなるのかな。
2019/12/13(金) 06:47:47.05ID:6WB0hlYg
>>824
むしろ(静的)型なんて俺には不要だぜ、ベイビーって奴の方がアホっぽいけどなw

>>825-826
静的型付け 動的型付け
あたりでググってこい
828デフォルトの名無しさん
垢版 |
2019/12/13(金) 07:17:35.68ID:0IHjBlJG
機械語は変数に型がない。
命令で型を使い分ける。
その大変さを考えると型欲しいってなるのかも。
2019/12/13(金) 07:24:37.08ID:Ry/2QtNy
まさにBがCに進化するときの考え方だね
2019/12/13(金) 09:49:21.00ID:wVkcEFxk
>>825
ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
用意して使うと言う発想はスクリプト言語的な発想。
そのようにした場合、コンパイラが厳密にどの関数を使うかが人間には
分からない事が多いので安全性を損なう場合が多い。
スクリプト言語は RAD言語なのため、できるだけ短い関数名で対処しようと
するが、それが思わぬ間違いを含みがち。
C言語が好かれているのは、どういう処理がされるかが人間が完全予測できる
ことで、「大体の動作」は好まれない。
2019/12/13(金) 09:53:03.46ID:wVkcEFxk
>>826
型の違いでコードを自動変化させるという思想は、C++の中でも非常に最近に
なって STL (template) で流行りだしたもの。
もともとC言語に型が導入されたのは、プログラマのミスをコンパイラが発見して
エラーを出してくれるようにするためだった。C言語には関数の多態性(overload)
がない。なお、override と overload は別の概念なので、知らない人は検索して
欲しい。
832デフォルトの名無しさん
垢版 |
2019/12/13(金) 09:53:50.44ID:0IHjBlJG
イネーブラ使えば良いのでは。
833デフォルトの名無しさん
垢版 |
2019/12/13(金) 10:00:20.89ID:0IHjBlJG
コンセプトコイコイって感じなのかな。
2019/12/13(金) 11:27:07.79ID:WVlIRY9+
#pragma omp parallel forで
自動分割され、各スレッドに割り当てられた
ループの開始点と終了点を取得することできませんか?
2019/12/13(金) 18:09:24.89ID:e6j7CnOm
>C言語には関数の多態性(overload)がない

さらりと嘘をつくやつがおるな
2019/12/13(金) 18:27:30.70ID:fi1/rC5j
今UE4と組み込み以外でc++の仕事あります?
2019/12/13(金) 18:33:53.16ID:xTSwswyu
オーバーロードあるか?
ディスパッチの方法はいろいろあると思うが
2019/12/13(金) 18:55:58.62ID:ftjAwgQI
>>836
USのマイクロソフトに行け
2019/12/13(金) 19:01:03.38ID:ysGzQi5M
>>830
> ただし、実引数の型が違うのに仮引数の違いだけの同じ関数名の関数を複数
> 用意して使うと言う発想はスクリプト言語的な発想。

え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
「同じ関数名の関数を複数用意」できるのは静的型付け言語の特徴だよ
2019/12/13(金) 19:52:22.32ID:6WB0hlYg
>>839
> え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
関数は無理だがメソッドでいいならPowerShell
2019/12/13(金) 20:00:57.46ID:ysGzQi5M
PowrShell は型付言語ですからね。
それぐらいでしょ?
2019/12/13(金) 20:54:52.57ID:1q9LzdDI
用語としてメソッドと言ってるものでよければ Common Lisp もそうじゃね?
2019/12/13(金) 21:07:31.92ID:KHLl2/ku
>>841
うん、1つあれば
> え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
の反例になるからね
2019/12/13(金) 21:09:15.79ID:wKYhuojH
>>843
そしたら、一つぐらいしか無いって俺は意見を訂正するだけなんだが、

お前も同じ関数名の関数を複数用意できるのはスクリプト言語では
PowerShellだけだって訂正するって話でいいの?
2019/12/13(金) 21:13:12.55ID:gmdEaqRD
それでいいんじゃないの
2019/12/13(金) 21:23:18.13ID:T1rtAOWF
質問です
template <typename T>
constexpr inline T value;
template <typename T>
constexpr inline T value = (T)0;
こうやって変数テンプレートの宣言と初期化を分離すると
VC、clang(Xcode付属)ではエラーになるんですがwandboxで試すとエラーになりません
本来どっちの動作が正しいんでしょうか?
2019/12/13(金) 21:37:57.11ID:KHLl2/ku
>>844
別にそれでいいよ
> え?スクリプト言語で「同じ関数名の関数を複数用意」できる言語なんて無いでしょ?
が無知からの発言と認めてもらえればいいだけだしw
848デフォルトの名無しさん
垢版 |
2019/12/13(金) 22:26:34.23ID:0IHjBlJG
>>846
これも通ってしまった。
#include <iostream>

template <typename T>
constexpr T value = 1;

template <typename T>
constexpr T value = 2;

template <typename T>
constexpr T value = 3;

template <typename T>
constexpr T value = 4;

template <typename T>
constexpr T value = 5;

template <typename T>
constexpr T value = 6;

int main()
{
std::cout << value<int> << std::endl;
}
849デフォルトの名無しさん
垢版 |
2019/12/13(金) 22:27:26.74ID:0IHjBlJG
実行結果。

Start
6
0
Finish

最後の定義が有効になってるように見える。
850デフォルトの名無しさん
垢版 |
2019/12/13(金) 22:28:16.14ID:0IHjBlJG
Wandbox
C++
gcc HEAD 10.0.0 2019
2019/12/13(金) 22:54:36.18ID:T1rtAOWF
ありがとうございます、その結果を見るとgccがおかしいぽいですね・・・
宣言時に初期化は必須と考えて書いていこうと思います、ありがとうございました
852デフォルトの名無しさん
垢版 |
2019/12/13(金) 22:57:06.09ID:0IHjBlJG
僕もちょっとわからないんだけど。
2019/12/14(土) 00:21:27.14ID:stptR0oK
>>836
デスクトップアプリ
2019/12/14(土) 07:31:10.87ID:SZLGcxYz
>>846
診断メッセージをよく見ろよ
> error C2737: 'value': 'constexpr' オブジェクトは初期化する必要があります。

そもそも分離できないんだよ
いいか、constexprは翻訳時定数だぞ
それを翻訳段階9まで未解決のままにできると思うか?
2019/12/14(土) 08:56:55.09ID:fBoJLlft
>>854
なんでできるようにしないの?
そっちの方がおかしくね?
2019/12/14(土) 09:02:00.44ID:SZLGcxYz
なんでという理由も述べたはずだが
2019/12/14(土) 09:53:01.66ID:fBoJLlft
>>856
だからそれを可能にするようにしてくれ
2019/12/14(土) 10:02:03.90ID:SZLGcxYz
ん? 俺は江添じゃねえぞ
奴なら標準会員だから言ってみるのもいいが
2019/12/14(土) 10:02:27.48ID:SZLGcxYz
- 標準会員
+ 標準化委員
2019/12/14(土) 10:08:29.00ID:yV/FURvf
江添本ダメ絶対
2019/12/14(土) 10:30:50.58ID:stptR0oK
江添でもできない
862846
垢版 |
2019/12/14(土) 10:35:10.86ID:QUVSvjZy
>>854
>診断メッセージをよく見ろよ
見た上で言ってます(つまりgccまたはVC, clangのバグではないかということ

>いいか、constexprは翻訳時定数だぞ
それ以前にテンプレートなんですが
863デフォルトの名無しさん
垢版 |
2019/12/14(土) 12:26:05.30ID:m0rD8Ode
ローマ法王は根競べで決めるらしいですよ奥さん。
2019/12/14(土) 12:26:49.81ID:gw9aL+td
誰でも閲覧できる規格ドラフト見ればすぐにわかることをこんな掃きだめで聞いても
2019/12/14(土) 12:35:13.30ID:SZLGcxYz
>>862
なんかとんがってんな

コンパイラのバグとまで言う根拠は何だ?
相場では規格票の条文だが

テンプレートなのは見ればわかるさ
だから何なのか説明をやめないでくれ
2019/12/14(土) 12:50:37.99ID:gw9aL+td
>相場では規格票の条文

通産省の癖の抜けない老人はご退場いただきたい
867デフォルトの名無しさん
垢版 |
2019/12/14(土) 12:58:43.25ID:m0rD8Ode
これODRの緩和と関係あるんですかね?
2019/12/14(土) 13:34:08.27ID:T/HCOnVQ
>>772
>x86系CPUで普通のメモリへの読み書きで順番が入れ替わる可能性があるのは write => read だけ
別に。
コアAの読み書きをコアA自身が見る分にはそうかもわからんが
コアAの読み書きを異なるコアBから見たらwrite同士やread同士でも順番が入れ替わり得る
(アウトオブオーダー実行の影響で

安全に動かすには適切にメモリバリアで順序化する必要がある
2019/12/14(土) 13:37:18.74ID:JwYnIOEa
>>868
read ==> read
read ==> write
は入れ替わらない
2019/12/14(土) 13:37:51.96ID:T/HCOnVQ
といってもロックレス何ちゃらぐらいの制御であればInterlockedCompareExchange()で済むから
スレッド間の通信なら普通メモリバリアとか直接触る必要は無いが
2019/12/14(土) 13:38:24.93ID:T/HCOnVQ
>>869
迷信
2019/12/14(土) 13:39:11.91ID:JwYnIOEa
ソースは?
2019/12/14(土) 13:39:40.59ID:T/HCOnVQ
リードキューやコマンドキューにコマンドが入るのはアウトオブオーダープロセスの事後であるため
そのような保証は無い
2019/12/14(土) 13:41:05.07ID:JwYnIOEa
それのソース
2019/12/14(土) 13:44:15.66ID:JwYnIOEa
https://github.com/herumi/misc/blob/master/cpp/fence.md
2019/12/14(土) 14:15:12.84ID:JwYnIOEa
x86系は
シングルコアのマルチスレッドアプリ
の多くがそのまま動くように出来てる

シングルコア時代が長かったから
2019/12/14(土) 14:55:10.15ID:QUVSvjZy
>>865
>テンプレートなのは見ればわかるさ
>だから何なのか
普通に考えて、実体化がまだなのに定義(初期化)を強制される妥当な理由はない、ということ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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