C言語なら俺に聞け 155

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
垢版 |
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 154
https://mevius.5ch.net/test/read.cgi/tech/1578997950/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
588デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 15:52:35.64ID:xRlBM5RB0
// benchmark
int r = f(size, data1, data2);

// end
ftime(&timebuffer);
sec = timebuffer.time - sec;
millisec = timebuffer.millitm - millisec;
millisec += sec * 1000;

printf("%d ms \n %d", millisec, r);

free(data1);
free(data2);
}
2020/07/22(水) 16:01:48.88ID:lGyqioywH
f()で0返せばいいんじゃね?
590デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:06:36.57ID:xRlBM5RB0
たしかにrが0になるが
たぶんsrand, randで値の分布が一様じゃないせいか?
Javaとの性能比較してたんだけど乱数生成法が合わせれないな
591デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:07:57.00ID:xRlBM5RB0
あ違うなsizeがでかすぎると0になっちゃうのか
2020/07/22(水) 16:11:34.79ID:1buRSft90
Java(VM)とCという言語の比較をしたいのかこのソースを最適化したいのかrandの仕様を統一したいのか意味不明だわ
593デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:21:46.25ID:xRlBM5RB0
JavaとCの性能比較で「Javaは高速だCに負けてない」とか
「JITやGCが動作する時に遅くなるだけだ」とか良く言われてる。
でもこういう単純な配列処理でCの方が3倍くらい速いよな、と思って。
この処理は計測中にヒープ割当が無いからGC関係ない(Javaでオブジェクトを作成するとGCのためのオーバーヘッドがあるらしい)。
JavaでJIT効かせてから計測してもCが4倍弱速かった。
最初1900msもかかるといってたのは勘違い。Cの方が4倍弱速いから予想通りの性能だった。

Javaの性能に関する言説を見渡しても、なぜこういう処理でJavaが遅いのか説明が無い。

大量のデータを処理しつつ特定の値に収束しない良いベンチマークコードがあればいいんだが。
足す引きを交互に繰り返すか。
2020/07/22(水) 16:24:26.21ID:t6q0HDDX0
>>586
data1[i] & data2[i] の計算を100回もやることはないから
int f(int size, int *data1, int *data2) {
int *data3 = (int*) malloc(size * sizeof(int));
for (int i = 0; i < size; i++) {
data3[i] = data1[i] & data2[i];
}
int r = 0;
for (int j = 0; j < 100; j++) {
for (int i = 0; i < size; i++) {
r ^= data3[i];
}
}
free(data3);
return r;
}
ってやると多少速くなるかも
あとは分割してスレッドで並行して実行するとかかな
595デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:26:57.20ID:xRlBM5RB0
これで収束しないし毎回ランダムな結果になる。

long f(int size, int *data1, int *data2) {
long r = 0;
for (int j = 0; j < 100; j++) {
for (int i = 0; i < size; i++) {
r += data1[i] - data2[i];//ここ変えた
}
}
return r;
}
2020/07/22(水) 16:34:17.16ID:lGyqioywH
なんだ、^ の意味わかってなかったのか。
ていうか、コードの最適化を求めるなら、
そのコードの目的のほうが先に存在するはずじゃないのか?
コロコロ変えてさあ最適化しろとかおかしいだろ。
597デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:39:25.22ID:xRlBM5RB0
0になってたのは^じゃなくて&が原因だろ
2020/07/22(水) 16:42:01.87ID:lGyqioywH
^ だよ
最後のやつで + を ^ にしたらどうなる?
599デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 16:44:20.78ID:xRlBM5RB0
あr=0でr^=使ってたからか
演算子の意味じゃなくてr=0で始めてる事との整合性に気付いてなかった
r = rand();
r ^= data1[i] ^ data2[i]
これなら収束しないはず
2020/07/22(水) 16:46:16.22ID:lGyqioywH
それ、最初の rand の値が返るだけだから。
601デフォルトの名無しさん (エムゾネ FF33-keh3)
垢版 |
2020/07/22(水) 16:56:43.54ID:J+LKPgcIF
もしかして残念なベンチ
2020/07/22(水) 17:05:53.92ID:lGyqioywH
目的の明確でないベンチマーク作っても無駄だよね。
何を調べたいの?
2020/07/22(水) 17:19:08.68ID:1buRSft90
> この処理は計測中にヒープ割当が無い
って書いてあるけどガッツリ malloc してるし本当に何がしたいのか良く分からない
2020/07/22(水) 17:34:24.16ID:Y73iWKLTd
全ての値を偶数回^すれば答えは0になって当然
605デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 17:58:11.98ID:xRlBM5RB0
>>600
なんで代入されないんだ?

>>602
>>593
>こういう単純な配列処理でCの方が3倍くらい速い

>>603
「計測中に」はstartとendの間にという意味。
2020/07/22(水) 17:59:58.58ID:HrEyCXiAd
>>586
大いに改善の余地あり
0になることを仮定せずに真面目に計算するとして

データがメモリがキャッシュに入るとすると
計算の依存関係ありまくりだから
ほぼレイテンシ待ちになる

ループ4周を展開して
rを4個に分けるだけで速くなりそう

SIMD命令が使えるなら
非常に効果がある形なので
使えるなら使う
この場合も演算の依存関係は減らすこと

データがキャッシュに収まらないなら
メモリ速度で決まるからあまり関係ない
607デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:03:43.69ID:xRlBM5RB0
代入されないんじゃなくて偶数回^すると元に戻るのか
2020/07/22(水) 18:04:59.81ID:YNla03BQM
>>605
> なんで代入されないんだ?

代入はされているが、100が偶数だから >>604 の言うように0に戻ってるだけ。
609デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:09:25.81ID:xRlBM5RB0
二重ループにして外側が偶数回だからか。
「同じ乱数列を偶数回XOR走らせたら元に戻る」と。
>>600>>604が言ってるのはそういうことか

勉強になった
610デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:12:28.77ID:xRlBM5RB0
あーじゃあr=0で始めてたことは関係無くて、
単に二重ループの外側が偶数回だと無意味だと。
r=0で始めてもXORならちゃんとビット列変わってたけどXORの性質から元に戻ってたと。
コンパイラがそれ知ってたら最適化して処理消しちゃうから良くないな。
XORのその性質を知らなかった
611デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:26:49.94ID:xRlBM5RB0
より正しく述べておこう
・1回でも101回でも同じ結果なのでXOR版では二重ループの外側が無意味
・data1, data2がどんな数列でもXORの性質は同様にある

ID:lGyqioywHとID:YNla03BQMはこれを言ってたんだな
612デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 18:26:50.13ID:xRlBM5RB0
より正しく述べておこう
・1回でも101回でも同じ結果なのでXOR版では二重ループの外側が無意味
・data1, data2がどんな数列でもXORの性質は同様にある

ID:lGyqioywHとID:YNla03BQMはこれを言ってたんだな
2020/07/22(水) 19:03:36.52ID:YNla03BQM
かようにベンチマークっていうのは難しいんだ。
CPUの比較をするだけでもいろんな提案があって
SPECとかはなんとか信頼されているが、
言語間の性能比較とか素人が適当にでっち上げても、
そのプログラムが悪いだけじゃねってなるのがオチ。
2020/07/22(水) 21:28:34.34ID:EzFbgF7R0
最終的に 0 になるだろけど、この計算は愚直に行われるんでしょ。
答えが 0 にしかならないことと C と Java の速度差がそうなることとはまた別の話だよね。

って、コードの最適化の話だったんだっけ?
615デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/22(水) 22:22:42.43ID:xRlBM5RB0
Cがこの処理でJavaより3〜4倍速い事は確認できた。
0に収束する事とそれは無関係。

以下、一応書くけど完全にスレ違い。

このような単純な配列処理でCとJavaの速度差がなぜ生じるか?はまだ分かってない。
・HotSpotは配列の境界チェックを除去できる
・一般論としてJavaが遅くなる原因としてJITやGCが挙げられるがこの単純なプログラムではそれらの影響はない

予想
・1命令で処理できるサイズが違っている?約4倍の速度差はベクトル演算の差で説明できそう。
だとしたらなぜJavaのJITはそれをやらないか?
・CPUキャッシュの問題?Javaの場合CPUキャッシュが別の何かで埋まってしまっている可能性
616デフォルトの名無しさん (ワッチョイ 69e6-A04g)
垢版 |
2020/07/22(水) 22:30:57.82ID:1buRSft90
自分のブログでやって
2020/07/22(水) 23:08:24.67ID:G9I2XdZp0
そもそもjavaがc/c++並に速いとか、かなり嘘や誤魔化し入っているから
速度差3-4倍で済むなら十分健闘している

javaのコードを移植して、無駄にmalloc freeしまくったりする糞コードならもっと迫れるだろうけど
2020/07/23(木) 02:25:27.91ID:tfGyNQFW0
>>615
そもそもJITが吐くバイナリを逆アセンブルして比較しなきゃしょうがないんでね?
そのようなことが可能かは知らないけど、処理中にデバッガで無理矢理止めればわかりそうな気はする
2020/07/23(木) 04:09:18.13ID:NaEhWCW1K
最初の>>586の問いがベンチマークを意図してるとは思われてなかったから{return 0;}で良いんじゃね?ってなったんでは
2020/07/23(木) 11:21:03.05ID:TTqTgaIL0
javaの配列は特別な宣言無しに別スレッドでこっそり書き換えてもちゃんと反映されるわけだから、単純処理であっても最適化にも限界があるだろうな。
Cの場合は、他で書き換えられるかもと指定しておかなければ他所のことなんておかまいなしに処理できるから、その点だけでも有利だよね。
>>586 のコードのなら、i のループに入る前に data[j] を変数に取り置いて i のループ内で使用するようにすれば、java の方では高速化されるんじゃね。
C ならそれをコンパイラがやってくれてそう。
2020/07/23(木) 11:24:21.68ID:TTqTgaIL0
逆にCの側で配列を volatile にしておけば Java との速度差は小さくなるかもね。
2020/07/23(木) 11:26:24.50ID:V2V2cZYad
data[j]なんかないけど
2020/07/23(木) 11:46:46.14ID:vtZyy6ICM
じゃあjava.util.concurrent.atomic以下にある配列クラスは全部廃止だな
624デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/23(木) 12:46:54.76ID:tYvDqilk0
ベクトル演算の未適用が原因だとほぼ特定できた。
2020/07/23(木) 13:17:22.41ID:V2V2cZYad
>>587
巨大サイズメモリで簡単な演算だから
ほとんどがメモリアクセス時間だろ
2020/07/23(木) 13:19:58.21ID:V2V2cZYad
簡単な処理のために巨大メモリをスキャンするのは超無駄
627デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/23(木) 13:51:39.59ID:tYvDqilk0
C版
size
1000*1000 * 1 20ms
1000*1000 * 10 191ms
1000*1000 * 100 1893ms
線形な変化だからCPUキャッシュに載り切るかで性能が分かれるという事が生じてない。
たぶんCPUキャッシュは「繰り返し使うデータ」じゃないと有意義じゃない。
この処理だとCPUキャッシュ上のデータを排除可能になるまでの時間がボトルネックで、
つまり「CPU上のデータを処理しきって次の要素を受け付けれるようになるまでの時間」が支配的なはずで
そこがベクトル演算で高速化してる。

Java版も線形に変化した。

で、Javaのコードでr += data1[i] + data2[i]のところでdata1のみにしたら2倍速になったからベクトル演算未適用が原因でほぼ間違いない。
その行で+か-か^か&かは結論に影響しない。
2020/07/23(木) 13:55:19.10ID:TTqTgaIL0
>>622
ほんとだw
data1 か data2 かは置いといてもどっちも i を添字とするループか。
マトリクス状に組み合わせてるんだと錯覚してたすまん
2020/07/23(木) 14:11:44.83ID:TTqTgaIL0
>>623
値が volatile なことと操作が atomic なことは別の話だよ。
自分が書き換えない同じ領域を複数参照するとき、それを他の誰も書き換えないならその参照は一度目の値と同じになる前提で最適化できるけど、他の誰かがいつの間にか書き換えることがあるならそういう最適化はできなくなる。
そういう領域であることを明示するのが volatile。
atomic は同じ領域を誰かが書き換える前提なので基本的にその領域は volatile だけど、それに加えて値を参照して手を加えて書き戻すなどの一連の手続きの途中で他の誰かにいじられないことを保証すること。
それを CPUレベルの命令で行うかソフトウェア的なロックで行うかで色分けされてるだけ。
2020/07/23(木) 14:28:36.26ID:V2V2cZYad
>>627
CPUは何?
2020/07/23(木) 14:33:33.27ID:V2V2cZYad
メモリアクセスの影響がないなら

iとjのループを入れ換える
ループアンロール
rを偶数奇数で分ける
SIMD

などが有効
2020/07/23(木) 14:36:26.08ID:V2V2cZYad
>>627
同じメモリに100回アクセスしてるんだから
メモリサイズが小さければキャッシュが効くはず
633デフォルトの名無しさん (ワッチョイ 1394-keh3)
垢版 |
2020/07/23(木) 14:42:55.39ID:tYvDqilk0
>>632
確かにそうだ。
でも1000 * 100も試してみたが2msで線形だった。
2020/07/23(木) 14:44:16.58ID:V2V2cZYad
CPUは何?
2020/07/23(木) 16:21:21.26ID:WGvvEAFm0
>>629
別スレッドからの値の書き換えについて話をしていたよね?
だったらvolatileは何も保証してくれないよ
2020/07/23(木) 16:39:16.32ID:TTqTgaIL0
>>635
保証ってなんの話?
2020/07/23(木) 20:41:12.28ID:j3eQi4Nn0
>>629
分かってると思うけど誤解なきよう勝手に補足するけどvolatileの最適化抑制はreadだけではなくてwriteに対してもな。
ドライバ書いてる人には常識レベルだけど。
638デフォルトの名無しさん (ワッチョイ 13ad-5TCi)
垢版 |
2020/07/24(金) 03:10:38.82ID:6ZonvnML0
volatile ってスレッドに限らず値が知らない内に変化する可能性のある何かの入力でも使うよね。
例えばマイクから拾った音を A/D 変換した値がメモリマップドI/Oで特定のアドレスのメモリ読む方法で読める場合。
CPUが予想不能な形で値がコロコロ変わるので volatile にせざるを得ない。(volatile って揮発性とか不安定って意味だし、言葉の意味そのままだ)。
これは読む側だけど書いて何かを出力する場合も、書いた値を読めないような作りになっている場合もある。
1を書いたのに直後に読むと0だったりなんていう事はあり得る。要するに一々覚えていない。または覚えていても読み出しに対応していない。
そんなハードウェアが接続されていたらそうなる。
2020/07/24(金) 04:44:18.69ID:So4dssPK0
そりゃ、外部装置と連動しているから、値がいつ変わるか分からない

外部装置が読み書きしたら、合図として、0.1ms 後に、値を反転させたりとか、
色んな事をするから、予測できない
2020/07/24(金) 09:33:19.23ID:ASBY7bf4M
volatileは変数(I/Oアドレス)に対するアクセス行為は保障するけど値そのものに対しては何の意味もない
そもそも外部要因で変化する値に対して干渉するのは不可能
2020/07/24(金) 10:20:02.92ID:4h264/iA0
どこから干渉するとか出てきたんだ…
知ってる知識を開陳したくてしょうがないんだろうなw
2020/07/24(金) 15:22:34.69ID:jNVRIcub0
volatileな変数を読むのは怖いよね
ワード単位ならいいけど、構造体読むときはチェックサム欲しくなるよね
2020/07/24(金) 18:25:04.01ID:ogZVfXfN0
別に怖くはないだろ。
他所と排他するなりしかるべきタイミングでアクセスすればいいだけなんだから。
排他や同期が必要な領域にそれをせずにアクセスするならただのアホってだけで、volatile がどうとかいう話じゃない。
2020/07/24(金) 20:10:16.16ID:Cmq7VG8v0
LL/SC命令が結構使える
2020/07/25(土) 04:21:09.10ID:qNFJliza0
>>642
それはatomicとかクリティカルセクションの話であって
volatileで何とかしようという発想がそもそも間違いだ
2020/07/26(日) 03:07:46.88ID:4oXiyEBn0
「書きこんだものの読み込んでないからコードから消しちまえ」
「読み込んでるけど、代入以降値がかわる気配がないから、読み込みを止めて固定値にしちまえ」
これを抑制するだけ
書き込や読み込みを記述通り生き残らせる
2020/07/26(日) 08:34:28.91ID:M65fvK3w0
W=>R : R省略
R1=>R2 : R2省略
W1=>W2 : W1省略
2020/07/26(日) 10:41:35.23ID:3q3cv3BJ0
volatile覚えて嬉しいのはわかるけど…
2020/07/26(日) 11:55:59.05ID:7t5aGHPkd
volatileの意味を知らない人 vs volatileを覚えたての人
2020/07/26(日) 12:24:46.27ID:oYG2ZyVyM
vs 30年前の常識で語る人
2020/07/26(日) 13:35:18.59ID:6eSsd+mZ0
ANSIは邪道。
652デフォルトの名無しさん (ワッチョイ 13ad-5TCi)
垢版 |
2020/07/26(日) 18:14:24.05ID:hRZi6+cn0
あんししー
2020/07/26(日) 20:08:24.24ID:VBmKLhih0
アンジー、なんてこと言うの
シー
2020/07/27(月) 02:57:00.46ID:BRKetx390
30年くらい前までドヤる人が好んで口にしてたけどね
そういう人はC89ができたらピタリとやめた

今まだ言ってる珍獣って何なん?
2020/07/27(月) 08:26:00.92ID:IvOd7acF0
姫宮アンシー
2020/07/27(月) 16:25:16.57ID:BRKetx390
C89以前のK&R Cは個人的には好きなので
gcc -traditional復活して欲しい
2020/07/27(月) 16:41:53.18ID:euzbjA/F0
関数定義で引数が()の外に書かれる記述みると、
今は違和感が湧いてしまう
2020/07/27(月) 16:45:47.58ID:IvOd7acF0
書き方が違うだけなら古いスタイルでもいいんだけど、型チェックが緩いんだよな。
2020/07/27(月) 17:14:06.93ID:BRKetx390
アセンブラ屋出身の俺っちにはどうでもいいことだ
2020/07/27(月) 17:35:58.30ID:IvOd7acF0
引数の数を間違えているのに黙って通してしまう例。

https://wandbox.org/permlink/FEu474UVSsilTq0L

最適化オプションを付けたらフロー解析も強まるのか警告してくれたけど。
661デフォルトの名無しさん (ワッチョイ 13ad-5TCi)
垢版 |
2020/07/27(月) 18:50:57.45ID:8GZ2GqSj0
その他の例
https://wandbox.org/permlink/gz8u1YkarV3RuM1M
2020/07/27(月) 23:59:05.30ID:UIY75t8S0
スタックが壊れないならまあいいんじゃね?
2020/07/28(火) 03:43:48.32ID:JnUAmZD/0
あのなあ、おまえら。。。。
K&R Cに対する批判なんて今さらドヤるか?
規格Cを憶えるときにプロトタイプは何のためか
説明受けてないやつがここにいるとでも思うのか?
664デフォルトの名無しさん (アウアウウー Sa5d-d0Nl)
垢版 |
2020/07/28(火) 13:28:44.28ID:DVrEteyfa
(キリッ
2020/07/28(火) 19:40:24.44ID:1JEs8/dl0
"#C-PLA" という店名をどう思いますか。
2020/07/28(火) 19:48:32.54ID:cWad1kwo0
>>663
やっぱり C99 or later を叩くのがかっこいいですよね
2020/07/28(火) 20:02:16.84ID:geCJz7H80
>>665
オブジェクトをカプセル化・・・?
668デフォルトの名無しさん (ワッチョイ fa94-UdrD)
垢版 |
2020/07/29(水) 17:10:37.12ID:tqWMyndD0
浮動小数の演算で生じる誤差は常に絶対値が小さくなるように行われる、
という前提は正しい?
669デフォルトの名無しさん (ワッチョイ fa94-UdrD)
垢版 |
2020/07/29(水) 17:11:14.42ID:tqWMyndD0
C限定の話じゃないからスレ違いか
670デフォルトの名無しさん (ワイーワ2 FF62-lIev)
垢版 |
2020/07/29(水) 17:12:49.06ID:hY/5h1XOF
日本語として可笑しいのでgoto語学板へ
2020/07/29(水) 17:14:56.87ID://053udPa
>>668
正しい気がする
2020/07/29(水) 17:18:22.13ID://053udPa
>>668
ごめん嘘ついた。
2020/07/29(水) 17:21:06.57ID:8sSsdFab0
>>668
ライブラリやFPUの実装の話だね

例えばだけどIEEE754の定義では
仮数部は1.xxxxxxと、整数部が常に1なので
整数部を省き、その分の1bitを小数部に回す「ケチ表現」で
誤差がなるべく小さくなるように工夫している
2020/07/29(水) 17:25:55.07ID:Bu6uxHFv0
>>668
浮動小数点制御ワードの設定によっては丸め方向が変わるから、必ずしもそうだとは言えないかも。環境によるのかもしれないけど、詳しくは知らない。
_controlfp_sとかでググってみて。
675デフォルトの名無しさん (ワッチョイ fa94-UdrD)
垢版 |
2020/07/29(水) 17:28:44.72ID:tqWMyndD0
doubleを分解(0.1や0.3とかでかけて複数のdouble値にする)して足し合わせて比較、
という処理を無限回繰り返して元の絶対値を超えていたら停止、
みたいなテストコードを書いてみたけど、低確率で元の絶対値を超える。
この誤差が分解と足すときどちらで生じているか分からないが
なんにせよ浮動小数点数演算の誤差で絶対値が増加する場合があるようだ。
2020/07/29(水) 17:45:17.74ID:8sSsdFab0
あ、誤差の絶対値ではなく、結果の絶対値ということ?
俺の勘違いだったら悪いんだけど、それじゃ意味なくね?
結果が正数ならともかく負数の場合デメリットだけやん
2020/07/29(水) 18:11:52.28ID:+Q7sP3F+d
丸めモードによって変わるだろうに
絶対値が小さくなるのはround toward zeroにしたときだな
2020/07/30(木) 05:23:55.72ID:82YOHtIh0
Cのソースコードを解析するツールで有名なものって何かありますでしょうか?
679デフォルトの名無しさん (ワッチョイ ce8c-LW7E)
垢版 |
2020/07/30(木) 06:42:57.43ID:ixil7w/z0
上司がこっそり使っていた cflow
2020/07/30(木) 07:04:40.85ID:SsIpxIlu0
>>668
加減乗算のほとんどの実装ではそう
681デフォルトの名無しさん (ワッチョイ 0101-iVY1)
垢版 |
2020/08/10(月) 04:07:37.60ID:SKFyjjt90
デファクトスタンダードなCのコーディング作法を手っ取り早く
身につけるために何をすべきですか?
682デフォルトの名無しさん (ワッチョイ 0101-Ea0s)
垢版 |
2020/08/10(月) 04:47:16.15ID:o5h87VM/0
所属がわからないと何とも言えませんね。
社名と部署お願いします。
2020/08/10(月) 04:53:08.55ID:P+mDn/zj0
車載の組み込み系以外は
それぞれの会社にコーディング規約あるんじゃない?
知らんけど
684デフォルトの名無しさん (ワッチョイ 1b8c-oftG)
垢版 |
2020/08/10(月) 06:50:01.64ID:ruBmk/3z0
お手本のプログラムを上司に見せてもらい完コピする。
2020/08/10(月) 06:53:36.45ID:k2ud7k4K0
>>681
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006

この研究会は、トヨタなど大企業から、数十人のベテが集まって、
欧州人に聞きながら、作った本

未だに、コーディングルールのバイブルだろ

元々は、Andrew Koenig の本

C Traps and Pitfalls, 1988, c1989
Cプログラミングの落とし穴
2020/08/10(月) 07:14:44.55ID:JYoLJZbsH
>>685
>数十人のベテ
司法試験板をみると「ベテ」というのは30代以降の複数回受験者のことらしいですよ
文脈によっては veteran は階級を問わず退役軍人を意味することもありますし‥‥「わしが現役の頃には」を壊れたレコード盤のように繰り返すイメージとか
ベテランという言葉に必ずしもプラスイメージが伴っているとは限らないことはしっておいたほうがいいんじゃないですか?
2020/08/10(月) 07:23:02.78ID:tfnxCl0S0
能書きはいいから内容を見ろや

あれを見てくだらねえと思うことが何もないやつは
自分がなさすぎだ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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