X



C言語なら俺に聞け 149
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ af9f-7TBo)
垢版 |
2018/10/28(日) 22:01:44.38ID:D9Gt7gmT0
!extend:checked:vvvvv:1000:512

次スレを作る時は上記1行をコピーして2行に増やして必ず1行目に入るようにしてください。

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言語なら俺に聞け 148
https://mevius.5ch.net/test/read.cgi/tech/1537347410/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
0387デフォルトの名無しさん (ワッチョイ 4bbe-5svG)
垢版 |
2018/12/08(土) 18:40:20.20ID:hIfZgykd0
ほとんどC言語関係ないけどQtは最初,マルチプラットフォームで使えてC++バインディングが公式で提供されているっていう理由で
かなーり期待したんだけどね……。結局今はGTK+に戻ってしまった。
0389デフォルトの名無しさん (ワッチョイ 9312-ZtDu)
垢版 |
2018/12/09(日) 11:07:31.14ID:dkLieERx0
・C言語自体が単純で低水準、変換しやすい
・コンパイラの最適化とそこに投入された人月

というわけでC言語そのものじゃなくてコンパイラで生成された機械語が早い
0391デフォルトの名無しさん (ワッチョイ 93bd-xVWz)
垢版 |
2018/12/09(日) 15:56:34.95ID:LXVWu9Mt0
>>311
よくもまあPL/SQLを知らないのに批判できるよな。

PL/SQLの例外処理はOracle DatabaseがSQL、ビルトインパッケージの結果をうまく例外として伝播してくれる。

あなたは単に例外を作り出す方の実装が悪いものを見ているだけ。
0392デフォルトの名無しさん (ワッチョイ 93bd-xVWz)
垢版 |
2018/12/09(日) 15:58:53.53ID:LXVWu9Mt0
>>317
アドレスを指しているアドレスがポインタ。

ポインタが指しているアドレスにポインタがあるわけではない。
0393デフォルトの名無しさん (ワッチョイ 93bd-xVWz)
垢版 |
2018/12/09(日) 16:03:51.04ID:LXVWu9Mt0
>>388
C言語は低水準言語であるから、うまくやれば速いマシン語になるが、ちょっとしたことでむしろ遅くなるマシン語を生みやすい。

アーキテクチャの知識がない場合は、誤解したアーキテクチャを想定したコードを書いてしまい、実行速度が遅いものができあがる。
0398デフォルトの名無しさん (ワッチョイ 13d4-n9Ol)
垢版 |
2018/12/10(月) 15:44:39.90ID:Yf20pj4f0
あーそうか、
4byte(32bit)だと0x00000000から0xFFFFFFFFまでの?4294967296通りのアドレスが保存できるんですね。
なので処理系?によって変わるってことなんですね。
ありがとうございます。
0399デフォルトの名無しさん (アウアウウー Sa05-MnXc)
垢版 |
2018/12/10(月) 15:58:27.14ID:4x6+51xya
この頃の64bit環境だとアドレスも64bitだと思う。
クロスコンパイルする場合や意図的に32bit用のバイナリを作るようにコンパイルする場合を除く。
0408デフォルトの名無しさん (アウアウウー Sa05-MnXc)
垢版 |
2018/12/10(月) 20:29:46.12ID:4x6+51xya
>>404
昔々、8086があったとさ。
めでたしめでたし。
終わり。
0409デフォルトの名無しさん (アウアウウー Sa05-MnXc)
垢版 |
2018/12/10(月) 20:32:35.54ID:4x6+51xya
英語版

A long time ago,in a galaxy
far,far away....
0410デフォルトの名無しさん (アウアウウー Sa05-/enL)
垢版 |
2018/12/10(月) 23:14:07.07ID:l83Jt/Qga
>>396
OSによる。
4バイトは8ビット(=1バイト)x4なので32ビット。
32ビットOSなら、それで正しい。

じゃあ16ビットOSや64ビットOSの場合は?
0411デフォルトの名無しさん (アウアウウー Sa05-/enL)
垢版 |
2018/12/10(月) 23:16:39.78ID:l83Jt/Qga
>>400
セグメントは16ビット迄だよね〜。
0413デフォルトの名無しさん (アウアウウー Sa05-/enL)
垢版 |
2018/12/10(月) 23:38:01.37ID:l83Jt/Qga
いあ、知ってるよ?
でも今でも意味あるの?
Athlon64にPCの64ビット化を先越された時代の、その苦し紛れの拡張。

64ビット標準だけで今後PCに乗り切れる時代は来ないであろうメモリ容量をサポートしてるのに。
(理論上の限界来る前に、製造技術上の限界が来る)

Winはあえて制限してるが、時代とともに緩めるだけっしょ。
0414デフォルトの名無しさん (アウアウクー MM4d-xVWz)
垢版 |
2018/12/10(月) 23:53:27.02ID:bJUChMIiM
このスレッドは妄想コンピュータで話すやつが張り付いているね。昔は単純な話だったけどさ。
0417デフォルトの名無しさん (ワッチョイ 31b3-EBCi)
垢版 |
2018/12/11(火) 09:17:41.73ID:7sleUDEz0
プロセスルールの限界から実用的で物理的なメモリの上限はあるんだろうけど、何がどう進化するか分からないからねぇ。
単純に超多層化プロセスルールが一般化するかもしれないし、もしかするとクラウドRAMサービスとCPUアーキテクチャが融合してその限界突破なんて時代が来るかもしれん。
人間の創造力は無限と信じよう。
0419デフォルトの名無しさん (ワッチョイ dbf7-pji+)
垢版 |
2018/12/11(火) 12:57:57.93ID:ZRU2RXnk0
Visual Studio 2017のC/C++コンパイラってどこのフォルダに置いてあるんですか
(もしくはファイル名、あるいは、商標名?)
調べても「VSに付属するVisual C++にC/C++コンパイラが同梱されている」程度の
情報しか出てこない・・・
そのコンパイラは何て名前でどこに置いてあるんだ・・・
0421デフォルトの名無しさん (ワッチョイ dbf7-pji+)
垢版 |
2018/12/11(火) 13:42:28.53ID:ZRU2RXnk0
はい
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.3
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community
0422デフォルトの名無しさん (ワッチョイ dbf7-pji+)
垢版 |
2018/12/11(火) 13:48:36.76ID:ZRU2RXnk0
\Microsoft Visual Studio\2017\Community\VC の中を compiler で検索した結果

compiler.cpp

ん・・・?これ?
実行ファイルじゃなくてソースファイル・・・?
分からない、もうダメだ(絶望)
0425デフォルトの名無しさん (ワッチョイ dbf7-pji+)
垢版 |
2018/12/11(火) 14:00:29.46ID:ZRU2RXnk0
ありました!(なぜか4つも)
というかcl.exeってコンパイラだったんですね
コンパイラその他を呼ぶための媒介物かと思ってますた
感謝
0427デフォルトの名無しさん (ワッチョイ dbf7-pji+)
垢版 |
2018/12/11(火) 14:51:38.89ID:ZRU2RXnk0
>とかいろんな環境があるから、コンパイラは複数必要
なるほど 勉強になりました
0428デフォルトの名無しさん (アウアウクー MM4d-xVWz)
垢版 |
2018/12/11(火) 20:20:15.88ID:3ovMnnL0M
CプログラマでいまのCPUを理解しているやつなんてごく僅か。わざわざC言語を作る必要がない。もっと高水準言語で作って、VMと優秀なコンパイラに任せた方がいい。
0429デフォルトの名無しさん (ワッチョイ 13d4-n9Ol)
垢版 |
2018/12/11(火) 20:46:12.25ID:g9W94UvY0
初心者です。
>>428ののレスを読んでちょっと混乱しているんですが、

>>いまのCPUを理解
というのがまず何を指しているのか分かりません。
パーソナルコンピュータに内蔵されているCPUでしょうか、炊飯器に内蔵されているCPUでしょうか。

>>C言語を作る必要が無い
作らなくてもすでに存在していると思うのですが、自作が必要なものなのでしょうか。

>>もっと高水準言語
C言語自体が高水準言語だと思うのですが、これ以上の高水準とはどういう基準なんでしょうか。
自然言語をコンパイルするとかでしょうか。

>>VMと優秀なコンパイラ
VMというのはVirtualMachineの略でしょうか。VM上で動作するC言語というのがあるのですか?
VMを動かすほどのリソースが無いようなマシン上では何を動かすのでしょうか。
優秀なコンパイラ、ということは Cのコンパイラは優秀ではないのでしょうか。

おじい・・・紳士のみなさま、ご教授お願いいたします。
0437デフォルトの名無しさん (ワッチョイ e18a-Po2/)
垢版 |
2018/12/12(水) 06:43:02.35ID:MN/7vBAt0
>基本情報とITパスポートの勉強

何のことかと思って調べてみれば情報処理技術者試験のことか
そう言えば昔に第一種と上級シスアドに合格してたこと思い出したわ
0439デフォルトの名無しさん (ワッチョイ e18a-24dN)
垢版 |
2018/12/12(水) 11:23:33.13ID:MN/7vBAt0
関数型は抽象表現能力は高いが実行効率を追求する様な用途向きではないぞ
生産効率も圏論などの数学的思考に慣れていないと下手すればOOPよりも悪化する可能性が高い
0440デフォルトの名無しさん (アウアウウー Sa05-MnXc)
垢版 |
2018/12/12(水) 12:19:40.64ID:XAdiQzbba
( ´_ゝ`)フーン
0445デフォルトの名無しさん (アウアウウー Sa05-MnXc)
垢版 |
2018/12/12(水) 13:11:22.57ID:XAdiQzbba
SFのスレはここですか?
0446デフォルトの名無しさん (ワッチョイ 91d2-3M3s)
垢版 |
2018/12/12(水) 13:12:45.03ID:5HIThNOt0
【平和を実現するために】 武器調達の中止、格差拡大の抑止、労働移民の禁止、国政からのバカウヨ排除
http://rosie.5ch.net/test/read.cgi/liveplus/1544586377/l50
0447デフォルトの名無しさん (ワッチョイ 9312-ZtDu)
垢版 |
2018/12/12(水) 13:15:11.92ID:SHf/dQVX0
関数型プログラミングはλ計算の時点で全く理想的だから
有限のアドレッシングで動いてる今のCPUには全くそぐわない
だから関数型と今のCPUアーキテクチャは根柢から反りが合わないんじゃねえかと

すると関数型の書法を現状の機械語に書き直すだけでロスが出てくる
理想的なモンを劣化させてるに等しいが技術上はそうするしかない

そもそも関数型を直接実行できるようなCPUを人類が作れるかどうか
無限の再帰と無限のストリームが必要になっている時点で怪しい
0448デフォルトの名無しさん (アウアウウー Sa05-/enL)
垢版 |
2018/12/12(水) 13:25:42.01ID:LIx8RHBsa
昔どっかがLisp用にスタックコンピュータだか何だか作ってなかったっけ。

それはともかく、関数型言語でも結局どういうマシン語に落とすかだから、最適化技術で高速化は出来るはずなんだがな。
Cは低水準な操作も出来るから速いコード書けるとはいえ、素直なコードは最適化無しだと他の言語と変わらないし、
速度で言えば別に低水準な操作出来る訳でも無いFortranはC並みに速いわけで。
最適化への技術や時間の掛け方が違うってだけ。
0452デフォルトの名無しさん (アウアウウー Sa05-/enL)
垢版 |
2018/12/12(水) 15:38:07.68ID:LIx8RHBsa
ループだと関数渡せないから。
あとはリストを受け取ってリスト返す関数とか、IOモナドとかは
再帰関数がそのままループになる。
(リストもモナドなので、モナドを返す再帰関数がループになると言える)
0453デフォルトの名無しさん (ワッチョイ cad4-UKyl)
垢版 |
2018/12/13(木) 14:18:51.88ID:oii7E7F70
初心者です。

inline指定子について教えて頂きたいのですが、
関数ポインタからinline関数を呼び出す場合、どのように展開されるのでしょうか。
また、関数ポインタを格納する配列から呼び出すような場合はどのように展開されるのでしょうか。
0454デフォルトの名無しさん (ラクペッ MM9b-8Y2+)
垢版 |
2018/12/13(木) 14:32:27.38ID:1m7XwvCgM
inline関数の展開は環境依存
呼び出し方が如何なる方法であれ関数の構造によってはインライン展開される保証はない
ループ構造を含んでいると殆ど期待できない
0455デフォルトの名無しさん (ワッチョイ cad4-UKyl)
垢版 |
2018/12/13(木) 14:56:19.82ID:oii7E7F70
なるほど、ありがとうございます。
まさに、
for (i = 0; i < length; i++) {
 func_ptrs[i](hoge);
}
みたいなことを試そうとしているところでした。
こういう場合は展開は期待できないということですね。

今回も勉強になりました。
0458デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/13(木) 18:40:11.12ID:Fv0+Omexa
Tではないと
0459デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/13(木) 18:48:07.23ID:Fv0+Omexa
>>457
え?gccで -O -S で置き換えられたように見えるアセンブリ言語出力したぞ。(97引いて5以下かどうか見ているやうなやつ)。
-Oなしだと一つ一つ比較していて明らかに違う。
0461デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/13(木) 18:51:31.61ID:Fv0+Omexa
CPUによっては一つ一つ比較するように書いた方が速いなんてこともあるのかも知れないが、普通はそうならないように思う。
0463デフォルトの名無しさん (ワッチョイ f34f-rp3U)
垢版 |
2018/12/13(木) 19:08:30.18ID:y280e6J90
>>457
>>461
a=='a'のときにべたの方が速いからだろ。
a-fが均等な確率だ、というのをコンパイラに対して教えてないし、教える方法もない。
だからコンパイラが勝手にそこを改変するようでは困るだろ。
(大半がa=='a'と分かっていて最速コードが欲しいときに記述出来なくなる)

C言語はそういう言語なんだよ。自動的に勝手にやってくれる言語ではない。
細部まで自分で指定できるからこそ極限までチューニング出来る。
最速コードが欲しければ、a-fの確率まで考えて、自分で指定しろ、でしかない。
0464デフォルトの名無しさん (ワッチョイ 2b93-eQ7e)
垢版 |
2018/12/13(木) 19:28:54.20ID:VenLBJVu0
ワシのとこでも -O で「即値97を引いて即値5と比較…」が出たわ。
-O なしだと真っ正直に即値との比較が6回。

>>457 に書かれた通りの ('a'<=a&&a<='f') にならないと言っても、
'a'以上か? 'f'以下か? の判定2回よりもっと効率的になってるでしょ。

もちろん gcc のバージョンによる違いかも知れんが。
0466デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/13(木) 19:58:30.01ID:Fv0+Omexa
>>463
あー。なるほど。

かといって言語の規格として最適化についてまで決まってたっけ?
その辺は決まってなくてコンパイラしだいのような気がするが。
0467デフォルトの名無しさん (アウアウウー Sa4f-mTCp)
垢版 |
2018/12/13(木) 20:01:00.67ID:Fv0+Omexa
>>465
しかし関数へのポインタが作れてしまう時点でそれはもう inline ではなくなっているように思うのだが。
0468デフォルトの名無しさん (ワッチョイ f34f-rp3U)
垢版 |
2018/12/13(木) 20:23:30.62ID:y280e6J90
>>466
規格云々以前に、適用ヶ所と文化の問題。
C言語がガチで使われている領域はそういうところだから、「書いたとおりのコードを吐け」でないと困るし使えない。
だから適当に改変するコンパイラは嫌われる。

対してC++は「出来るだけコンパイラにやらせる」思想だし、そもそもCほど掘り下げる使い方はされないから、
「可能な限り自動的に最適化しろ」な気はするが。
0470 ◆QZaw55cn4c (ワッチョイ aa60-D8NS)
垢版 |
2018/12/13(木) 21:27:21.48ID:mMIcaeGH0
>>467
なるほど…
そういうときは、call されたときは inline に展開するけれども、関数のポインタとして渡されたときに動かすためだけに(実際にポインタから呼ばれるかどうかは考えずに)inline の関数を別にバイナリーに展開しておくっていうのはどうですか?
0481デフォルトの名無しさん (ワッチョイ 1e61-6aDR)
垢版 |
2018/12/14(金) 06:30:05.99ID:lAbDnTGa0
最適化をいれるとaが定数だとaが消されるからaを別の関数の引数にすることで
消されないようにできる。
volatileで消さないようにするとなぜか比較が最適されない。
0483デフォルトの名無しさん (バットンキン MM33-JU2d)
垢版 |
2018/12/14(金) 06:52:31.89ID:TYVfP/dyM
最適化は処理の最中に使う変数が外部(別スレッドや割り込みハンドラ)から変更されないということを前提としてるから、volatileつけるとaの比較途中でaそのものが変更されるかもしれないので逐一比較になる。
まぁスタック上のローカル変数aが外部から変更されるってのは通常は単なるスタック破壊のバグだけどね。
0485464 (ワッチョイ 2b93-eQ7e)
垢版 |
2018/12/14(金) 07:50:49.15ID:FIv/Q2MJ0
>>479-480
素直なコードで出るはずだけどなぁ。

サンプル abcdef.c
第1引数の最初の文字が [a-f] なら yes, それ以外なら no と表示
(引数が与えられなかった場合は no を表示)

$ cat abcdef.c
#include <stdio.h>

int main(int argc, char *argv[]) {
  int a;

  a = (argc>1) ? argv[1][0] : 'z';

  if (a=='a'||a=='b'||a=='c'||a=='d'||a=='e'||a=='f') printf("yes\n");
  else printf("no\n");

  return 0;
}

$ gcc -S abcdef.c
最適化なし 比較6回

$ gcc -O -S abcdef.c
最適化 97引いて5と比較
■ このスレッドは過去ログ倉庫に格納されています