C言語なら俺に聞け 149
■ このスレッドは過去ログ倉庫に格納されています
>>385 変えてない。Qtはゴミだよ。 あれで公開していると思うのなら他フレームワーク等見てみろよ。 ほとんどC言語関係ないけどQtは最初,マルチプラットフォームで使えてC++バインディングが公式で提供されているっていう理由で かなーり期待したんだけどね……。結局今はGTK+に戻ってしまった。 Cってほんとに実行速度が速いの? 他のコンパイル式の言語に速度で勝る理由が分からん。 インタプリタならともかく。 ・C言語自体が単純で低水準、変換しやすい ・コンパイラの最適化とそこに投入された人月 というわけでC言語そのものじゃなくてコンパイラで生成された機械語が早い >>311 よくもまあPL/SQLを知らないのに批判できるよな。 PL/SQLの例外処理はOracle DatabaseがSQL、ビルトインパッケージの結果をうまく例外として伝播してくれる。 あなたは単に例外を作り出す方の実装が悪いものを見ているだけ。 >>317 アドレスを指しているアドレスがポインタ。 ポインタが指しているアドレスにポインタがあるわけではない。 >>388 C言語は低水準言語であるから、うまくやれば速いマシン語になるが、ちょっとしたことでむしろ遅くなるマシン語を生みやすい。 アーキテクチャの知識がない場合は、誤解したアーキテクチャを想定したコードを書いてしまい、実行速度が遅いものができあがる。 >>392 >>393 どうやら違う世界線から紛れ込んできたと見える なんでこういうcrazyなことを言う輩に限って自信満々に断言するんだ 謎 初心者です。 >>392-393 のレスを読んでちょっと混乱しているんですが、 C言語は高水準言語で、 ポインタ変数自体は「アドレスを格納できる4バイト?の変数」っていう認識で合っていますか? 何バイトかは決まっとらん。 サイズに注意出来るようになったらあなたは中級者。 あーそうか、 4byte(32bit)だと0x00000000から0xFFFFFFFFまでの?4294967296通りのアドレスが保存できるんですね。 なので処理系?によって変わるってことなんですね。 ありがとうございます。 この頃の64bit環境だとアドレスも64bitだと思う。 クロスコンパイルする場合や意図的に32bit用のバイナリを作るようにコンパイルする場合を除く。 ポインタ変数のサイズは32bit幅、 ただしセグメント部16bitのオフセット部16bitで 有効な全範囲はトータルで20bit。 やべー あの頃から35年も経ったのかよ 漠然と20数年かなとか思ってたよ 一体何の話をしているんです!? 教えてくださいおじい・・・紳士さま。 映画タイタニックでも「near far wherever you are」と謳われているほどポインタは面倒 >>406 …うまい でも near far とかもう通じないんじゃないかな? >>404 昔々、8086があったとさ。 めでたしめでたし。 終わり。 英語版 A long time ago,in a galaxy far,far away.... >>396 OSによる。 4バイトは8ビット(=1バイト)x4なので32ビット。 32ビットOSなら、それで正しい。 じゃあ16ビットOSや64ビットOSの場合は? いあ、知ってるよ? でも今でも意味あるの? Athlon64にPCの64ビット化を先越された時代の、その苦し紛れの拡張。 64ビット標準だけで今後PCに乗り切れる時代は来ないであろうメモリ容量をサポートしてるのに。 (理論上の限界来る前に、製造技術上の限界が来る) Winはあえて制限してるが、時代とともに緩めるだけっしょ。 このスレッドは妄想コンピュータで話すやつが張り付いているね。昔は単純な話だったけどさ。 >>413 > 64ビット標準だけで今後PCに乗り切れる時代は来ないであろうメモリ容量をサポートしてるのに。 32ビットになった時にもそんな話をしてたな w プロセスルールの限界から実用的で物理的なメモリの上限はあるんだろうけど、何がどう進化するか分からないからねぇ。 単純に超多層化プロセスルールが一般化するかもしれないし、もしかするとクラウドRAMサービスとCPUアーキテクチャが融合してその限界突破なんて時代が来るかもしれん。 人間の創造力は無限と信じよう。 4GBと言う上限は意外に早くたどり着いた 4K動画をオンメモリーで編集したいとなると 途端にぶつかる壁だな 次は誰がこの壁にたどり着くかな? Visual Studio 2017のC/C++コンパイラってどこのフォルダに置いてあるんですか (もしくはファイル名、あるいは、商標名?) 調べても「VSに付属するVisual C++にC/C++コンパイラが同梱されている」程度の 情報しか出てこない・・・ そのコンパイラは何て名前でどこに置いてあるんだ・・・ >>419 スタートメニューのVSコマンドプロンプトを開いてみい。 はい ********************************************************************** ** Visual Studio 2017 Developer Command Prompt v15.9.3 ** Copyright (c) 2017 Microsoft Corporation ********************************************************************** C:\Program Files (x86)\Microsoft Visual Studio\2017\Community \Microsoft Visual Studio\2017\Community\VC の中を compiler で検索した結果 compiler.cpp ん・・・?これ? 実行ファイルじゃなくてソースファイル・・・? 分からない、もうダメだ(絶望) その昔は cl.exe に link.exe のフロントエンドで make は別途だったが今はどうなんだろう cl.exeとかcl64.exeなどの名であると思う。 ありました!(なぜか4つも) というかcl.exeってコンパイラだったんですね コンパイラその他を呼ぶための媒介物かと思ってますた 感謝 最近はx64とかx86とかARMとかARM64とかいろんな環境があるから、コンパイラは複数必要になっている。 >とかいろんな環境があるから、コンパイラは複数必要 なるほど 勉強になりました CプログラマでいまのCPUを理解しているやつなんてごく僅か。わざわざC言語を作る必要がない。もっと高水準言語で作って、VMと優秀なコンパイラに任せた方がいい。 初心者です。 >>428 ののレスを読んでちょっと混乱しているんですが、 >>いまのCPUを理解 というのがまず何を指しているのか分かりません。 パーソナルコンピュータに内蔵されているCPUでしょうか、炊飯器に内蔵されているCPUでしょうか。 >>C言語を作る必要が無い 作らなくてもすでに存在していると思うのですが、自作が必要なものなのでしょうか。 >>もっと高水準言語 C言語自体が高水準言語だと思うのですが、これ以上の高水準とはどういう基準なんでしょうか。 自然言語をコンパイルするとかでしょうか。 >>VMと優秀なコンパイラ VMというのはVirtualMachineの略でしょうか。VM上で動作するC言語というのがあるのですか? VMを動かすほどのリソースが無いようなマシン上では何を動かすのでしょうか。 優秀なコンパイラ、ということは Cのコンパイラは優秀ではないのでしょうか。 おじい・・・紳士のみなさま、ご教授お願いいたします。 Windows でも、ファイル操作なら、Ruby ! 画面なしのツールなら、たいていのものは作れる ポインタで時間を浪費することもない 相手にするのが時間の無駄。悩む時間で基本情報とITパスポートの勉強するのがはるかにまし。 おじい、とか言って馬鹿にしちゃダメだよ。ワード、エクセルのエキスパートで、原子炉のタービンを設計するような「ものすごい人」も見てるんだからね。 あと補足だけど、30歳定年説は、人件費を削るための嘘だからね。 人不足の今時にこんなことを言ってるアホの取引先は排除すべし。 今時ハードディスク使ってモニターと照明費を削るようなケチ臭い企業とは取り引きしません! Code For Japan というイベント内でも、 PDF, Excel などの表示情報が入ったデータを、 エンジニア(住職)が供養する企画をやっているw >基本情報とITパスポートの勉強 何のことかと思って調べてみれば情報処理技術者試験のことか そう言えば昔に第一種と上級シスアドに合格してたこと思い出したわ マシン性能の限界を突破する為に、関数型プログラミングがある。 関数型は抽象表現能力は高いが実行効率を追求する様な用途向きではないぞ 生産効率も圏論などの数学的思考に慣れていないと下手すればOOPよりも悪化する可能性が高い それ以前にマシン性能を言語で突破できたらノーベル賞ものかと w CPUは関数型言語を直接実行するようにできてないから遅いでしょ。 CPUの限界を超えれる関数型言語上で関数型言語を作れば元の関数型言語の限界を突破できる。 その作った関数型言語上でまたry んなわけねーよw 関数型プログラミングはλ計算の時点で全く理想的だから 有限のアドレッシングで動いてる今のCPUには全くそぐわない だから関数型と今のCPUアーキテクチャは根柢から反りが合わないんじゃねえかと すると関数型の書法を現状の機械語に書き直すだけでロスが出てくる 理想的なモンを劣化させてるに等しいが技術上はそうするしかない そもそも関数型を直接実行できるようなCPUを人類が作れるかどうか 無限の再帰と無限のストリームが必要になっている時点で怪しい 昔どっかがLisp用にスタックコンピュータだか何だか作ってなかったっけ。 それはともかく、関数型言語でも結局どういうマシン語に落とすかだから、最適化技術で高速化は出来るはずなんだがな。 Cは低水準な操作も出来るから速いコード書けるとはいえ、素直なコードは最適化無しだと他の言語と変わらないし、 速度で言えば別に低水準な操作出来る訳でも無いFortranはC並みに速いわけで。 最適化への技術や時間の掛け方が違うってだけ。 理論的限界を超えたら、その理論のモデルが事実に反する訳だから、理論の反例になってしまう。 ループに展開されることを期待して末尾再起化にハゲむってギャグだよな。 最初からループ書けよw ループだと関数渡せないから。 あとはリストを受け取ってリスト返す関数とか、IOモナドとかは 再帰関数がそのままループになる。 (リストもモナドなので、モナドを返す再帰関数がループになると言える) 初心者です。 inline指定子について教えて頂きたいのですが、 関数ポインタからinline関数を呼び出す場合、どのように展開されるのでしょうか。 また、関数ポインタを格納する配列から呼び出すような場合はどのように展開されるのでしょうか。 inline関数の展開は環境依存 呼び出し方が如何なる方法であれ関数の構造によってはインライン展開される保証はない ループ構造を含んでいると殆ど期待できない なるほど、ありがとうございます。 まさに、 for (i = 0; i < length; i++) { func_ptrs[i](hoge); } みたいなことを試そうとしているところでした。 こういう場合は展開は期待できないということですね。 今回も勉強になりました。 gccもclangも最適化を-O3にしても if(a=='a'||a=='b'||a=='c'||a=='d'||a=='e'||a=='f') をif('a'<=a&&a<='f')に置き換えてくれないのな >>457 え?gccで -O -S で置き換えられたように見えるアセンブリ言語出力したぞ。(97引いて5以下かどうか見ているやうなやつ)。 -Oなしだと一つ一つ比較していて明らかに違う。 CPUによっては一つ一つ比較するように書いた方が速いなんてこともあるのかも知れないが、普通はそうならないように思う。 ソース全体で見たときに(a < 'a') や (a > 'f')の可能性もあるから最適化されないということでしょうか? >>457 >>461 a=='a'のときにべたの方が速いからだろ。 a-fが均等な確率だ、というのをコンパイラに対して教えてないし、教える方法もない。 だからコンパイラが勝手にそこを改変するようでは困るだろ。 (大半がa=='a'と分かっていて最速コードが欲しいときに記述出来なくなる) C言語はそういう言語なんだよ。自動的に勝手にやってくれる言語ではない。 細部まで自分で指定できるからこそ極限までチューニング出来る。 最速コードが欲しければ、a-fの確率まで考えて、自分で指定しろ、でしかない。 ワシのとこでも -O で「即値97を引いて即値5と比較…」が出たわ。 -O なしだと真っ正直に即値との比較が6回。 >>457 に書かれた通りの ('a'<=a&&a<='f') にならないと言っても、 'a'以上か? 'f'以下か? の判定2回よりもっと効率的になってるでしょ。 もちろん gcc のバージョンによる違いかも知れんが。 >>454 ときどき夢にみます、inline 指定がどんな場合にも百発百中 inline になるコンパイラがあればどんなに嬉しいか… >>463 あー。なるほど。 かといって言語の規格として最適化についてまで決まってたっけ? その辺は決まってなくてコンパイラしだいのような気がするが。 >>465 しかし関数へのポインタが作れてしまう時点でそれはもう inline ではなくなっているように思うのだが。 >>466 規格云々以前に、適用ヶ所と文化の問題。 C言語がガチで使われている領域はそういうところだから、「書いたとおりのコードを吐け」でないと困るし使えない。 だから適当に改変するコンパイラは嫌われる。 対してC++は「出来るだけコンパイラにやらせる」思想だし、そもそもCほど掘り下げる使い方はされないから、 「可能な限り自動的に最適化しろ」な気はするが。 C言語のアセンブリがすぐ確認できるサイトで調べてみたんだけど、 違うみたいだね。 >>467 なるほど… そういうときは、call されたときは inline に展開するけれども、関数のポインタとして渡されたときに動かすためだけに(実際にポインタから呼ばれるかどうかは考えずに)inline の関数を別にバイナリーに展開しておくっていうのはどうですか? >>470 関数内でstaticの変数が宣言されるケースも忘れずに。 >>475 まずお前がガイジじゃないことを示せよ ゆとりなら死ね うわっ、ガイジと言うよりマジキチやん ⇒ ID:y280e6J90 >>477 が意味深になってて笑うわ >>464 どうやったらそんなコードされるの? なにをやっても全部比較しかでないのだが いまやったら引き算と比較一回になった。 別の関数の中に比較を入れないと駄目みたいだった。 一個ずつ比較させたいときはvolatileを使えばいいんだな。 最適化をいれるとaが定数だとaが消されるからaを別の関数の引数にすることで 消されないようにできる。 volatileで消さないようにするとなぜか比較が最適されない。 >>480-481 それはvolatileの間違った使い方だから止めとけ。 最近そういう投稿も多いが。 最適化は処理の最中に使う変数が外部(別スレッドや割り込みハンドラ)から変更されないということを前提としてるから、volatileつけるとaの比較途中でaそのものが変更されるかもしれないので逐一比較になる。 まぁスタック上のローカル変数aが外部から変更されるってのは通常は単なるスタック破壊のバグだけどね。 >>468 おまえ4.3BSDのccとかまだ使ってるのか? >>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と比較 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる