[過去ログ] 【初心者歓迎】C/C++室 Ver.106【環境依存OK】 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
696
(1): はちみつ餃子 ◆8X2XSCHEME 2021/06/14(月)17:56 ID:fvxG9/iR(1) AAS
>>694
C/C++ の理屈では波括弧の部分は繰り返しの構文 (do や while) の一部ではない。
たとえば while の文法は
while ( expression ) statement
というように定義されていて、 statement ってのは要するに文をひとつ書けるってことね。
で、 statement として複文 (波括弧によって複数の文をひとつにまとめたブロック) もありうるってことになってる。
そんでもってブロックの先頭で宣言された変数のスコープに関するルールはブロックのほうに書かれていて、
繰り返しの構文のときだけ特別扱いということは出来んのだわ。

> while(int a=...){...} ←これだけはOK?

これは C++ では良いけど C では駄目
697: 2021/06/14(月)18:58 ID:HtMoZ8Hn(1) AAS
小さいスコープの中だけで使う自動変数だってんで
特に if や for 等なく いきなりカラス括弧開いて変数宣言することがままある
698: 2021/06/14(月)21:48 ID:OzvaLd6A(1) AAS
C++ってOSレイヤで差異が有るファイルシステムの事を考慮せずにプログラムを書ける済む仕組みって組み込まれてるの?
699: 2021/06/14(月)21:53 ID:VOy4fGQR(1) AAS
標準ライブラリに含まれるファイルシステムライブラリでできる範囲の操作なら差異は出にくいと思うけど
700
(1): 2021/06/14(月)22:00 ID:eQ9/Z+Eb(1) AAS
>>694,696
C++でもwhileの判定式中の宣言は毎回新しくなるんで、使いみち思いつかん。
while(int i=10) { i--; } は、無限ループになる。

できるとしたら、処理が終わったらすぐに始末したいobjに対して、
{ myclass obj(); while(obj) { obj.some_op(); } }
(obj は operator bool() とか実装してる前提)
が、
while(auto obj = myclass()) { obj.some_op(); }
こんな風にかけてちょっと{}がスッキリするくらい?(実際はobjが毎度構築される)
701: 2021/06/14(月)23:04 ID:wv1U8ajF(1) AAS
カラス括弧!
初めて見た!
702: 2021/06/15(火)08:13 ID:4rRZmg7L(1) AAS
>>700
まあ while(...){} は for(; ...;){} で書けるしメリットないかな
ただ
do{ int a = …; }while(a); の方は書けたら嬉しいな
使用頻度は低いけど
703: 2021/06/15(火)10:57 ID:5dh+WKsO(1) AAS
do は do .. while(0) のパターンしか使わないな。
704: 2021/06/17(木)23:23 ID:Gx3mnqFH(1) AAS
break用なら switch(0)default:{...} っしょ?
705: 2021/06/18(金)08:43 ID:R4m5mk7U(1/2) AAS
それdoよりどういうメリットある?
わざわざdefault:書かないとならないしインデント深くなりそうだし。
706
(1): 2021/06/18(金)11:21 ID:FZUuAAIq(1) AAS
マクロで展開するならインデントは無視できる
707: 2021/06/18(金)11:50 ID:7Huy+AZL(1/2) AAS
do{}while(0) は最後に ; 書く前提だし矛盾ないけど
switch(0)default:{...} は ; の扱いの困らない?
708: 2021/06/18(金)11:55 ID:AVf6Ht59(1) AAS
for (int i = 0; i < 1; i++)
709: 2021/06/18(金)12:32 ID:6AzE04jr(1) AAS
{ } 内スコープからの脱出で break; 使いたいってのと
マクロで見た目関数向けな #define foo(arg) do { なんちゃらかんちゃら } while(0)

do { } while(0) は両立できるけど switch(0)default:{} で後者は怪しげ

if (<condition>) foo(arg); else <elsecase>; とかが
710
(1): 2021/06/18(金)13:25 ID:7Huy+AZL(2/2) AAS
while(1){
...
break; // } の直前
}
で良いと思う
711: 2021/06/18(金)14:27 ID:tn5JYHw4(1) AAS
それどういう意図があんの?
処理は結局1回
スコープだけじゃダメなん?
712: 2021/06/18(金)14:44 ID:tzOvIsZE(1) AAS
>>710
お前が良いと思うなら使えばいいと思うが俺には無駄なbreakが必要なのはダサいと思うから do { ... } while(0); にするわ
713: 2021/06/18(金)20:29 ID:R4m5mk7U(2/2) AAS
>>706
マクロはフォーマッタでの扱いが定まらんから制御構造では使いたくないのよな。
セミコロンで終端しておかないとインデントがおかしくなるとか、後続に開きブレースを置くと
やっぱりインデントが変になるとか。
714: 2021/06/19(土)12:53 ID:EDF+B3Dq(1) AAS
#define breakblock switch(0)defalut:
でいいやん
できないとか怪しげとか意味不明
マクロ化する必然性がそもそもわかんないけど
715: 2021/06/19(土)13:08 ID:AhXAE8oj(1/2) AAS
そこまでして switch(0) 使う理由がよくわからん。
do while(0) と比べてどういうところが良いの?
716: 2021/06/19(土)13:21 ID:ylfkd6bV(1) AAS
マクロの例でもわかるように波括弧を単独で使える
変な処理が始まってんの一目瞭然
continueもgotoで(goto使わない別ルーチン探せよw

#define breakblock(a) uniqelonglongprefix##a:switch(0)default:
#define bbcontinue(a) goto uniqlonglongprefix##a
717: 2021/06/19(土)14:04 ID:AhXAE8oj(2/2) AAS
>マクロの例でもわかるように波括弧を単独で使える

ようは末尾に while(0); を書かなきゃならないのが嫌ってことかな。
わからんでもないが、自分はマクロや default: より気にならないからいいや。
718: 2021/06/19(土)16:30 ID:8gjebq3e(1) AAS
#define foo(arg) switch(0)default:{ なんとかかんとか }

これはキモイ
719: 2021/06/20(日)18:26 ID:3hmKhJNO(1) AAS
でもその構文はdefineで置き換え前提で使ってるとしか思えない
720: 2021/06/20(日)19:15 ID:XoXh1cqB(1) AAS
goto書くと死んじゃう人は大変だなぁ
Dijkstraもそこまでは言ってないらしいぞ
721: 2021/06/20(日)22:56 ID:R7oo70Ox(1) AAS
ナンチャラカンチャラの人のdefine使用意図が無意味すぎてどうもc言語エアプなんじゃないかと疑う
722: 2021/06/21(月)16:42 ID:iJjBc6fp(1) AAS
switchのやつは最後にbreakかfall throughってコメント書いとかないと文句言うチェッカとかありそう
723: 2021/06/29(火)11:07 ID:HA4DrIsJ(1) AAS
do {
int a;
:
} while(a);



for(int a;;) {
:
if(!a) break;
}

でいいんじゃない?
724
(4): 2021/07/05(月)16:13 ID:3/iVgePD(1) AAS
別のところで質問したのですが、初心者歓迎スレのほうがいいと思いこちらで質問し直します。

Macのclang++でコンパイルしています。
cstdlibをインクルードしなくてもrand()が使えてしまうのですが、これはなぜでしょうか?
725
(1): 2021/07/06(火)01:49 ID:w3zU8vH7(1) AAS
>>724
手元のM1のでやったら普通にエラーになるけど?
printf("%d",rand());
だけ書いたやつ。

clangでもデフォはエラーだったような。C言語の方はコンパイルオプションで通せる。暗黙の関数宣言。

すまん、役に立てなくて。
726
(1): はちみつ餃子 ◆8X2XSCHEME 2021/07/06(火)05:58 ID:kwaneL8R(1/2) AAS
>>724
ヘッダファイルが他のヘッダファイルを内部で include している場合は有りうる。
たとえば iostream を include したら自動的に ios や istream なども include されることは保証された動作。
ただ、 cstdlib を (間接的に) include すると仕様で明言している標準ヘッダはないと思うので
rand がどこかで勝手に宣言されているのだとしたら処理系の固有の動作だと思う。

-M オプションで (間接的に include されているものも含めて) 依存関係があるヘッダファイルを
抽出できるからそれで確認できるよ。
727
(1): 724 2021/07/06(火)08:23 ID:9fUGxcs8(1) AAS
>>725
ありがとうございます。M1のclangではエラーが返るのですか…。コンパイラのバージョンの問題ですかね?
>>726
ありがとうございます。-M試してみました。
インクルードはiostreamだけにしていたのですが、ぞろぞろヘッダーファイル出てきまして、その中にcstdlibもstdlib.hもありました。
iostreamのインクルードを外すと当たり前でしょうが、それらのヘッダーファイルは表示されなくなりました。
つまり、iostream以下のヘッダファイルの依存関係にcstdlibがいたということですよね?
これは処理系依存なのでしょうか?
728
(1): はちみつ餃子 ◆8X2XSCHEME 2021/07/06(火)08:56 ID:kwaneL8R(2/2) AAS
>>727
処理系依存だと思う。
iostream が暗黙に include すると仕様に明記しているのは
ios, streambuf, istream, ostream の 4 つ。
外部リンク:timsong-cpp.github.io

あえていうなら cstdio の機能と結び付けるのが役割であるようにほのめかされている
ので普通の実装なら cstdio も include することになると考えてもいいと思うけど、
それ以上のことについてはっきりしたことは書かれてない。

rand が必要なら (たとえ実態として間接的に cstdlib が include されていても)
プログラマは明示的に cstdlib を include するほうがいい。
省1
729: 724 2021/07/07(水)08:49 ID:O+5oUfAp(1) AAS
>>728
なるほど、そもそも論まで含めてよくわかりました!
ありがとうございました!
730
(3): 2021/07/09(金)19:37 ID:We+HIKc2(1) AAS
C言語にpthreadを使ってマルチスレッドにするときの初歩的な質問をしたいのですが、
大域変数を複数のスレッドが読み書きする部分はミューテックスでロックしないとマズい、という
説明はわかった気がします。
では読むだけの部分はどうでしょうか。単にスレッドが変数の値を読みに行った瞬間の値を
知りたいだけならば、別にロックはしなくても害はないような気もしますが.... プログラム内の
別の箇所で書き込む部分はロックして、おかしなことが起こらないようにするとして。
それとも読むだけの場合もロック(書き込む場合に使うじミューテックスでロック)は必要でしょうか。
731: 2021/07/09(金)19:46 ID:TIX9j1Dy(1) AAS
必要ないぞ
732: 2021/07/09(金)21:27 ID:wrMb4YqN(1) AAS
必要だぞ
733
(2): 2021/07/09(金)21:31 ID:RRTM5Oms(1) AAS
>>730
スレッド実行中に書き換わる可能性があるなら必要。
変数を読むといってもCPUは一度内部のレジスタに読み込まないと処理できないので、
スレッド1でレジスタに読み込む→スレッド2で変数を書き換える→スレッド1に結果が反映されない
という事態が発生する可能性がある。
734
(1): 2021/07/09(金)22:32 ID:eGF9BJZ0(1) AAS
>>733
それ反映する必要ないだろ
単にスレッド1が先に読んだだけだし
それより読み書きがアトミックでないなら読み出し時にも排他しないと書き換え中の変な値を読んじゃうかと
735: 2021/07/10(土)01:06 ID:iVyIfxP9(1) AAS
書き換え後に古い値を取得してもええの?
736: 2021/07/10(土)04:35 ID:jD2ZKaD3(1) AAS
ええ場合もある
「単にスレッドが変数の値を読みに行った瞬間の値を知りたいだけ」はそれでええ場合のように聞こえるな
737: 2021/07/10(土)05:28 ID:TJHT9gxK(1/2) AAS
ええ場合も何も読んだ後で書き換えられたのをどうやって反映させるつもりなんだよ…
738: 2021/07/10(土)05:33 ID:Tru2G6zE(1) AAS
関連する操作すべてを優先順付きキュー経由にし
巻き戻し必要な操作にはジャーナル機能も入れ
やり直し再キューすんのよ
739
(1): 2021/07/10(土)05:36 ID:N1Z7WBqy(1) AAS
別スレッドからflgをいじって停止できるように

while (flg) {...}

と書いても、{...}の内部でflgをいじってないなら、
最適化で単なる無限ループに書き換えられて、flg変えても止まらない、
みたいな話なかったっけ。
740: 2021/07/10(土)06:47 ID:TJHT9gxK(2/2) AAS
>>739
それはまた違う話
volatile c言語 とかでぐぐれ
741
(1): 2021/07/10(土)07:11 ID:JKFXuD7+(1) AAS
スレッドAが 16bit長の整数を書き換える
スレッドBが 同じ16bit長の整数を読み込もうとしたとき
8bit長でしかアトミックな操作が保証されてないシステムだと

初期状態 0x0000 で スレッドA が 0xFFFF と書き換える

 A書き込み 上位FF
  (スイッチ)
B読み込み 上位FF
B読み込み 下位00
  (スイッチ)
 A書き込み 下位FF
省1
742
(2): 2021/07/10(土)08:27 ID:N9R+gZBb(1/2) AAS
>>734
いや、先に読んだだけっていっても、例えば
i f (v==1)
みたいな条件式を評価した段階では1だったけど、その先で急に2に変わった、とかだったらまずいだろw
743: 2021/07/10(土)08:34 ID:EesV0O7a(1) AAS
質問者の文言が

>単にスレッドが変数の値を読みに行った瞬間の値を知りたいだけ

>読みに行った瞬間の値を知りたいだけ

なので必要なし
以上
744
(1): 2021/07/10(土)08:39 ID:fOJ6OsHP(1/2) AAS
>>742
何もまずくないだろ…
745
(2): 2021/07/10(土)08:48 ID:N9R+gZBb(2/2) AAS
>>744
ifの中ではもう一度vの値を読んだときには2になってたりするわけよ
vが1の前提で書いたコードの中に2を突っ込んだらまずいよ
746: 2021/07/10(土)09:11 ID:16vz6VAu(1) AAS
>もう一度vの値を読んだとき

まずいのはこっちであって>>742のifや>>733自体は問題ないんでは。
747: 2021/07/10(土)09:15 ID:nctQkkF+(1) AAS
質問者が言ってないことに加えて勝手に仮定を追加してまずいとか言ってる>>745はもう黙ってほしい
748: 2021/07/10(土)09:51 ID:6bm+w6Lu(1) AAS
まずいのは>>745の頭だったというオチw
749
(4): はちみつ餃子 ◆8X2XSCHEME 2021/07/10(土)09:56 ID:11oc3t46(1) AAS
>>730
結論から言うとロックは必要。
同一のメモリに対するアクセスの少なくとも一方が書き込みである場合には衝突すると定義されている。
外部リンク:timsong-cpp.github.io
その場合にはデータ競合が発生する。
外部リンク:timsong-cpp.github.io

同時に起こりうるアクセスの内でひとつでも書き込みが存在したらそれはデータ競合の可能性があるってこと。

ミューテックスはミューテックスの所有権を取り合うことで競合を阻止する仕組み。
ロックというのは「ミューテックスをロックする (ロックしている間は自分がミューテックスの所有権を持っている)」
ということであって、対象となるデータそのもののアクセスを直接的に制御してるわけじゃないので、
省1
750: 2021/07/10(土)10:17 ID:fOJ6OsHP(2/2) AAS
>>749
at least one of which is not atomic
の意味ぐらいは理解してからレスしなよ
751: 2021/07/12(月)08:43 ID:Y3qBMERg(1) AAS
>>749
質問者は衝突しても問題ないケースで排他は必要かどうかを聞きたいんだろ
752: 2021/07/12(月)12:14 ID:uJpO0uZ2(1) AAS
「衝突しても問題ない」&atomicも使わない=「データ競合となっても問題ない」=「動作が未定義でも問題ない」なら
確かにロックは不要だけど。
753
(1): 730 2021/07/12(月)15:19 ID:VxiBn2TN(1) AAS
730です、どうもお騒がさせしております。
どうやら読み出しだけのときも基本的にはミューテックスを使うべきのようですね。

私の場合は域変数をカウンタとして使っていてその値をログ出力する、というような状況で、
なんとなくミューテックなしでもいいかと思ったのですが、ミューテックスを使わない場合は
気持ち悪い値がプリントされている感じですかね。
一般的な状況では、ミューテックスを使わなくても実害がないかを考えるよりはちゃんと
ミューテックスを使った方がよさそうですね...
754: 2021/07/13(火)17:41 ID:DZW75fJj(1) AAS
「今値を書いてるから 書き終わるまで待て」と待たす相手は
次にそこへ書き込むヤツだけじゃなく
そこを読込もうとしたヤツも対象にしとけば ちゃんと書き終わった値が読込める
中途半端に書いてる最中であっても意図的に抜き出したいのなら 書き終わるまで待たずに読む

そしてみゅーてっくすの激しい握り合い
755
(7): 2021/07/13(火)19:15 ID:Cs3wNevb(1/4) AAS
>>753
単純なカウンタみたいなアトミックに読み書きできるような変数なら排他は不要だよ
756
(3): 2021/07/13(火)20:10 ID:+UxqO86S(1/2) AAS
>>755 なんでそんな嘘を教えようとするの?
757
(1): 2021/07/13(火)20:55 ID:Cs3wNevb(2/4) AAS
>>756
>>749のリンク先読めばわかると思うけど競合が発生して結果が未定義になるのは
> at least one of which is not atomic
のケースね
758
(1): 2021/07/13(火)21:33 ID:+UxqO86S(2/2) AAS
>>757
そこで言ってる "atomic" の意味は std::atomic<int> ならOKで int はダメという話なんだけど、
「単純なカウンタみたいなアトミックに読み書きできるような変数」って言い換えちゃったらどっちもOKに読めちゃうでしょ。
759
(1): 2021/07/13(火)21:39 ID:Cs3wNevb(3/4) AAS
>>758
intがダメなのは>>741みたいなケースね
> 「単純なカウンタみたいなアトミックに読み書きできるような変数」
でだめだと言うなら実例教えて
760
(1): 2021/07/13(火)22:40 ID:31Jksjnm(1/2) AAS
単純なカウンタがアトミックに読み書きできるかは
基本型の宣言だけではわからんから
アトミック化の指示ができるならやっとけ ということでいいんでないの?
761: 2021/07/13(火)22:49 ID:Cs3wNevb(4/4) AAS
>>760
そのスタンスでいいと思うよ
俺はアトミックに読み書きできるケースなのに嘘とか言ってる>>756がなんか特殊なケースを知ってるのかな?って思ってるだけ
762: 2021/07/13(火)23:59 ID:31Jksjnm(2/2) AAS
指示ができない場合にはアトミックに操作できる保証なんてないから
排他したほうがいいぜって立場
763: 2021/07/14(水)00:44 ID:pCGEFvrX(1/6) AAS
>>759
生の int に複数スレッドから排他なしでアクセスしてたらその時点で未定義動作=ダメなんだってば。
未定義動作となる場合に必ず期待に反するコードが生成されるわけでもないんで、実例を出せというのも意味が無い。
(実例が無いからといって「敢えて」未定義動作に誘導するというのは意味が無いどころか有害。)

・・・スレッドサニタイザで引っかかってウザい、とか言えば「実例」として納得してくれるの?
764
(2): 2021/07/14(水)01:04 ID:b90ql0x3(1) AAS
生のintへのアクセスがアトミックに行えるかって処理系が保証したりしないのけ
765: 2021/07/14(水)05:39 ID:dtsN+T48(1) AAS
外部リンク:stackoverflow.com
766
(3): 2021/07/14(水)06:51 ID:3FmZNcD6(1) AAS
>>764
保証してる処理系なら std::atomic<int> でオーバーヘッドは生じない、つまり排他は要らんってことでしょ
>>756がなんか実例知ってるかと思ってたけど単なる規格厨だったなw
767
(2): 2021/07/14(水)12:49 ID:pCGEFvrX(2/6) AAS
>>766
オーバーヘッドが生じるかどうかで考えてるなら(それもおかしいんだけど)、こんな例を見れば考えを改めてくれたりするの?
外部リンク:godbolt.org
#include <atomic>
int load(std::atomic<int> const& x) { return x; }
int load(int const& x) { return x; }

↓ARM64 gcc 11.1 -O2
load(std::atomic<int> const&):
&nbsp; ldar w0, [x0]
&nbsp; ret
省3
768
(1): 2021/07/14(水)18:54 ID:VBWUb4q7(1/2) AAS
>>767
それメモリーバリアの話で排他の話じゃないけど、何を言いたいの?w
769
(3): 2021/07/14(水)19:20 ID:pCGEFvrX(3/6) AAS
>>768
766 が「オーバーヘッドは生じない」ならば「排他は要らん」という論理らしいので
「オーバーヘッドは生じない」を否定すれば「排他は要らん」とかいう嘘を言わなくなってくれるかなと思って書いてみた。
オーバヘッドの発生と排他の要・不要とが 766 の頭の中でどう繋がってるのかは知らない。
770
(1): 2021/07/14(水)19:25 ID:VBWUb4q7(2/2) AAS
>>769
まあメモリーバリアも一種のオーバーヘッドと言えなくもないがそういう話でないことぐらいはわかりそうなもんだけどねw
で、排他が必要な例は見つかったの?
771
(1): 2021/07/14(水)20:14 ID:pCGEFvrX(4/6) AAS
>>770
ごめんよ。元から意味が分からなかったところ「オーバーヘッド」の意味が何か文字通りの意味じゃなかった
みたいだし、もうどういう話なのかさっぱりだわ。
767 の「オーバーヘッド」が何を指すのか、それと排他の要・不要との繋がりがわかるようだったら解説よろしく。

「排他が必要な例」と言われても、こっちとしては複数スレッドで生の int を読み書きするなら
常に排他が必要という認識なんで文字通り「排他が必要な例」なら無数にあるんだよね。
そういうのを挙げても謎理論で「不要だろ」とか「コレジャナイ」って言うだけで話は進まなさそう。

ここまでの流れを読めば >>755 をうっかり信じちゃう人もいないだろうし、もう放置でいいかなという気になってる。
772
(1): 2021/07/14(水)20:22 ID:cMMfM4oH(1/2) AAS
>>771
あえて指摘しなかったけどstd::atomicでは既定のメモリーオーダーがseq_cstであることを知らんのか?
自分で「あんたの言うオーバーヘッド」かかる書き方してオーバーヘッドかかるから排他ガーとか意味不明なんですけど?w
そもそもstd::atomicは必ず排他かかるわけでもないし人を嘘つき呼ばわりするならもう少し勉強した方が恥をかかなくて済むと思うよ
773
(1): 2021/07/14(水)20:35 ID:pCGEFvrX(5/6) AAS
>>772
ごめんそれは知ってるよ。でもそれを知ってる知識レベルの人が >755 のような主張をしてるとは思わなかったんだ。
あと繰り返しだけど「オーバーヘッドかかるから排他ガー」とか言ってるのは >766 だけね。意味不明なのには同意する。
「std::atomicは必ず排他かかるわけでもない」は正しいけど、それと >755 が嘘であることに関係は無い。
774
(1): 2021/07/14(水)22:17 ID:cMMfM4oH(2/2) AAS
>>773
> ごめんそれは知ってるよ。
えっ?
知ってて>>767ってそれこそ意味不明なんですけどw
結局何を言いたかったの?

> あと繰り返しだけど「オーバーヘッドかかるから排他ガー」とか言ってるのは >766 だけね。
ああマジで日本語の理解力がないのね
(もちろん環境によるけど)std::atomic使っても生のintと同じようにアクセスできる = 排他なんてしてない
って話ね
念の為に言っておくけど>>764が言うようなハード上の排他制御は別の話ね
省5
775
(2): 2021/07/14(水)23:08 ID:pCGEFvrX(6/6) AAS
>>774
「767を書いた意味」なら>>769で説明した。

「環境によるけど)std::atomic使っても生のintと同じようにアクセスできる = 排他なんてしてない」これは正しい。
でもそれは生の int でデータ競合を避けられる理由にはならない。
>>755 が嘘だという根拠は >>749 に挙げられた規定による。その条件
"at least one of which is not atomic" について、生の int へのアクセスは
"not atomic" に該当するから排他なしのアクセスでは未定義動作となりダメだと言っている。
規格文面の "atomic" は、規格が規定する C++ 抽象機械上の概念という認識。

対して 755 は、規格文面の "atomic" は各処理系でのメモリアクセスが実際にアトミックかどうかに依ると考えてそう。
残念ながら規格の文面で明確にその解釈を否定できないんだけど (外部リンク:cplusplus.github.io
省2
776
(1): 2021/07/15(木)05:14 ID:oWQENBCT(1/3) AAS
>>775
> 「767を書いた意味」なら>>769で説明した。
あああのメモリーバリアと排他の区別もついてないアホ丸出しの説明ねw

> 少なくとも現メモリモデル策定当時から Web 上に積み上げられている多くの記事(標準化委員会の↑含む)や
> 現行コンパイラ(最適化、スレッドサニタイザなど)での扱いと合致しない。
百歩譲ってstd::atomic使えと言うのはいいけど、排他は必須じゃないだろ
777
(1): 2021/07/15(木)06:52 ID:DRiXJTFv(1) AAS
charはatomicなの?規格にどれがatomicだってあるの?
どれがatomicかなんて、CPU毎に違って当然だと思ってたわ
778: 2021/07/15(木)07:50 ID:oWQENBCT(2/3) AAS
>>777
CPU毎と言うかシステム毎に違うだろ
779: 2021/07/15(木)08:52 ID:JIUDKEB4(1) AAS
>>776
うん。データ競合を回避するにあたって std::atomic を使えば排他は必須じゃなくなるよ。
ミューテックスを使うなどの排他(順序付け)でも回避できて、どっちかでもいいし両方でもいい。

>>755 が嘘だという点には異論なくなったみたいだね。よかったよかった。
780: 2021/07/15(木)09:20 ID:oWQENBCT(3/3) AAS
>>775
排他は要らんケースがあると言うだけの話
ちなみに>>755では生intなんて一言も書いてないけどね
std::atomic<int>でも多くの環境では
> 単純なカウンタみたいなアトミックに読み書きできるような変数になるしな

まあ結局規格ガーって言うしかないレベルの低い規格厨が関係のないメモリーバリアーとか出してきて恥を晒しただけだったなw
781: 2021/07/15(木)10:06 ID:ux6gJq+a(1) AAS
お前ら暇すぎやろ
782
(2): 2021/07/30(金)19:50 ID:VEABT8DF(1) AAS
C++ のバイナリ互換性についてお聞きしたいのですが。C++ のライブラリの中に以下のようなものが
あったとします。
class A { char *p1; };
class B { /* 略 */ };
class C { A a; B b; };

で、class A に新たな要素を追加して
class A { char *p1; char *p2; };
としてからライブラリを再ビルドし、以前のアプリのバイナリと混在させると、class C 内で a のサイズ
が変わる結果 b へのオフセットが変わりクラッシュするようです。

そこでふと思ったのですが、class A に最初から
省3
783: 2021/07/30(金)19:57 ID:SwFfvD28(1) AAS
pimpl使え
784: 2021/07/30(金)21:01 ID:y9Kee4rz(1) AAS
>>782
素直にC.aやC.bをポインタにすりゃいいだけちゃう?
785: まあ俺が言うのもなんだがw 2021/07/31(土)22:17 ID:m7lSxL/B(1) AAS
>>782
クラス定義が変わったのにそれを使う一部のコードを再ビルドしないってこと?

> そこでふと思ったのですが
> (中略)
> アリでしょうか? (b へアクセスするときのクラッシュを防げるでしょうか?)
ありかも知れんが、なんでそんな前近代的なやり方しないといけないのかを考えたほうがいいと思う
786
(1): 2021/08/01(日)03:13 ID:/oR3uo3Y(1) AAS
C++ポケットリファレンス読んだ方いらっしゃいますか?
独習C++ 詳説 C++ 第2版の次に読もうかと思ってるのですが
787
(1): 2021/08/02(月)10:21 ID:WSe94FPO(1/2) AAS
近年の現場と言うか、
大手の製品開発や比較的規模の大きい案件とかで使われてるC++のバージョンってどの辺ですか?
未だにC++03ってわけないですよね?
788: 2021/08/02(月)10:29 ID:WSe94FPO(2/2) AAS
>>786
C++プログラミング言語自体の研究という訳ではないのなら、
入門書以降は何か作る系の書籍のほうが良いのではないでしょうか?
物理シミュレーションだったりゲームだったり
人工知能だったりOSだったり様々あると思うので、
興味のある分野を極めていくのが良いと思います。
作りたいものがあるが何から手を付けて良いか分からないのなら
設計理論系の書籍等も良いと思います。
OOPを極めたいという考えであるならデザインパターン等も良いと思います。
789: 2021/08/02(月)10:37 ID:dQnVwxld(1) AAS
どの道、

class C { A* a; };
と、ポインターに変えても、

class A { char *p1; char *p2; };
と、新しいメンバーp2 には、C を再コンパイルしないとアクセスできない
790: 2021/08/02(月)11:23 ID:lIzbW3kq(1) AAS
class A;
class C { A* a; }; だけで完結してるなら まぁ問題をおこしにくそうではあるけど
そこまでして C に関わるコンパイルを止めたい理由がわからん
791: 2021/08/03(火)10:56 ID:Ljn/RAt1(1) AAS
>>787
最低でも C++11
それでも古いと思う
792
(1): 2021/08/09(月)22:11 ID:PKIz3Xw3(1) AAS
C++って競プロ以外に何に向いてるの?なんで競プロに使われるの?
793: はちみつ餃子 ◆8X2XSCHEME 2021/08/10(火)01:15 ID:7+xjomdk(1) AAS
>>792
実行速度が速いことが多いから速度が評価の一部である以上は有利になる。
(速ければ速いほど良いというわけではないが、上限が設定されているのが普通)
794: 2021/08/11(水)12:58 ID:MU7UJMps(1/3) AAS
std::map<std::pair<const char *, int> > hoge;
のように const char * を key とするとき
hoge.insert(std::make_pair("A", 41));
hoge.insert(std::make_pair("C", 43));
hoge.insert(std::make_pair("B", 42));
と追加すると
hoge["C"] で 43 が得られると期待できますが
このとき make_pair したときの "C" と hoge["C"] の "C" のポインタは値が違ってても
同一 key とみなされますか?(ポインタの値ではなく文字の中身の一致を見てくれますか?)
あるいは char * だとまた変わりますか?
795: 2021/08/11(水)13:12 ID:Z6PNV5dP(1) AAS
ポインターは先頭アドレス

2つのオブジェクトの内容が同じでも、
別々のオブジェクトなら、ポインターも異なる

ポインターが同じとは、同一のオブジェクトを指している場合だけ
1-
あと 207 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.377s*