2
3
5 :
デフォルトの名無しさん :04/07/18 00:58
-foptimize-sibling-calls という最適化オプションがありますよね。 マニュアルには "Optimize sibling and tail recursive calls." とだけあってよくわからないんですが、これってたとえば以下の ような無限に再帰する可能性のあるコードでスタック使い切るのを 抑制できるんでしょうか? #細かい文法は省略 int a() { xxx; yyy; if (foo) { return b(); } else { return c(); } } int b() { yyy; zzz; if (hoge) { return c(); } else { return a(); } } int c() { return 1; }
んなわけあるかい。 有限の再帰をループ展開してくれるだけだよ。
>>5 その通り。
>>6 末尾再帰の最適化というものを知らないなら知らないなりに、
試してからものを言いなさい。
Fedora Coreを手に入れて、C++プログラミングをしようとした。
Hello Worldを作ると、警告になった。
http://www.linuxhelp.net/forums/index.php?act=ST&f=3&t=3399 昔とはiostream.hの使い方が変わったんだね。
#include <iostream>
using namespace std;
int main()
{
cout << "Hello Programmer!" << endl;
cout << "Welcome to the World of C++!" << endl;
return(0);
}
随分とC++にはご無沙汰だったご様子で。
>>9 仕事でCとかC++を使った経験がない。
業務経歴の半分はインフラ。よくわからずにmakeしていた。。。
今回、makeの勉強をやろうと思い、簡単なC++ソースを作成。
そこで変わったことに気付いた。
最初にC++の勉強をしたのは4年ぐらい前かな?
4年前は変わった後だよ!
>>8 今はreturnには括弧をつけないスタイルが主流。
>>12 昔はreturnには括弧をつけるものだったの?
int i = (0); 今は定数代入には括弧をつけないスタイルが主流。
(fputc('\n', stdout)); 今は関数呼出には括弧をつけないスタイルが主流。
16 :
デフォルトの名無しさん :04/07/18 17:30
#define MAX(a,b) a > b ? a : b 今はマクロ定義には括弧をつけないスタイルが主流。
gmakeというものを知った。 GNUmakefileを読み込むんだね。
やったーーー!! PostgreSQL7.4.3をコンパイル・インストールできたあ。 一発でできるなんて、凄いよ。
19 :
デフォルトの名無しさん :04/07/18 20:16
>>18 一番大変で難しいのはその後の動作確認なんだが・・・
>>19 プロセス起動してテーブル作成までできたよ。
上げんなボケ!! こんなマイナーねたは下げでやるに決まってるだろ!! 糞害虫が
>>21 ほう、プログラム板にも私を知っている人間がいるんだね。
今日、PostgreSQLのソースを解析しようとした。 でも、挫折。。。 いきなりメモリ関連の記述。 わからないよ〜。 ヘッダーファイルをたくさん宣言していて、いきなり関数を使用している。 どのソースで定義された関数なのかわからない。 私の目的。インフラの仕事に合わせて既存ソフトウェアの勉強をする。 そのためにソース解析までして深く理解しようとした。 でも、これじゃあ、時間ばかりかかって成果がでない。 結局、コンパイル・インストール・設定の勉強をする方針に戻した。
ここは日記スレじゃないんだけど。
流れが速いスレなら個々人がNG設定すればいいんだけど、ここみたいにトロいスレだと 単にいちコテが占有してる状態になってしまう。これって削除依頼物だから 早目に空気読めてないのに気付いて消えてね。
「cygwin + mingwn + gcc 相談室」もあるし、ぶっちゃけこのスレい らない。
>>27 勝手に決めんな。
cygwinやmingwnの環境では無い奴はどうするんだ?
むしろ、cygwinやmingwnで開発するケースは少ないし、あってもどうせ趣味ぐらいだろ。
いやそれよりもwinから離れろ。
それこそ決め付けんな、むしろMinGWなら知ってるがmingwnってなんだと突っ込みたいが、 それはさておきこのスレがWinべったりだったりしたら、それはそれで確かに問題だ。
30 :
デフォルトの名無しさん :04/07/20 21:39
ちょっと関係無いけど質問します。 Pentium M は 686ファミリー でいいのでしょうか?
アセンブラスレのほうが的確な返答がくると思う
32 :
デフォルトの名無しさん :04/07/23 05:37
age
How are you? > this thread
Fine! And you? > 33
以下のコードがコンパイルできないけど何故? asm (" movl $123, %%eax addl %0,%%eax " :: "r"(i));
>>37 asmに食わせてる文字列が生き別れになってる。
ちゃんと繋げ。
>>37 こうか?
asm (
"movl $123, %%eax \n\t"
"addl %0,%%eax \n\t"
:: "r"(i));
でも、よく
>>37 のようなコードを見掛けるが
gccのバージョンでできたりできなかったりするのか?
>>39 どのバージョンだった忘れたけど(たぶん3.0あたり)、行をまたぐ
文字列を食わせると"これはANSI違反で将来のバージョンでは
エラーにするヨン”というような警告を出していたから、恐らく
3.0以前では出来たはず。 今でもオプションで出来るかもしれない。
3.1じゃなかったっけ?cppの挙動が変わった時に受け付け無くなったような気がする。 -traditionalで受け付けるようになるかな。
はっきり言って、
>>37 のようなソースコードを
ちまちまと変換するのめんどくさいっす。
なんとかしちくれ。
>>41 RedHatにのってる3.2ではまだ警告だね。-traditionalでも警告出た。
-std=xxxをかたっぱし試したが変化なし。
3.4.1でもダメ。
うーむ、もはや
>>37 のソースコードは負の遺産なのか?
gcc,multi-line,stringでぐぐるとこれが問題になった人は沢山いるようだね。
しかしgccチームはこれは危険なgcc拡張であり、使われるべきでないもの
という主張を貫き通しているようですね。 しかたがないからperlスレでも
いってこのコードを自動的に書き換えるスクリプトを捜すか開発して
ここにご報告ください
>>37 。
>>45 >しかたがないからperlスレでもいってこのコードを自動的に
>書き換えるスクリプトを捜すか開発してここにご報告ください
>>37 。
ワロタ
>>37 が報告をするんかい
一つ聞きたいです。
以下のサイトで「JavaはCよりも速い!?--驚異の"-server"オプション」
ttp://www.geocities.jp/toshio16369/column/021108a.html を見ててまさかCがjavaよりも遅いなんて何かの間違えだろ。
と思いgccの最適化オプションを余すところ無く指定して計ったのですが
"java -server"に負けてしまった。くそ〜、何故だ!!
(もちろん、-serverを指定しないのと比べるとCが早いのだ)
何故、-serverを指定して早くなるのか?
(まさか、loopを端折ってねーだろーな、という疑問があるが)
わかる方いますか?(gccにはまだ最適化の余地があるんだろうか?)
gccは、3.4.1です。以下がオプションです。
gcc Bubble.c -o Bubble -O3 -fomit-frame-pointer -fexpensive-optimizations -ffast-math -funroll-all-loops -msse2 -m3dnow
あ、言い忘れたけどデータ数は200000件でテストしました。
-mcpu=pentium4
>>49 >-mcpu=pentium4
だめでした。うーむ。"-server"で何が行われてるんだろうか?
おまえさんの環境と、測定方法と、測定結果をそれぞれ出してみてくれ。
>>47 -fprefetch-loop-arrays
>>51 >おまえさんの環境と、測定方法と、測定結果をそれぞれ出してみてくれ。
Athlon 64 2800+ Mem 2G
測定方法は、
>>47 で書いたサイトと同じです。200000件
gcc: 1m23.851s
java -server: 1m12.928s
>>52 >-fprefetch-loop-arrays
gcc キタ━━━━━━( )(゚ )(∀゚ )(゚∀゚)( ゚∀)( ゚)( )━━━━━━!!
gcc: 0m59.120s
java -server: 1m9.745s
gccの方が、およそ20秒程早くなりました。
thanxです。
どうやら、javaでは、gccで言うgprofデータを基にコンパイルする“最適化コンパイル”見たいな手法
をしているようです。
JDKのバージョンいくつ? 1.4.2_01だったら2分だったのが 1.4.2_05だと1分だった (Pen4-2.5G)
>>50 > うーむ。"-server"で何が行われてるんだろうか?
-server: HotSpot server VM (実行時間改善最優先)
-client: HotSpot client VM (起動時間も考慮)
-classic: JIT VM
Servletなどは長時間同じコードが実行し続けられるため。
>>54 その最適化すべき区域を"HotSpot"と言っている。
-funroll-all-loops, -funroll-loopsは設定しない方がパフォーマンスが上がります。
そりゃ、-funroll-all-loopsには"This usually makes programs run more slowly"と 書いてあるしね。-funroll-loopsも、最近のキャッシュヒット重視アーキテクチャだと 遅くなるのが普通だわな。
その辺を実行時に考えながらやってくれるのがHotSpotですよ。 実行時にしか決まらないようなことでも最適化できる。
>>59 C/C++ でも、実行時プロファイルをとって、それをフィードバックして最適化に
反映するツールがある。
gcc だと「gcc "profile feedback"」で検索するとイロイロ出てくるけど、使い物に
なるかは不明。
javaは、自動で最適化を実行(実行後にコードが変化するイメージかな?) gccは、事前に手動で最適化を施す ってことですよね?
VCで書いたインラインアセンブラを GCC用に書きなおしているのですが VCとGCCでは全く表現が異なっているため (例 eax→%%eaxや[eax+8]→8(%%eax)など) 非常に苦労しています。 どこかにVCからGCCへ移植するための 解説ってありますか?
みなさん、gcovは御存じですか? man gcov
はあ
>>62-63 がーん!いいものがあるなあ!
漏れも使わせてもらおうっと。
ありがとう。
>>63 自動で変換してくれるような賢いツールはないかしら。
>>63 たまたま今日探してたものが...
一時間ぐぐっても見つけれなかった漏れってorz
gccとiccはどちらが、より最適化されたバイナリを生成しますか?
71 :
デフォルトの名無しさん :04/08/18 13:09
ぐしし
いくく
>>73 これじゃだめか?
#define TOSTR(s) #s
#define ADR(k) TOSTR(k*2+1(%%eax))
asm( "mov "ADR(2)",%%ebx" );
↓
asm( "mov " "2*2+1(%%eax)" ",%%ebx" );
↓
asm( "mov 2*2+1(%%eax),%%ebx" );
k→(k)
>>74 ありがとうございます。
これでゴールにたどり着けそうです。
-fschedule-insns,-fschedule-insns2ってなんですか?
info gccぐらいしろよな
>>78 やりましたが、最適化オプションとしかわかりませんでした。
$man gcc -fschedule-insns If supported for the target machine, attempt to reorder instruc- tions to eliminate execution stalls due to required data being unavailable. This helps machines that have slow floating point or memory load instructions by allowing other instructions to be issued until the result of the load or floating point instruction is required. Enabled at levels -O2, -O3, -Os. -fschedule-insns2 Similar to -fschedule-insns, but requests an additional pass of instruction scheduling after register allocation has been done. This is especially useful on machines with a relatively small num- ber of registers and where memory load instructions take more than one cycle. Enabled at levels -O2, -O3, -Os. 誰か違いの分るテストコード書いてくれ
int f (int a, int b, int c); int g (int a, int b, int c) { return f (-c, -b, -a); } これが-fno-schedule-insns2 negl %eax movl %eax, 12(%esp) negl %edx movl %edx, 8(%esp) negl %ecx movl %ecx, 4(%esp) こっちがあり negl %eax negl %edx negl %ecx movl %eax, 12(%esp) movl %edx, 8(%esp) movl %ecx, 4(%esp)
man gccの日本語訳見つけた -fschedule-insns ターゲットマシンにおいてこのフラグがサポートされている場合は、必要なデータを利用可能になる まで待つことによる実行の遅滞を防ぐために、命令の順番の変更を行います。これは遅い浮動小数点 命令やメモリ読み込み命令の実行において、それらの結果を必要とする命令の前に他の命令を詰め込 みます。 -fschedule-insns2 `-fschedule-insns' と似ていますが、レジスタ割当て処理の後にもう一度命令スケジューリングの 段階を置きます。これは、比較的レジスタ数が少なく、メモリロード命令が 1 サイクルよりも多 く を要するマシンにおいて、特に効果的です。
>>81 gcc 3.3.3では、全部同じコードですけど何故?
-fno-schedule-insnsも-fno-schedule-insns2もオプション無しも以下のコード
negl %eax
movl %eax, 8(%esp)
movl 12(%ebp), %eax
negl %eax
movl %eax, 4(%esp)
movl 16(%ebp), %eax
negl %eax
movl %eax, (%esp)
>>84 -O3だけだと。
movl 8(%ebp), %eax
movl 12(%ebp), %edx
movl 16(%ebp), %ecx
negl %eax
negl %edx
negl %ecx
movl %eax, 16(%ebp)
movl %edx, 12(%ebp)
movl %ecx, 8(%ebp)
gcc --helpでも説明がちょっとあった。 -fschedule-insns2 レジスタ確保の後で命令を並べ直す -fschedule-insns レジスタ確保の前に命令を並べ直す
>>85 じゃあいいんじゃないの?
fno-ってやらないって意味だよ。
まとめると、 「君のgスポットを探そう!」
c++ファイルをコンパイルするとき、毎回オプションとして-fomit-frame-pointerだとか -funroll-loopsを書いているのですが、これらをsshのssh_configのようにデフォルトとして、 どこかに書いておくことはできないのでしょうか?
>>91 シェルでaliasしとくか,
$ cat g++_with_flag_optimaize
#!/bin/sh
FLAG='-fomit-frame-pointer -funroll-loops'
/usr/bin/g++ $FLAG "$@"
exit $?
$ g++_with_flag_optimaize hoge.cpp
なんてのはどうですか?
もし,g++_with_flag_optimaizeのファイル名をg++とするなら,
PATHにオリジナルのディレクトリより先に指定しておくと優先されますよ.
もちろん92のようにMakefileで指定するのが一番いいとは思いますよ.
Makefileで、 include ~/.makefile $ cat ~/.makefile CXX=g++ -Wall -pedantic -fomit-frame-pointer -funroll-loops
96 :
デフォルトの名無しさん :04/08/24 12:27
コンパイルを複数のCPUでおこなうことは可能ですが、 ネットワーク上の他の複数PCのCPUをつかって コンパイルする方法ってありますでしょうか?
97 :
デフォルトの名無しさん :04/08/24 12:29
Plan9ならできる。GCCは使えないだろうけど。
distcc
distccいいよ〜 今もお気楽コンパイル中
101 :
デフォルトの名無しさん :04/08/24 12:47
distccってLinuxマシン1台Windowsマシン3台で Linuxカーネルコンパイルできますか? できるならどうやってやるの?
>>101 研究室のマシン全部にそっとdistcc仕込んだんじゃネーノ?
>>102 Cygwinとかで、クロス環境つくれば由
以前やったのは、PS2の開発現場で、(当時はなかったので)
手製 distcc 相当のものを。Cygwin で作ったクロスコンパイル cc1plus は
なぜか安定させることができなかった。
ていうか今なら、coLinuxの上でcc1走らせればええんでネーノ?
どうもありがとうございます。 試してみます。 これでかなり作業時間が短縮できそう。 感謝!!
分散コンパイルが必要なほど強烈なコードを扱ったことないのでアレなんだけど、 Cygwin上とかの遅いGCCを相手にしても釣りが出るほど良いものなのですか? 想像力不足で、メリットのほどがいまいちわからん。
107 :
デフォルトの名無しさん :04/08/25 06:59
108 :
デフォルトの名無しさん :04/08/25 08:42
>>107 make&&make installでいい
普通にREADMEとかINSTALLの通りにビルドすりゃいいんでしょ? 関係ないがGCCくらいになると ビルドディレクトリを別に作ってビルドした方がよい希ガス $ tar -zxvf gcc-x.x.x.tar.gz $ mkdir gccbuild $ cd gccbuild $ ../gcc-x.x.x/configure $ make
>>109 ていうか、ほぼマスト。
別にしないと、自分をビルドするためのコードを
平気で上書きとかしやがりますよ。
クロスコンパイル用にコンパイルするとかじゃないなら
大抵は素直に通るけど、実は結構エラー吐くことも多い。
それ以前の所で引っかかってる気がして仕方ないが、
GCC落としてきたところのMLだのニュースグループだの
良く読んで再トライしてみれ。
111 :
デフォルトの名無しさん :04/08/27 13:32
別のディレクトリでやらなくても問題なく通ったが。 もし問題があるのならglibcみたいにconfigure時に止めるでしょ。
>>111 …すまん。
glibcのビルドも絶対一緒にやるもんだとばっかり思い込んでたよ…。
113 :
デフォルトの名無しさん :04/08/29 10:01
gccをアップグレードするときは、現在あるgccを上書きするのではなく、別のディレクトリにインストールしてそこにパスを通す方がいいのでしょうか?
そりゃ、万が一問題が起きたら、被害甚大だから。 別のとこに放り込んどいて、シンボリックリンクすれば?
>>113 同じ所に突っ込んでも古いのは消えない。-Vで古いのも使えるし。
3.3でそのへんの仕様が変わったのがいやんだけどねえ。
116 :
デフォルトの名無しさん :04/08/30 11:43
long longの変数をint型の変数に代入した時、警告するようなオプションってありますでしょうか?
boost::numeric_cast
げ。ほんの2ヶ月前でやんの。
>>109の通りにやったのですが、make途中でエラーが出て止まってしまいます。 suse9.1を使っています。どうしたらよいのでしょうか?
122 :
デフォルトの名無しさん :04/08/31 14:05
エラーメッセージも書かない奴
123 :
デフォルトの名無しさん :04/08/31 15:12
>>122 初心者にはありがちですな。
英語は全部読み飛ばしている様子だし。
まあしかし暖かく見守っていきましょうよ。
>>123 挙がってるパッチはそうだけど、
スレッド追っていくと、"warn for any implicit conversion that may change a value"
という仕様を視野に入れていてくれそうな感じ(に読み取れた)。
126 :
デフォルトの名無しさん :04/09/01 06:19
インストール方法を詳しく解説した日本語のページがあれば教えてください
127 :
デフォルトの名無しさん :04/09/01 07:57
「gcc インストール」でぐぐれ
128 :
デフォルトの名無しさん :04/09/01 09:23
>>126 INSTALL/以下のHTMLファイルをどこかにおいてExcite翻訳へ
rootではなくてもインストールすることはできますか? たとえば自分のホームディレクトリにインストールして、使用することはできるのでしょうか?
>>129 --prefix 指定すればどこでも好きなとこにインストールできっぺ。
っていうか、nested functionってCで使えたんだ・・・
Cでというかgccでな。 ここはgccスレだが標準Cでできると勘違いされるとアレなので一応
Pascalで書くときはそれなりに便利だったが、Cで配布するコードに使おうとは思わんなあ。 誰も使っていないような機能は信用出来ないし。
使えりゃ使えたでそりゃ便利なんだが、蕎麦アレルギーより遥かに深刻な 潜在的アレルギー持ちが大量に死亡する予感
enbug書いてる人って億児さんだっけ? 個人的にはコンパイラのバグを誘発するようなコード書く側にも 問題あるとおもうよ。あら捜しはテストコードだけでやればいい。
gcc3の最高傑作は3.3.4、と、あと10年は語られるだろうな。
gcc-1.4.2 サイコー
142 :
デフォルトの名無しさん :04/09/04 10:18
>>139 バグが見付からないとdejagnuにテストが追加されない罠。
そもそもdejagnuのテストもあんましあてにならんからなあ。
結局使う人が苦労すると。
>>140 いまだに3.2.3使ってるんだけど、大雑把に言ってどのくらい違うもの?
145 :
デフォルトの名無しさん :04/09/04 17:04
long doubleの精度に関する質問です。
まず、私の環境は以下のとおりです。
cpu optern248
os fedora core 2 for x86_64
compiler gcc 3.3.3
以上の環境で以下のプログラム(test.c)
#include <stdio.h>
#include <math.h>
main()
{
float x=0.1;
double xd=0.1;
long double xdl =0.1L;
printf("%40.35e (size=%d)\n",x,sizeof(x));
printf("%40.35e (size=%d)\n",xd,sizeof(xd));
printf("%40.35e (size=%d)\n",xdl,sizeof(xdl));
}
をコンパイル'gcc -lm test.c'して実行させた結果、
1.0000000149011611938476562500000000000000e-01 (size=4)
1.0000000000000000555111512312578270211816e-01 (size=8)
1.0000000000000000555111512312578270211816e-01 (size=16)
という結果が得られます。
double とlong doubleで精度が同じように見えるのですが、実際のところどうなっているのでしょうか?
http://www.turbolinux.co.jp/world/library/features/SoftwareDesign/200401/AMD64/64bit-ch3a-2.html を見るとx86_64では128bit浮動小数点演算がサポートされているとあります。
>>145 その printf() は long double に対応していますか?
147 :
デフォルトの名無しさん :04/09/04 17:35
>>146 その辺のことも疑ってみないといけないのですね。
とりあえず倍々精度、128bit-FP、long doubleでprintfをぐぐって見ます。
148 :
デフォルトの名無しさん :04/09/04 17:49
145です。 long doubleを表示させるときは”Le”を使うんですね。 man 3 printf に書いてありました。 普段long doubleなんて使わないので気づきませんでした。
>>144 3.3が凄いというよりは3.4が酷すぎる
>>150 3.2や3.3より退化してる時点でダメダメ
>>151 paser取っ換えたんだから少しは...
153 :
デフォルトの名無しさん :04/09/07 14:28
3.4.2って prefetch-loop-arrays を無視するんでしょうか. 以前に挙げられ
ていたベンチでどうしても Java より遅くなります.
gcc (GCC) 3.4.2 [FreeBSD] 20040728
java version "1.4.2-p6"
という環境で10万要素をバブルソートすると
25sec, gcc -O
25sec, gcc -O2 -march=pentium3 -fprefetch-loop-arrays
18sec, java -server
となる.
>>54 >
>>52 > >-fprefetch-loop-arrays
> gcc キタ━━━━━━( )(゚ )(∀゚ )(゚∀゚)( ゚∀)( ゚)( )━━━━━━!!
154 :
デフォルトの名無しさん :04/09/07 14:35
-fverbose-asm
アセンブルしてみると確かにプリフェッチをしてるみたいです. ということで キャッシュ量の二倍, 50万要素で比べてみました. 980sec, gcc -O2 887sec, gcc -O2 -march=pentium3 -fprefetch-loop-arrays 889sec, java -server 確かに効果がある? ようです.
156 :
デフォルトの名無しさん :04/09/08 14:38
-Oオプションの数字はいくつまであるのでしょう?教えてください、偉い人。 -O3? -O5?
157 :
デフォルトの名無しさん :04/09/08 14:44
>>156 3まで。
ちなみに-O10を指定すると下位2ビットだけ見て-O2が指定されたものと見なされる。
javaに負けるgccって存在価値あるの?
160 :
デフォルトの名無しさん :04/09/08 22:20
161 :
デフォルトの名無しさん :04/09/09 00:33
3.4.2 age
bccだろうがiccだろうがvc++だろうが負けるときゃ負ける。
163 :
デフォルトの名無しさん :04/09/09 07:37
gccってなんて読むの?
>>159 java で Linux コンパイルできるのかよ。
>>163 えんはんすと ぐらふぃっく ちゃーじゃー
binutilsなしで行けるのか?
>163 グッシッシ
169 :
デフォルトの名無しさん :04/09/09 13:34
GRCGとEGCの区別がつかない香具師の数
173 :
デフォルトの名無しさん :04/09/10 14:40:42
2chは日本人以外書き込み禁止ですよ。
不自然さのない日本語を話せるならいいだろ
172の英語間違ってるし
間違ってないじゃん・・・と思ったけど addじゃなくてaddedだな
178 :
デフォルトの名無しさん :04/09/11 11:48:09
現在alphaとopteronの2つのマシンを使っているのですが、コンパイル時にCUPを自動で判別してコンパイル方法を教えてください。 具体的には、 #ifdef XXXX alpha用コード #else opteron用コード #endif みたいな感じでやりたいのですが、XXXXの部分がわかりません。教えてくださいエライ人。
-v
>>178 そこに asm でも入らない限り、CPU別の判定はナンセンスだと
感じるんだが、それを行いたい目的は何? ヒューリスティックに求めた
「xxx向きの算法」を条件分けて入れたいのかな?
質問で返してスマン。
182 :
178 :04/09/11 13:23:37
178です。ご回答ありがとうございます。 opteronでSSEを使ったプログラムを書きたいと思っています。
コンパイラオプション指定すれば勝手にSSE使うけど・・・
>>182 オプテロンではデフォルトだよ!
CPU指定してんのか?
builtin_define ("__alpha"); builtin_define ("__alpha__"); builtin_assert ("cpu=alpha"); builtin_assert ("machine=alpha"); builtin_assert ("cpu=x86_64"); builtin_assert ("machine=x86_64"); builtin_define ("__amd64"); builtin_define ("__amd64__"); builtin_define ("__x86_64"); builtin_define ("__x86_64__");
ポレのは386Mだったんで、GRCGしか使えんかった。 ような希ガス。
懐しい話だが、どこの誤爆だ?
189 :
デフォルトの名無しさん :04/09/13 18:16:22
169は関係ない
September 9, 2004 The next major version of GCC following the current 3.4 release series will be called GCC 4.0.
4日も前のニュースかよ
ここに張られていない以上はヌースと言ってもよさげ。 しっかし、あの酷い出来の後じゃなぁ・・・当分3.3.1を使うことになりそう。
gcc 4.0になるってそんなにメジャーな変更があるのか?
c++とjavaはわりと変更大きそうだけど
D言語が入るとか?
入らないんじゃね?
むしろParrot+Perlとか入ったりして
GCC 3.4は酷いの? 一部では最適化が強力になって早いという話も聞いたんだけど。
GDCならもうあるんじゃね?
>>199 GCCのメンバーと関係無い香具師が勝手に作っただけの
非公式版だろ
>>198 最適化が多少良くなってもバグだらけじゃ意味無いしね
仕様が厳しくなったのに肝心のgccが駄目ぽってのはいやん
確かにGCC 3.4はバグが多い気も。。。 3.4.3あたりでまともになるのかな?
204 :
デフォルトの名無しさん :04/09/14 01:13:07
GCCのさいて
-fprefetch-loop-arrays の話ですが, -O の時は -fstrength-reduce を付け ないと prefetch しないようです. また, -O -fstrength-redue -fprefetch-loop-arrays と -O2 -fprefetch-loop-arrays とでは, -O の方が性能が良くなりました. GCC 3.4.2 の最適化がショボイんでしょうか.
207 :
デフォルトの名無しさん :04/09/14 17:37:17
はあ
>>205 これこそgccネタとしてふさわしい。
オプションの指定しだいで最適化されるかされないか、そんな雰囲気がいいんじゃねーか。
>>206 は、すっこんでろ。
で、-O3 -fprefetch-loop-arrays -fstrength-reduce -fomit-frame-pointer -fexpensive-optimizations これ最強。
まあお前らド素人は、-Osでもやってなさいってこった。
>>206 コンパイラ書く側に立ってないんじゃ、あんたもド素人だと思うよ。
ソースも示さないんじゃ、こっちで試しようがないよ。
カーネルに興味持つ香具師は多いけど、コンパイラやインタプリタの ソースを見ようとする奴は少ないね。なんで?
コンパイラは道具だから?
コンパイラ見る奴ってカーネル見る奴に比べてそんなに少ないかな? かなりいるであろう最適化好きはカーネルよりもむしろコンパイラの方見てそうだけど
コンパイラのコードが自動生成されてて読むに耐えないものだから
まあ過疎スレなんだし、>205の日記帳として使うのもありじゃない?
自動生成するコードが面白いんじゃないの?
gcc&コンパイラハカー、カコイイ!!
オープンソースなのにソース読まないのは、 民主主義なのに法律しらない奴と同じだよな
Kなんかがいくら独自拡張やっても、んなコード誰も読みたくないから取り込まれない
自動生成元のコード読めよ
>>209 あんた「も」って、一言もド素人とは言っていないが。
>>208 -fomit-frame-pointer って、かえって遅くなることありません?
ていうか遅くなる事のが多いよ
遅くなったことなんかないと思うけど。 余計な手続きをしないってだけだから 遅くなることはまずないんじゃないの?
ここは想像で語るスレではありません。
じゃあ遅くなるソース見せなよ。 関数使ってないんじゃないの?
>>224 > 余計な手続きをしないってだけだから
余計な手続きが必要になるのは, 付けたときの方だよ.
3.3.3 + i686で-fomit-frame-pointerしてみましたが、 object codeは何の変化もありませんでした。
関数使ってないからだろ
$ cat foo.c #include <stdio.h> int main(void) { return printf("\n"); } $ gcc -c -g foo.c $ objdump -S foo.o > /tmp/foo $ gcc -c -g -fomit-frame-pointer foo.c $ objdump -S foo.o > /tmp/bar $ diff /tmp/foo /tmp/bar $ gcc -c -g -fno-omit-frame-pointer foo.c $ objdump -S foo.o > /tmp/baz $ diff /tmp/foo /tmp/baz $
関数呼び出してないんだから当り前だろ int f (int a) {return a * 2;} これで-Sでやってみなよ
でどうだったの?
いや、それ関数呼び出してないじゃん?
俺は
>>230 のが関数使ってないって書いたんだけど
だから違いの分かるコードを見せただけ
むしろ、-fomit-frame-pointerというのが何をするかわかってない奴がこのスレにいるに1000マルク。
ノシ
-fomit-frame-pointer使うと フレームポインタをレジスタに格納しないので、 フレームポインタにアクセスする時に遅くなる。
>>208 のオプションって頭悪いな
gcc -O2
だけで
-fdefer-pop -foptimize-sibling-calls -fcse-follow-jumps -fcse-skip-blocks
-fexpensive-optimizations -fthread-jumps
-fstrength-reduce -fpeephole -fforce-mem -ffunction-cse
-fkeep-static-consts -fcaller-saves -freg-struct-return -fgcse
-fgcse-lm
-fgcse-sm -floop-optimize -fcrossjumping
-fif-conversion -fif-conversion2
-frerun-cse-after-loop -frerun-loop-opt -fdelete-null-pointer-checks
-fsched-interblock -fsched-spec -fbranch-count-reg -freorder-blocks
-freorder-functions -fcprop-registers -fcommon -fgnu-linker -fregmove
-foptimize-register-move -fargument-alias -fstrict-aliasing -fmerge-constants
-fzero-initialized-in-bss -fident -fpeephole2 -fguess-branch-probability -fmath-errno
-ftrapping-math -m80387
-mhard-float -mno-soft-float -malign-double
-mieee-fp -mfp-ret-in-387 -mstack-arg-probe -maccumulate-outgoing-args
-mcpu=pentiumpro -march=i386
が有効になるのにな。
少なくとも -fstrength-reduce -fexpensive-optimizations は必要ないな
241 :
デフォルトの名無しさん :04/09/15 16:49:45
-mcpu=pentiumpro -march=i386 -mcpu=pentiumpro -march=i386 -mcpu=pentiumpro -march=i386 -mcpu=pentiumpro -march=i386
>>238 > フレームポインタにアクセスする時に遅くなる。
嘘つけ。
>>242 じゃあレジスタアクセスとメモリアクセスどっちが速いと思ってるの?
まあまあ。 悪いのはspのアドレッシングモードが貧弱なx86のせいということで、喧嘩は止めようぜ。
>>243 >じゃあレジスタアクセスとメモリアクセスどっちが速いと思ってるの?
おいおい、その問題と-fomit-frame-pointerは違くないか?
-fomit-frame-pointerなんて無条件に付けとけばいいじゃんて結論に達したのは その当時俺がそれを調べてたマシンが68kだったからだな。 x86では確かに厳しげ。
>>246 デバッグするのでは無いなら無条件につけてもいいような気もするが。> -fomit-frame-pointer
248 :
デフォルトの名無しさん :04/09/15 23:30:39
恐いよ
フレームポインタにアクセスする時に遅くなるよ
同じボケは繰り返さない。
アクセスする必要がない関数のときだけレジスタを使わないようにするんだよボケ。
-fomit-frame-pointer使うとEBPに入るはずのフレームポインタが スタックに載っちゃうんだよ。遅くなるに決まってるじゃん。
-fomit-frame-pointer付けて allocaとかsetjmpとかその辺のEBP使う関数使うとぶっこわれんの?
>>253 極端に遅くなるだけじゃないの?
スタックに載るんでしょ?
>252は本気で言ってるのかな。 通常はEBP経由でアクセスするスタックフレーム(引数/ローカル変数)を ESP経由で直接アクセスするようになるだけなのに。
たかが一個のコンパイラオプションだけでこんなに騒げるgccは素晴らしいな
>>257 それはx86なんて糞アーキテクチャだからだろ
速度が低下する「こともある」を示しているだけにしか見えないが
-fomit-frame-pointer は有利に働く場合も不利 に働く場合もあると思う。このオプションは他のレジスタを割り当 て可能にする。一方 x86 が命令セットを解釈するやり方から考え て、スタック相対アドレスはフレーム相対アドレスよりも大きなス ペースを必要とする。したがってプログラムで利用できる I キャッシュが少なくなってしまう。同様に -fomit-frame-pointer を指定するとコンパイラはスタックポインタを命令コールのたびに 再配置するが、フレームがある場合はスタックアキュムレータを数 命令で使いきってしまうことになる。
ただ、mozillaとかSDLとか一部のプログラムでは -fomit-frame-pointer が入っているとcore吐いて落ちるケースがありました。
「フレームポインタ」の意味が分かってない奴の発言 >238 >243 >249 >252 (>257?)
こんな壊れたコードを量産する fomit-frame-pointerなんか使ってる香具師の気が知れんね
なるほど、理論的な「遅くなる原因」を示せなかった(理解してなかった)ので 「遅くなるから使えない」をやめて、今度は「バグがあるから使えない」に変更しましたか。 まあ、それは正しいと思うけど。
誰かそのbugを要約して オフセットの計算ミス?
fomit-frame-pointerなんてだいっきらいだ。 漏れが書いたC++のコードだってまともに動きやしなかった。 VC++7.1なら/Oy付けてもちゃんと動いたのに。
271 :
デフォルトの名無しさん :04/09/16 01:48:20
随分伸びてると思ったらくだらないののしりあいですね
性能については
>>244-245 に尽きる。
品質については…まあいかにもバグがでそうな機能だと思う。
ののしりあいというより、バカがボウフラのごとく涌いているだけ。
確かにバグがあったバージョンもあったかもしれないが、 正直、-fomit-frame-pointer自体には罪はないような気がするが。
Linux(x86)は、デフォルトで-fomit-frame-pointerを使用してます。
あ、言い忘れたけど
>>277 はカーネルのことです。
>>276 > 正直、-fomit-frame-pointer自体には罪はないような気がするが。
そうだよ。-fomit-frame-pointerで遅くなるってわめいてる奴は、
アクティベーションレコードが何なのかもわかってないのさ。
ようするに-fomit-frame-pointerを理解せずに使うなよ、ということでこの件は終了でいいですか?
無条件に使えでいいんじゃないの? 遅くなる例もないみたいだし。
-pg とバッティングする.
それくらいか
285 :
デフォルトの名無しさん :04/09/16 22:47:22
284=252
286 :
デフォルトの名無しさん :04/09/16 23:06:54
252=271=285
自分のバグをコンパイラのせいにするのも良し。 遅くなると思って使わないのもまた良し。
それで, -O より -O2 の方が遅い原因は分ったんですか?
すぐにコンパイラのバグのせいにする奴は厨。 ほとんどが自分のプログラムミス。
C言語という仕様がザルだというのもあるな.
これがコードのミスなんだ。へえー。 #include <stdio.h> int x(int y) { int x= y; if (y) printf("%d\n", y); else throw "x"; return x; } main() { try { x(0); } catch (const char *e) { puts(e); } catch (...) { puts("cathed"); } }
そもそもコードのバグだったら なんで-fomit-frame-pinterの有無で挙動がかわんの? やっぱコンパイラのバグじゃん。
pointer
>>293 オプション何でやっても
xって表示されるけど間違いなの?
c++よく分からないけど。
プログラムのミスのせいで-fomit-frame-pointerをつけると死ぬ例 void f (int i) { int a[1]; a[i] = 0; } #include <stdio.h> #include <stdlib.h> void f (int i); int main () { f (1); printf ("aaa\n"); exit (0); }
>>298 まともな返答も出来ないのかよ。
つけないとpush ebpで助かるけど、つけるとリターンアドレスを書き換えて
挙動が変わるって説明したのに。
もうお前書きこむな
どっちにしろebp書き換えたらセーフじゃないだろヴォケ
だから最初からお前がまぬけなコード書いてるんだろって言ってるの コンパイラのバグじゃなく
> -fomit-frame-pointer is one of those "optimizations" that does more harm > than good in my opinion. Well, I always found the resulting assembly of code compiled with '-fomit-frame-pointer' much easier to read than without :-)
このスレに、-fomit-frame-pointerをどうしても悪くしたい奴がいるようです。
まあなんで-O2に-fexpensive-optimizationsさえ付いてくるのに、 -fomit-frame-pointerがついてこないかを考えれば、 普通は-fomit-frame-pointerを使うべきではないのは自明だな。
これだけで議論になるオプションなので、 本当のオプション名は、-fomit-flame-pointerになんじゃないかなぁ。w
ところで、
>>293 の挙動が-fomit-frame-pinterの有り、無しの
どちらでも結果が変わらんのだが。
どちらもxが表示される。
(´-`).。oO(
>>293 はいったい何が言いたいんだろう)
>>303 -fomit-frame-pointerにバグのあるVersionを使ってる奴ががんばってるだけでは?
gccをVersion Upすればいいじゃん。w
なんでそんなにがんばるのかわからん。
>>304 >まあなんで-O2に-fexpensive-optimizationsさえ付いてくるのに、
>-fomit-frame-pointerがついてこないかを考えれば、
>普通は-fomit-frame-pointerを使うべきではないのは自明だな。
うーむ、これは憶測だけどgdbで使用できるようにするための配慮ではと思うのだが。
本当のところは知らん。
>>299 >つけないとpush ebpで助かるけど
助かってどうする。
>>309 どうもしないよ。
そもそもバグのあるコードがたまたま動いてるように見える
例で書いたんだから。
付けてみた場合と付けなかった場合で速度を比べてみるのが最強!
ん、つまりあんたの言いたいことは、 -fomit-frame-pointerをつけた方がバグ鳥にも役立ちますよ って、そういうこと?
This is a frame war. This is a holy war.
>>304 ,308
`-fomit-frame-pointer'
...
Enabled at levels `-O', `-O2', `-O3', `-Os'.
>>313 >>294 がなんで挙動が変わるのかって書いてたから
それに対して書いたんだよ。
わざとらしいな。
それにバグ取りとか関係ないと思うけど。
さっきのやつだとa[2] = 0;ってすればつけたほうが平気だし。
皆様、ここで一旦もう一度冷静になって、 man gcc、info gcc、gcc -v --help の-fomit-frame-pointerの項目を落ち着いて見てみようぜ。
>>322 少なくともx86では有効にならないよ
そもそもバグならmanも何も関係ないしね
いいよ
manと実装が同期してないことはよくあるね。 -Sをして自分で確かめろってことでそ。
そもそも-O2で付くなら、 fomit-frame-pointerの話なんて出ないよな。 -O2で付くんなら-fomit-frame-pointerとかいう長ったらしいオプション付ける必要ないもん。
>>327 だーかーらー
> `-O' also turns on `-fomit-frame-pointer' on machines where doing
> so does not interfere with debugging.
>>327 >そもそも-O2で付くなら、
`-O' also turns on `-fomit-frame-pointer' on machines where doing
so does not interfere with debugging.
>>330 machines where doing so does not interfere with debugging.
結局-fomit-frame-pinter付けちゃいけないのは x86だけだろ。さもgccが全部悪いみたいないいかたすんなよ。 sparcやMac(PPC)でgcc使ってる香具師だっているだろ。
>>293 これ与太かとおもったら本当だった。
-O2 -fomit-frame-pointer だとアボートしましたってなる。
-O0 -O1 -O3 -Os なら -fomit-frame-pointer やっても平気だけど。
3.3.4で。
335 :
デフォルトの名無しさん :04/09/17 20:05:33
久しぶりにこのスレ見に来たら今更こんな話題やってんのかよ -fomit-frame-pointerはx86では付けない方がいいなんて何年も前から常識だぜ あげちゃうよ
336 :
デフォルトの名無しさん :04/09/17 20:08:52
-fomit-frame-pointerのバグじゃなくて 例外のバグじゃないかとも書いてあるね。
ようし、こうなったらIntelかAMDの奴呼んできて、 はっきりさせようじゃねーか。 誰か2chに呼んできて。
>>334 >-O2 -fomit-frame-pointer だとアボートしましたってなる。
3.3.3だけど再現しないなぁ。
たぶん3.3.4にバグがあったってオチなんでしょ。
うわー3.4系はバグリまくってて使えないし 3.3.4まで使えないのかー。 どのバージョン使えばいいんだgccって。
>>340 -fomit-frame-pointer使わなきゃいいだろ。
どうせ-fomit-frame-pointer使っても百害あって一利なしのx86つかってんだろ。
>>339 今 3.3.3 と 3.4.0 で試してみたら平気だった。
でも 3.3.4 だけはなるから、これ固有なのかな。
さあ次の話題カモーンヌ
>>332 のソース、何でbarがvoidなんだろ?
>>332 のつけた方が速いじゃん。少なくともpentium3だと。
-O3 -fomit-frame-pointer
real 0m16.099s
user 0m15.910s
sys 0m0.080s
-O3
real 0m20.337s
user 0m19.070s
sys 0m0.000s
テストの仕方間違えた。たいして差は出ないな。 -O3 -fomit-frame-pointer real 0m15.766s user 0m15.760s sys 0m0.000s -O3 real 0m16.216s user 0m16.210s sys 0m0.010s
まだ間違えてんじゃないの
int foo (void); int bar (int a[]) {return 0;} int main () { int i; for (i = 0; i < 100000000; i++) foo (); return 0; } まだ間違えてるかな。 先にやった時は、このファイルもオプション変えてたけど 2回目は固定してやった。
>>350 そのコードじゃ別の所で最適化かかって意味無いんじゃね
>>351 ファイル分けてコンパイルしたから
大丈夫じゃない?多分
0.202u 0.000s 0:00.20 100.0% 5+165k 0+0io 0pf+0w
ていうかね、ごく一部(1人or2−3人)の人が、 「遅くなることもある」という表現を知らないせいか ひたすら「遅くなる」とだけ唱えているから、ややこしくなるのよ。
static int z; int bar(int *x){ z++; *x = z; } int foo(void){ int a[16] = {0}; a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); a[0] += bar(a); return a[0]; } int main(){ int i,j; for(i=j=0; i<0xfffffff; i++) j += foo(); printf("%d\n", j); return(0); } /*************************************************************/ "-O3 -mcpu=i686"と"-O3 -mcpu=i686 -fomit-frame-pointer"で比べて見た。 -fomit-frame-pointer有り: real 0m4.573s user 0m4.568s sys 0m0.004s -fomit-frame-pointer無し: real 0m4.601s user 0m4.599s sys 0m0.001s 本当に微妙なんだけど、-fomit-frame-pointerをつけたほうが早かった。
>>354 あと、gccのversionによっても微妙に速度は変わるはずだし。
versionを統一してチェックしなければ意味ないし。
結局今マトモな最新バージョンはgcc-3.3.3みたいですね
これは嵐の前の静けさですか?
GCC-3.3.5 release
360 :
デフォルトの名無しさん :04/09/18 18:52:33
prerelease?
またバグが増えるのかな?
>>362 何故バグを期待してんのかわからん。
そんなにバグがいやなら商用のiccでも使っておけ。
364 :
デフォルトの名無しさん :04/09/18 23:11:04
LAMEのMP3 Encodingで勝ってる。わーい
gccには適応生存能力がある。 ある意味それが利点でもあるのだが。
>>367 そう言ってるね。
>If anything, these tests show how free software rivals -- and sometimes exceeds
>-- the quality of its commercial counterparts. Perhaps GCC's greatest strength
>is its cross-platform portability; it is arguably the most ubiquitous piece of
>software in the world, running on everything from mainframes to embedded systems.
>For obvious reasons, Intel's compiler is specific and limited to their processors.
さすが大人の意見です。 >"Choice" is the key word here -- choice is good, be it in democracy or software. >Intel provides a useful alternative to GCC for development on ia32 systems. >One compiler might have a great environment for developing GUI code; another >compiler might generate fast code. GPL-like freedom may be important -- or not > -- as individual circumstances dictate.
370 :
デフォルトの名無しさん :04/09/19 09:26:06
gcc 4.0 なんてあるのか…。
上の pov-ray ベンチを -O3 -ffast-math -fomit-frame-pointer -march=pentium-m -fprefetch-loop-arrays -O3 -ffast-math -fomit-frame-pointer -march=pentium-m の二種類でやったら 3067sec, 3092sec になった. -fprefetch-loop-arrays を付ければもっと gcc の結果は良くなりそう.
>>372 -ffast-mathって結果変わっちゃうよ
>>374 > -ffast-mathって結果変わっちゃうよ
んにゃ、元のページで使ってるから、372はそれと同じ設定にしただけだろ。
あー、3.4 が 4.0 に改名するだけですか。 Java 1.5 が Java 5.0 になるようなもんですかね。
え? 違うの? あっそう。
380 :
デフォルトの名無しさん :04/09/19 20:00:49
よ〜し、gccでバンバン最適化してiccを追い抜いちゃうぞ〜。
パパが抜けてるぞ。
383 :
デフォルトの名無しさん :04/09/20 14:58:50
InterlockedIncrementみたいなのはgccにはないですか?
誰かネタふれ
388 :
デフォルトの名無しさん :04/09/21 00:25:20
age
んじゃネタ振るか 3.4.2release、テストでエラー多過ぎなんじゃボケ リリース後10日で半減したけどそのクオリティはリリースの時に達成しとけよ
3.4系はゴミ
-ffast-math つけると何が変わるの?
392 :
デフォルトの名無しさん :04/09/21 00:40:48
メーカーのサポートを受けられるかどうか
3.5系も
>>370 見るとやばめ
あれが出てからgccデベロッパが物凄い勢いで言い訳してたのは…
まぁ言い訳したくもなる結果だ罠
メモリ馬鹿喰い
コンパイル時間激増
性能停滞
セグフォ多数
まぁそれでも結構期待してたりするんですけどね、4.0
アーキテクチャごとの最適化とかc++は進歩してるっぽいし
今後のチューニングでどこまで改善出来るのか知りませんけど
このスレで最新の安定安全バージョンは3.3.3と結論が出てるじゃないか。
今から、gcc4.0のicc越えを期待しとく。
あんまり期待しないでね。 icc9ももうすぐ出るから更に突き放されるだけだろう。
速度 icc8>vc++7.1>gcc3.4>gcc3.3 標準準拠度 vc++7.1>gcc3.4>gcc3.3>icc8
間違えた標準準拠度 vc++7.1>gcc3.3>gcc3.4>icc8
間違えた標準準拠度じゃこれが間違ってる見たいじゃん。 正しい標準準拠度 vc++7.1>gcc3.3>gcc3.4>icc8
手動でカスタマイズするから。いいもん〜だ。
>>401 嘘だ。vcなんてM$仕様に拡張しまくりじゃん。
gccなんてgcc仕様に拡張しまくりじゃん という事は最強はicc?
VC++7.1のboost100%の力は永遠に語り継がれるであろう。
>>403 C++ の規格自体、処理系毎の拡張を許容する内容になってるでしょ。
VC7.1使ってるけど、素直にtemplateが書けるってうれしいねえ。
>>404 iccはイソテルアーキテクチャ依存。問題外
gccでboost使おうとすると何が使えない?
VC Userがなにげこのスレにいる。
>>409 3.3.3なら
mpl,signals,test,type_triats
3.4系なら更に
spirit,python,function,assign
のテストで失敗します
3.4系は lambdaもtest通らないよ
それはboostが間違ってる
VC++7.1では通る
ていうかicc-8の方がgcc-3.3.3より準拠度高いよ。 icc-7.1は酷かったけどな。 pythonはicc-8も通らないけどmplとかは通るからね。
まあgccにも速くVC++7.1の領域に辿り着いて欲しいですな
>>418 最近逆行してる気がするのは気のせい…?
binutilsは確実に進歩していってるけどgccは…
420 :
デフォルトの名無しさん :04/09/21 02:12:00
VC++7.1厨が暴れているな
↑かわいそうな香具師だな
キシャアアァ!!
みんあRuby津じゃ得bsむもんfしお Riubuy!
gccでの不具合あったら報告お願いします。 そういう風にして育っていくと、gccとしても本望だと思います。 # 文句だけでなくね。:)
#define LINE_MARKER_BAR(line_i) __asm__ __volatile__ ("# " __FILE__ ": " #line_i : : ) #define LINE_MARKER_FOO(line_s) LINE_MARKER_BAR(line_s) #define LINE_MARKER LINE_MARKER_FOO(__LINE__) としてソース内に LINE_MARKER; をまき散らしてから gcc -S するとウマー ... jal.printf #APP # fib.c: 30 #NO_APP move $2,$0 ... なおMacOS Xのgccで試したら #APP とかが付かなかった。
426 :
デフォルトの名無しさん :04/09/21 19:57:44
>>425 そんな面倒をするくらいなら、gcc -S -fverbose-asm 結果の.sと、普通にgcc -c した.oを併用(併読)したほうがよくないか?
(後者は objdump -S に食わせるわけね)。
なんでGCCの開発者たちはバージョンアップを急ぐの? 4〜5年くらい経ったらカーネルとかその時代に要求される機能とかがちょっとずつ変わってくるだろうけど、一年ちょっとじゃ。。。 安定させることに専念して欲しいかも
428 :
デフォルトの名無しさん :04/09/22 00:11:32
>>426 gcc -S -fverbose-asm
だけでいいんじゃないの?
objdump -S foo.o
で何か有意義な情報が得られるのだろうか
GCC2->GCC3のときみたいにGCC4に対応させるために またスクリプトを書き換えなきゃならないのかな… それは無しにしてほしいけど
430 :
デフォルトの名無しさん :04/09/22 10:03:08
NFSマウントしたディレクトリーにカレントディレクトリーを移して gcc使うと時々リンク時にエラーが出てしまいます。 -c つけてコンパイルだけにするとエラーは起きません。 エラーメッセージは /usr/bin/ld: final link failed: 入力/出力エラーです LANG=Cにすると /usr/bin/ld: final link failed: Input/output error gccのld以外の用途でこのような症状に遭遇していませんので gcc特有の問題の気がします。良く分かりませんけど。 こういう現象に遭遇した人いますか?
431 :
デフォルトの名無しさん :04/09/22 11:09:14
gccのld
UNIX自体に問題がある もう死滅してほしい
なんか嫌な事でもあったのか?
Plan9の予感。 UNIXのスペチャリストが、もっとPlan9の概念設計の 話し合いに参加すべきだと思うね。
LinusはPlan9が設計的にミスを犯してるとかなんとか言ってたけど、 Linusはまだ批判してるだけいい方で、他の人達はPlan9を徹底的に 無視してる。これじゃパッドノウハウなんて言われても仕方ないね。 みんな自分のポジションだけが大事で、UNIXのこと、計算機の将来 なんてどうだっていいわけだ。
コンソールの前に立ったらパスワードがいらないOSがいいの?
>>430 gccのときに確実に再現する(gcc以外による)問題だからといって
gcc特有の問題とは限らないんでないの。普通はNFSを疑う。
>>428 > objdump -S foo.o
> で何か有意義な情報が得られるのだろうか
ん、元質問者はCのソースコードと対比しながら読みたいみたいだったからさ。
なんか意味不明だな。括弧の中はなかったことにして読んでくだされ。
>>430 その英語のエラーメッセージでぐぐると53件ヒットする。
全体的に眺めてみただけだが、いろんなディストロ、OSで起きているようだ。
ときどきそういうことが起きるという症状は
NFSが関係している場合も関係してない場合もあるらしい。
53件もヒットしているのに、原因判明したという話は見付からない。
53件しかヒットしないとも言える。それだけ珍しい現象。
こんなカルトな問題を2chで聞いて教えてもらえるわけがないだろ。
ソース追って自分で調べてくれ。気になるから分かったら教えてくれ。
443 :
デフォルトの名無しさん :04/09/22 19:47:58
>>439 それこそ gcc -S -fverbose-asm だけでいいんじゃないの?
単純に-fverbose-asmを知らないか、使えない環境なんだろう
445 :
デフォルトの名無しさん :04/09/22 22:33:52
>>426 > そんな面倒をするくらいなら、gcc -S -fverbose-asm 結果の.sと、普通にgcc -c した.oを併用(併読)したほうがよくないか? (後者は objdump -S に食わせるわけね)。
>>428 > gcc -S -fverbose-asm だけでいいんじゃないの? objdump -S foo.o で何か有意義な情報が得られるのだろうか
>>439 > ん、元質問者はCのソースコードと対比しながら読みたいみたいだったからさ。
>>443 > それこそ gcc -S -fverbose-asm だけでいいんじゃないの?
>>444 > 単純に-fverbose-asmを知らないか、使えない環境なんだろう
>>444 つまり、426が「objdump -S」と組み合わせるという意味の無い提案をした理由は
426が-fverbose-asmを知らなったからだということですか。
常人には真似のできない推理に脱帽です。
VC使ったほうが速いし小さいよ
↑かわいそうな香具師だな
>>430 disk fullとかquotaに引っかかったとかはどうだ。
NFSだとうまく動かないって有名な話だろ。
いまさらプロプラエタリに依存しようという気にもならない
452 :
デフォルトの名無しさん :04/09/22 23:27:18
漏れの debian の msc (monoのC#コンパイラ)も、NFSの下で 動かすと、0バイトのファイルを吐いて死ぬ。 NFSサーバは、LinuxベースのNASです。悲しいです。
今日の一言:初心者はVCで学び始めるより、gccで学んだ方が幸せになれる。
え、どこどこ? どこにそんなことかいてあるの?
>>453 おれでも、
さすがにそれはない
と思う。
初心者はちょっとだけ勉強してすぐ諦めてやめる可能性が高いので 最初は無料コンパイラーで勉強を始めるのがいいかも。 昔はLSI-Cの体験版がそういう用途で人気だった。
っていうかgccマスターしちゃえばアーキテクチャ変えても それなりに生きていけないか? ところでgcjのGUIフロントエンドって無なかったっけ?
正直。gccはあまりにも当り前に使えるので 誰もありがたみがわかないんじゃないのかな。 無くなると(開発が滞ると)それなりに痛いのではないだろうか。(少なくとも自分にとっては)
別のコンパイラ使うから関係ねーよとかいいつつ 実はgcc拡張に依存したコード書きまくってた香具師とか大発生しそう。
adaとか使用している方いますか? 自分、adaは使用した事無いですけど、 いったいどんな風に使用されてるのかなと疑問があったので。
アメリカ軍で使われてるんじゃないの?
ペンタゴンではこのまえの集団テロから使わなくなりました
466 :
デフォルトの名無しさん :04/09/23 10:26:56
adaを使用したアプリで防犯してるんですかね。
それが仇になって電波ジャックされると
日本では、あまり使用例無いけど(っていうか使ってる奴いるんだろうか?)、 海外(米国)では使われてるんですな。
472 :
デフォルトの名無しさん :04/09/23 12:06:50
>>443 なぜそう思うか、両方の出力を貼って説明してみろ
>>444 もしそうだったら-fverbose-asmの紹介をしないと思うのだが…
「愚者は知識に学び、賢者は経験に学ぶ」
>>475 ソレハ ワタシニハ インプット サレテマセン
「患者は看護婦に学ぶハァハァ」
「イククは、グシシに学ぶ」
C99と'C++が想定したC'は非互換だと思うんですが どうクリアする気なんでしょうね?C99の上にSTL載せるのかな…
>>480 C++の言語仕様が C + OOP拡張 であることが真でなくなったことを言ってると思う。
>>481 言っている意味がわかりませんが、C++はC89の上位互換でもありません。
そもそもCも上位互換を保持して改訂されているわけじゃないし…
下位互換だろ.
485 :
デフォルトの名無しさん :04/09/26 15:14:11
g++でコードをコンパイルしようとしたら、「ld: cannot find -lstdc++」と出るのですが、 何が原因でしょうか? ちなみに、gccでCのコードをコンパイルするのには成功しました。 OSは、Windows XPです。
487 :
デフォルトの名無しさん :04/09/26 15:47:18
たぶんあなたに悪霊が取り付いているからです
>>487 念のため聞きますがg++でのコンパイルはどんなコマンドを打ってますか?
あぼーん
491 :
デフォルトの名無しさん :04/09/26 16:14:09
>>489 g++ -O2 -o test.exe test.cpp
>>491 $ g++ -v -O2 -o test.exe test.cpp
で-Lのパスを確認してみるとか
適当に書いてVC7.1で通ってたコードを 試しにg++(3.3/3.4)でコンパイルしたら explicit specialization in non-namespace scope キターっていうのはこういうときに使うのかな・・・
モナオ
>>493 そういうエラーの出る「VC7.1で通ってg++(3.3/3.4)で通らないコード」
のサンプル出してみてよ
VCは、規格ではエラーになるべきコードなのにならないことがあるからなあ。
VCダメダメ、
499 :
デフォルトの名無しさん :04/09/27 17:10:29
C99って何ですか?
99回目のセックス
試せ。 Snapshot gcc-3.4-20040924 tp://gcc.gnu.org/pub/gcc/snapshots/3.4-20040924/
再び、-fomit-frame-pointer論争を!
('A`)マンドクセ
いや、そう言わずに。
>>507 待てない。出るのに半年から1年はかかるんじゃねーか?
gdbでpthreadのデバッグやろうとしてるんですけど、 非常にタイミング命の処理をデバッグしたいんです。 けど、gdbではうまく処理できてるようにみえるんですけど。 -gをはずすとたまに不正な値を出すんです。 gdbをするとうまくいき、デバッグ情報はずすとダメになる。 どうしたらよいでしょうか?
プログラムがおかしいんじゃねえの
>>510 それは、「シュレーディンガーの猫」だな。
>511 ソース見てみないとなんとも
自分で状態遷移書いてみろよ。 それと単スレッド毎のデバッグはしたのか? >gdbをするとうまくいき、デバッグ情報はずすとダメになる。 このケースはメモリ破壊している事がほとんど。
>>510 Heisenbug とも言う. (トレースによって再現状況の変わるバグ)
>>510 メモリリークを検出できるライブラリを使ってみたらどう?
>>510 その手のバグを捜すには簡単なリングバッファを作ってそこに要所要所で重要な
状態を記録する。 あとはASSERTてんこもり。 ASSERTしたところでgdbで
リングバッファに保存された状態遷移をながめてバグを同定する。
>>514 > >gdbをするとうまくいき、デバッグ情報はずすとダメになる。
>
> このケースはメモリ破壊している事がほとんど。
マルチスレッドなんだから、リソース競合も大いにあるでしょ。
> 自分で状態遷移書いてみろよ。
これはその通り。
GCC-3.3.5がそろそろ出るぞ! Are you ready?
through
しかも華麗に。
そ、そんな。ひどい。
>>510 Race conditionが発生してると思われる。
525 :
デフォルトの名無しさん :04/09/30 10:03:36
イィィィヤッホォォォォオオオオウゥ!!
質問があります。 $ make love ってコマンドを打ったんですが、何度実行してもForkしませんでした。 どうしてでしょうか? 自分のマシンがVirusにでも感染してるんでしょうか? よろしくお願いします。
フォアダイスだな
>>527 トロイだな。実際には別の奴と実行している。
530 :
デフォルトの名無しさん :04/10/02 00:57:31
gccをDLしようと思ったのですが、どれも20MBぐらいのファイルなのですが、 これで大丈夫なのでしょうか? pathの設定でつまずいてしまいました(汗
× つまずく ○ つまづく
3.3.5がもうミラーされてる。今回もアナウンスメントなしなのかな?
533 :
デフォルトの名無しさん :04/10/02 05:54:29
はやく3.5でないかな〜
一生でないと思うよ
>>532 だから言ったではないか。
>>533 つ ftp.iij.ad.jp/pub/gcc/releases/gcc-3.3.5/
536 :
デフォルトの名無しさん :04/10/02 09:20:54
537 :
デフォルトの名無しさん :04/10/02 09:21:39
-mpniオプションは、オタ専用のオプションですか?
`-mpni' is deprecated. Use `-msse3' instead.
543 :
デフォルトの名無しさん :04/10/03 13:05:33
本当に3.3.5はここの住人にスルーされたのか?
このスレの住人は、shyなんだよ。
燃焼系〜、燃焼系〜 orz orz orz orz orz orz
とりあえず、3.3.5をmakeだけはした。 次は↓がmake installして使用状況を報告するべし。
547 :
デフォルトの名無しさん :04/10/03 18:13:45
GCC4まだー? VCは7になってるんだから 早くしないと追いつかないよー(^^)
gcc 2005、いずれはgcc VSOPにしますから。
VCとは比べんな! Win厨は逝ってよし。
比較もされなくなったらお終いだと思うよ(ゲラ
そういえば、次号のC MAGAZINEってコンパイラの最適化術があるね。 どうでもいいことだが。
gcc3って結局使われたんだろーか gcc2.95ってところが結構多そうだし kdeだとかのオモチャじゃなくてビジネス系で、ね
ビジネスでgcc使うところは長くないな
Appleか
PS2
あと組み込みとか 俺はゲーム屋だけど gcc 3.x 系列使ってます。もう gcc 2.9x だと コンパイル通らんコードになってる。
Red Hat Enterprise Linux 3はgcc3だぞ 2.1まではgcc2.96だったけど
非gcc厨が、気になってのぞきに来るスレはここでつか?
RedHatってあのオモチャIT企業ご用達のOSね
>>562 最近は動作環境に RedHat 指定してくるベンダもある。オモチャっつーか
用途によりけりって感じだが。
組み込みの開発環境に汎用機持ってくる馬鹿はいないわけで。
>>562 ∩___∩ |
| ノ\ ヽ |
/ ●゛ ● | |
| ∪ ( _●_) ミ >オモチャIT企業ご用達のOS
彡¤ |∪| | J
/ ∩ノ ⊃ ヽ
( \ / _ノ | |
.\ “ /__| |
\ /___ /
565 :
デフォルトの名無しさん :04/10/04 05:21:31
linuxのコマンドをプログラム内から実行する方法を教えてください 。
system()
popen()
普通はforkしてexecveです
Snapshot gcc-4.0-20041003 release.
>>562 You are painfully for proprietary software.
Now, Let's use a gcc!!
$ ecc -O2 main.cpp
$ nova -O3 translate.c
>>573 nova: Command not found.
$ geos -Os translate.c
$ aeon -O translate.c
コンパイラ比較 良い <----------------------------------------------> 悪い gcc >>>>>>>> ||越えられない壁|| >>>>>> icc or ecc >>>> VC
578 :
デフォルトの名無しさん :04/10/05 09:30:34
晒しage
gccの使いやすさもさることながら 縁の下の binutils の使い勝手も忘れぬよう。
>>582 コンパイラのどの技術がコダックの特許に抵触するのか解説きぼん
というのはさておき、ま〜たやっかいなネタだのう。
特許ゴロ化した企業は風評を落とし、売り上げも落とし、信用も落とすという風潮ができてくれることを願わんばかり。
GIFが去ったら今度はオブジェクト指向かよ。
以下で正しいでつか? 資本主義社会=地雷特許で埋めつくされた社会
10メートル走るごとに殴りあうのが正しい競争社会です この世界は万人が幸せに生きられるようには創られていないのです。
589 :
デフォルトの名無しさん :04/10/05 20:19:40
Ruby差宇じぃy!!!!!!!! Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>GCCCCCCCCC
>>587 そうか、だから現実って見た目以上に窮屈な世界なのか。
このスレの内容に戻って、 -mregparmを使えば関数コールを速くすることができるんですか? 例えば、-mregparm=4とか。 ABIに依存しますが妥当な値を入れれば高速化できるかな。
(・ω・)Kodakなんかさっさと潰れればいいのに。
( ´・ω・)むしろ、潰れそうだからゴロ化したのかもしれない。SCOのように
そのときにはMSが買いとって自社以外の全ての会社やソフトウェアプロジェクトから 徴収を開始すると思われ (>_<)
djgppって、今でも開発が継続されていますけど、WindowsXP上で使う限りにおいて、MinGWと使い勝手に違いはありますか?
16bitだったり
32bitじゃないの? ただMMX使うと落ちたような気がした。 movq %mm0, %mm0とか書くだけでも。
600 :
デフォルトの名無しさん :04/10/05 23:04:16
糞スレで600get
>>601 djgppはWin32APIが使えないってことですかね。
>>592 スタックをさわらなくなるので、大概速くなりますな。
まあ3あたりが無難な所ではないかと。
>>592 指定したマシンだけで動かすのであれば、
デフォルトで設定していてもいいのでは? > mregparm
平たく言うと強制fastcall化オプション?
コンパイラに対しての強制フェラチオですね 歯があたって痛いかもしれません
イマラチオっていうんですよそれ
>>592 x86では、syscall/sysret(そのCPUが対応してれば)を使うのか?
>>602 基本的にDOSのファンクションを使ったライブラリとかしかないだろうし、
メモリ空間に制限もあったような?使った事が無いのでよく知りません。
頑張ればGUIなプログラムも作れるかもしれないが、そんなことするなら
mingwあたりを使った方が正解でしょう。
NT系での俺的評価 mingw > RSXNT > djgpp ただコンソールアプリを作るときはRSXNT.
"-O2 -O3" または、"-O3 -O2"と指定した場合どうなりますか?
それでやって-fverbose-asm -Sして、出来た*.sの先頭を見ればいいじゃん。
>>613 manより
>複数の -O オプションを指定した場合は、レベル番号の有無に関わらず、最後に指定したものが有効になります。
616 :
デフォルトの名無しさん :04/10/06 16:50:17
-fdelayed-branch と -fschedule-insns の実例が見てみたいのですが、適当なコード例はないでしょうか? -fdelayed-branch If supported for the target machine, attempt to reorder instruc- tions to exploit instruction slots available after delayed branch instructions. -fschedule-insns If supported for the target machine, attempt to reorder instruc- tions to eliminate execution stalls due to required data being unavailable. This helps machines that have slow floating point or memory load instructions by allowing other instructions to be issued until the result of the load or floating point instruction is required.
おにいちゃん gcc3.4.2どないしたん?
>>616 gcc 3.3.5のソースを見てみたが、
-fdelayed-branchは、g77とM88Kアーキテクチャしか使われてない??
-fschedule-insnsに関しては、config/i386/i386.c内に以下を見つけた。
-O2以上だと無効にされるみたい。
void
optimization_options (level, size)
int level;
int size ATTRIBUTE_UNUSED;
{
/* For -O2 and beyond, turn off -fschedule-insns by default. It tends to
make the problem with not enough registers even worse. */
#ifdef INSN_SCHEDULING
if (level > 1)
flag_schedule_insns = 0;
#endif
/* The default values of these switches depend on the TARGET_64BIT
that is not known at this moment. Mark these values with 2 and
let user the to override these. In case there is no command line option
specifying them, we will set the defaults in override_options. */
if (optimize >= 1)
flag_omit_frame_pointer = 2;
flag_pcc_struct_return = 2;
flag_asynchronous_unwind_tables = 2;
}
620 :
デフォルトの名無しさん :04/10/06 18:37:42
>>619 サンスコ。
では、何が起きるか見るときは g++ -O0 -fschedule-insns -S と g++ -O0 -S で比較するのがよさそうですね。
でもフラグの有無で変化があるコードが書けない・・・
>>620 適当なソースでコンパイルしてdiffれば。
622 :
デフォルトの名無しさん :04/10/07 00:58:07
3.3.5を使ってみたよ v(^-^=)
-fschedule-insnsでgccのmlを検索してみたら、
ia32では使うな、動かない
理由はレジスタが少ないからとか?
>>620 がia32でないことを祈る。
>>624 619のコード中のコメントでガイシュツぽ
コメントは見たけど、でも、
>>620 は-O0でやるみたいだったので気になった。
2.95の頃から注意はされてるけど、bug報告が多い-fschedule-insnsオプションであった。
成る程
>>616 ターゲットは?
>>619 -fdelayed-branchは、sparcでも使われてる。
i386 で -O2 以上の場合、デフォルトでは無効なだけで -fschedule-insns と指定すれば有効。
>>620 >>619 にサンスコってことは、
>>616 のターゲットは i386 だったんですか?
i386 では遅延分岐がないので -fdelayed-branch の実例は見れない。
-O0 では -fschdule-insns は無効。
-O0 より上じゃないとだめ。
>>624 最適化にどの程度寄与するかは別にして、動くことは動く。
実例が見たいってだけなら別に ia32 でもいいんじゃない?
gccのインクリメンタル・コンパイル機能、使ってる人、います? プリ・ヘッダコンパイルのことですが。 実際に使ってる人の意見だとか様子、ちょっと聞いてみたいです
釣りか? 自分で使ってみれば?(・з・)
自分で、試すのは、面倒なんです
>>631 g++ ヘッダーファイル[enter]でpchが出来る。
例えばSTLのファイルに食わせてコンパイル時間が変化するかどうか試して
みればよい。
俺の場合は少しコンパイル時間が速くなったが、元々CPU/メモリが十分な
速度を持っているせいかどうか、大した違いはなかった。
すごく…おおきいです
ごみ集めについて力説しているページとか抗議死霊を後会している所を教えてください
いいえ♥
>>634 それはgccに関係のあるっていうこと前提にして言っているのか?
>>634 boehm gcのページにリンクがあるよ。
639 :
デフォルトの名無しさん :04/10/07 19:21:29
GCC&LDでCRT等をリンクせずにバイナリを作りたいのですが dataセクションの初期化コード(static変数等)が消えちゃいます CRTをリンクせず 変数の初期化コードを生成&リンクする方法はないでしょうか
naideath!
変数の初期化コードの意味がよくわからないけど、 リンカーのスクリプトを自前で用意すれば、何とかなると思うよ。
>>639 .bss や .ctor ではなく .data セクションの初期化なの?
643 :
デフォルトの名無しさん :04/10/07 23:56:50
Cコンパイラを使っていて、きちんとヘッダのディレクトリにパスを通したつもりなのに、 "No rule to make target "hoge.h" とか出てきてしまって、リンカーが止まってしまうんですけど、 こんなことってありますか? 念のためにmakefileを見ると、ちゃんと通っているのに、どうしても"hoge.h"だけ拾ってくれない。 "foo.h"なんかは拾ってくれるのに。
>>643 > Cコンパイラを使っていて、きちんとヘッダのディレクトリにパスを通したつもりなのに、
パスを通した、って環境変数のことかな?それなら、それだけじゃだけじゃだ
めだよ。絶対パスをMakefileに書くか、VPATHを通すかしないと。
あ、Common Lispスレに言って聞いた方が詳しい人がいるよ、GCは。
647 :
デフォルトの名無しさん :04/10/08 01:09:54
>>644 > パスを通した、って環境変数のことかな?それなら、それだけじゃだけじゃだ
> めだよ。絶対パスをMakefileに書くか、VPATHを通すかしないと。
>
gccベースの統合開発環境なんだけど、そこでパスを指定してあげると、
Makefileにも反映されるという仕掛けになっていて、
実際、出来上がったMakefileを読んでみると、ちゃんと-I../incとかなっているんだけど。。。
しかも、一部のヘッダだけがいくらやっても、弾き飛ばされてしまう。
どうなっているんだ〜
苦し紛れに makedepend
649 :
デフォルトの名無しさん :04/10/08 01:32:16
MM
>647 とりあえずおまいさんが色々と勘違いしているに1票。 No rule to make target ... って怒ってるのはリンカじゃなくて make だろ? Makefile 中にある -I../inc はコンパイラに対する指定だろ? >644 の言うとおり絶対パス書くか、VPATH を通すべし。
>643 make は"hoge.h を作る「ルール」がないんだ"って言ってるような... パス云々以前のような気がするけど.. >650 道意
>>653 ちゃう。パスの問題。
hoge.hが材料になってるのに見つけられないからmakeが作ろうとしてる。
でもそもそもhoge.hは作る必要は無いファイル。
見つけられないだけであるファイルだから。
eclipseみたいなmakefileを自動で生成する統合開発環境の使い方が分からないのだと思うので、
・統合開発環境のマニュアルを読む
・統合開発環境の名前+vpathでぐぐる
・その統合開発環境の為のスレを2chで探す
・無ければスレ立てるまでもない質問スレへ
って感じじゃないか。
>>647 hoge.h をコンパイルしているに1票
>>654 統合環境が便利なのか便利でないのかわからなくなってまいりました。ってオチでつか?
>>656 手でmakefile書けばすぐに解決出来るのになー、みたいな。
使い方さえ分かれば便利なんだと思うよ。
とりあえずマニュアル嫁>643
>>654 同じく知らなかった。
makeは、なければruleに従ってtargetをmakeしようとするんだな
>>651 hoge.hをインクルードして、オブジェクトファイルを作るのは、コンパイラの仕事だよなw
リンカーはオブジェクトをリンクするんだから
>>629 プリコンパイルヘッダーの正しい使い方を教えて下さい。
だったら、よかったのに・・・
I used gcc 3.4.2. Oops!!
I used gcc 3.3.5. (^o^)
lol.
out to lunch = OTL
665 :
デフォルトの名無しさん :04/10/10 01:01:29
質問させてください。 gccで作成したオブジェクトファイルをバイナリー化するツールはご存じありませんでしょうか。 目的は、多数のデータがあるソースファイルがあり、 これまでは普通にリンクして使用していたのですが、 訳あって、データ部を後からファイルで読み込む必要が出てきました。 そこで、単純にオブジェクトをバイナリー化できないかと思いまして。 よろしくお願い致します。
$ objdump -t foo.o $ objdump -s foo.o から自分で作って。
>>665 今までリンクしてたんなら、シンボル情報をどう扱うかが問題にならない?
>>665 環境は? UNIX とか Win32 ならダイナミックリンクするって手がある。
配列で持っていたデータを外から読みたいつーことじゃないの? 生バイナリならobjcopy -obinaryで作れるが。
GLIBCをobjdump -d で眺めていたら、 10580d: eb e9 jmp 1057f8 <realpath+0x28> 10580f: 00 55 b8 add %dl,0xffffffb8(%ebp) 105812: ff (bad) 105813: ff (bad) 105814: ff (bad) 105815: ff 89 e5 56 ba ff decl 0xffba56e5(%ecx) 10581b: ff (bad) 10581c: ff (bad) 10581d: ff 83 ec 0c 8b 75 incl 0x758b0cec(%ebx) 105823: 08 8b 8e a4 00 00 or %cl,0xa48e(%ebx) このような箇所がありました。この"(bad)"っていうのはなんでしょうか? なにか意味があるんですか?
>>670 単なるinvalid instruction。
データ部分かなにかを強引に逆アセンブルしてるだけ。
>>671 ということはこれはNOP(0x90)と同じという意味なんですかね。
>>672 違う
普通は実行すると例外が発生する
# gccが.textセグメントに定数埋め込んでるだけだと思うので普通は実行されないが
>>673 add命令の後に実行されるようにみえるが…
10580fから逆汗してるからそう見えるんでしょ? 105810から逆汗すると別の命令になるんじゃ?
>>674 add命令のオペランドは何か分かってる?
>>675 が正解
105810:
55 push ebp
b8 ff ff ff ff mov eax,0ffffffffh
89 e5 mov ebp,esp
56 push esi
ba ff ff ff ff mov edx,0ffffffffh
83 ec 0c sub esp,0ch
8b 75 08 mov esi,dword ptr [ebp+8]
8b 8e a4 00 00 00 mov ecx,dword ptr [esi+000000a4h]
ということはこれはobjdump(libopcode.so)のバグということでいいんでしょうか? Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 ・・・・ [10] .plt PROGBITS 00014be4 014be4 000140 04 AX 0 0 4 [11] .text PROGBITS 00014d30 014d30 0f5a60 00 AX 0 0 16 [12] __libc_freeres_fn PROGBITS 0010a790 10a790 000d4d 00 AX 0 0 16 ELFヘッダの内容を見れば、.textセクションの範囲内でした。
バグとは言い切れんかもな。 完全なdisassembleは決定不能問題だから。
Symbol table '.dynsym' contains 2172 entries: Num: Value Size Type Bind Vis Ndx Name 2162: 001057d0 63 FUNC GLOBAL DEFAULT 11 realpath@GLIBC_2.0 001057d0 <realpath>: 1057d0: 55 push %ebp 1057d1: 89 e5 mov %esp,%ebp 1057d3: 53 push %ebx 1057d4: 83 ec 08 sub $0x8,%esp 1057d7: 8b 45 0c mov 0xc(%ebp),%eax 1057da: e8 b0 f5 f0 ff call 14d8f <sigprocmask@plt+0x7b> 1057df: 81 c3 41 80 02 00 add $0x28041,%ebx 1057e5: 85 c0 test %eax,%eax 1057e7: 74 15 je 1057fe <realpath+0x2e> 1057e9: 89 44 24 04 mov %eax,0x4(%esp) 1057ed: 8b 55 08 mov 0x8(%ebp),%edx 1057f0: 89 14 24 mov %edx,(%esp) 1057f3: e8 b8 25 f3 ff call 37db0 <realpath> 1057f8: 83 c4 08 add $0x8,%esp 1057fb: 5b pop %ebx 1057fc: 5d pop %ebp 1057fd: c3 ret 1057fe: 8b 83 44 01 00 00 mov 0x144(%ebx),%eax 105804: 65 c7 00 16 00 00 00 movl $0x16,%gs:(%eax) 10580b: 31 c0 xor %eax,%eax 10580d: eb e9 jmp 1057f8 <realpath+0x28> 10580f: 00 55 b8 add %dl,0xffffffb8(%ebp) 105812: ff (bad) 105813: ff (bad) お騒がせして済みません。どこがおかしいのかは分りませんが、どうやら未使用の領域に 適当にデータが書き込まれているようです。なんでこんな風になっているのかは分りません。 しかもゼロ埋めすらされていない。。。realpathのサイズは63。0x10580dまでです。
未使用というのはちょっと違うか。
>>677 さんが言ってるように、NULLで区切られて0x105810バイト目から
ある処理が埋め込まれてるのかも。
ただこの場合、相対ジャンプする箇所に<realpath+0xXX>と、realpathからの
バイト数が表示されるはずですが、そのような箇所はありません。
実際に実行される可能性があるのかどうかは分りません。
alignする為のダミーがあるのかもしれんよ。
>>679 氏の言うとおり。
リンカの仕様として関数を16バイト境界に整列させるというのがあるようです。 で、次のグローバルなシンボルまでの領域にローカルなコードが埋め込まれているのかも。 objdumpはこれをグローバルな関数の下に無理やりつけてしまう仕様のようです。 105810からを一つの関数と見なすと以下のようになりました。 スレ汚し失礼しました。
10580f 00 105810 55 ;push %ebp 105811 b8 ff ff ff ff ;mov $0xffffffff,%eax 105816 89 e5 ;mov %esp,%ebp 105818 56 ;push %esi 105819 ba ff ff ff ff ;mov $0xffffffff,%edx 10581e 83 ec 0c ;sub $0xc,%esp 105821 8b 75 08 ;mov 0x8(%ebp),%esi 105824 8b 8e a4 00 00 00 ;mov 0xa4(%esi),%ecx 10582a 85 c9 ;test %ecx,%ecx 10582c 74 33 ;je 105861 10582e 8b 45 14 ;mov 0x14(%ebp),%eax 105831 8b 55 0c ;mov 0xc(%ebp),%edx 105834 89 44 24 08 ;mov %eax,0x8(%esp) 105838 89 54 24 04 ;mov %edx,0x4(%esp) 10583c 8b 86 98 00 00 00 ;mov 0x98(%esi),%eax 105842 89 04 24 ;mov %eax,(%esp) 105845 ff d1 ;call *%ecx
105847 ba ff ff ff ff ;mov $0xffffffff,%edx 10584c b9 ff ff ff ff ;mov $0xffffffff,%ecx 105851 83 f8 ff ;cmp $0xffffffff,%eax 105854 74 07 ;je 10585d 105856 89 c1 ;mov %eax,%ecx 105858 89 c2 ;mov %eax,%edx 10585a c1 f9 1f ;sar $0x1f,%ecx 10585d 89 d0 ;mov %edx,%eax 10585f 89 ca ;mov %ecx,%edx 105861 83 c4 0c ;add $0xc,%esp 105864 5e ;pop %esi 105865 5d ;pop %ebp 105866 c3 ;ret 105867 89 f6 ;mov %esi,%esi 105869 8d bc 27 00 00 00 00 ;lea 0x0(%edi),%edi
コード領域は00でもnopでもなく未定義命令例外を出すコードで埋めてほしいところだけどx86の1バイト命令では無理なんだよな
kodakキター!
gccもですか…
CC って INT 3 のこと?
CCといったらさくら さくらといったら作者急病
DevC++に関連したスレはないのか? 無いなら立ててもらいたいのだが。 うちからじゃホスト制限で無理ぽい。
テンプレぐらい書けヴォケ
なぁ、gcc 3.3.5って確かにreleaseされたと思ったんだけど消えてねーか?
ごめん、あった。 日本のミラーサイトに無い所が結構あったぞ。
>>687 の意図がわからないので眠れないのだが...
以下のアセンブリソースで pushl %ebp movl %esp, %ebp subl $8, %esp movl $.LC0, (%esp) call printf <ーーー A leave ret Aの箇所に命令では無いバイナリコード(e.g. 0xFF)を置きたい場合、 どういう風にするんでしょうか?
すいません。わかりました。
700 :
665 :04/10/12 09:44:15
>>666 ありがとう御座います、早速やってみました。
なんとか行けそうな感じです。
perlでバイナリー化ツールを制作しようと考えてます。
>>667 工夫して回避するつもりです。
オフセット位置や、レングスをあらかじめ内包してデータ化するなどして。
>>668 クライアントの仕様で、DLL等は使えない状態です。
>>669 参考になりました。
RESありがとう御座います。
返事が遅れて申し訳ありません。
703 :
デフォルトの名無しさん :04/10/12 17:58:18
特許が技術の進歩を阻害する。
704 :
LettersOfLiberty ◆rCz1Zr6hLw :04/10/12 18:00:03
Re:>703 この際、政府には研究費の増額を頼まないと。
>>702 ああ、それかい・・・
Kodakが特許ゴロ化しないことを祈るよ。
下手すりゃオブジェクト指向的な要素をもつ言語が皆殺しにされちまう。
Kodak氏ね
707 :
デフォルトの名無しさん :04/10/13 01:41:07
つーか特許死ね
特許氏ね じゃなくて 特許ゴロ氏ね なら理解出来る
ゴロられる特許のシステムは氏なんでいいですかいいですねすいません。
アメリカは法律屋が権力持ちすぎなんじゃないの? 知的所有権も法律屋の商圏広げるためのものだって気がしてきた。
やっと気付いた?
>>711 うん。知的所有権ってアメリカの国益を確保する目的が
一番なんだと思ってた。
だからさ、そういう視点から見れば、 FSFなんかが知的所有権に猛烈に反対してるのは、 法律屋の商圏拡大を食い止めるだけの意味しかないんだなって思った。 理念めいたこといっても所詮はパイの取り合いみたいなもんだ。 市民運動なんて国外に持ち出したらまったく別の 意味合いになってしまうんだろな。
×FSFなんかが知的所有権に猛烈に反対してるのは、 ○FSFなんかがソフトウェアの知的所有権に猛烈に反対してるのは、
だからさ、日本人でGNU信者やってる奴なんてただの馬鹿だろうな。 本音と建前の使い分けに長けてるアメリカ人のいう、一つの理念=建前を 真に受けて信じちゃってるんだからさ。 もちろん理念がただの建前だとしても、そこになんの真理もないと 言うつもりはないけどさ。
>>715 でも、日本でGNUな活動してはいけない理由がまったく思いつきませんが?
>>715 >法律屋の商圏拡大を食い止める
現状でアメリカほど酷くはないだろうけど
これは日本でも(予防的に)やってほしい
>>713 >だからさ、そういう視点から見れば、
>FSFなんかが知的所有権に猛烈に反対してるのは、
>法律屋の商圏拡大を食い止めるだけの意味しかないんだなって思った。
>理念めいたこといっても所詮はパイの取り合いみたいなもんだ。
>市民運動なんて国外に持ち出したらまったく別の
>意味合いになってしまうんだろな。
知的所有権が国外にまで影響するからじゃねーのか。違うのか?
>>701 3.5.0はどこにありますか? 探してるんですけど...
>>720 3.5.0 というのはリリースされていないだす。
リリースされる予定もありません(次は 4.0 になるから)
701 の記事では、CVS からソースを取ってきて使ってると書いてある。
それでもicc8の方が全然速いのね
Pen4上で比較されたらほぼ全てで負けるのは仕方がない… 他のだったらもうちょいいい勝負になると思うけど
そもそもコンパイラなんてCPUといっしょに開発するものだからな
フロントエンドとバックエンドどっちの話をしてるんだ?
まあ, iccが速いのは事実. PGIは64bitがどうなってるのか知らないが, 結構速い.
ここはiccスレではありません。
じゃあ hcc の話でもしようか。
GCCがあるなら、 KCCがあってもよくね?
KCCって何?Korean C Compilerか?
731 :
LettersOfLiberty ◆rCz1Zr6hLw :04/10/14 16:33:33
dmc、bccは?
732 :
デフォルトの名無しさん :04/10/14 17:16:51
ICCもGCC互換だよね.
734 :
デフォルトの名無しさん :04/10/15 07:15:58
gccは64bitのプログラムを書けますか?
お前は書けるのかよ?
736 :
デフォルトの名無しさん :04/10/15 08:50:46
ついでに質問 64bitのint演算って、 どうやってやるの? ライブラリとかあるの?
int64
long long
GNATは、GNU版のAdaのこと。 さらにGNATは、GCCの中間形式を生成するコンパイラである。
741 :
デフォルトの名無しさん :04/10/16 22:59:58
だれも聞いてないのに・・・
i686マシンで"-O3"を指定すれば、プリフェッチ命令を使用しますか? っていうかgccってプリフェッチ命令を使うんですか?
>>743 1. GCCは現在使っているCPUを見て生成するコードを変えたりはしません。
2. i686 にはプリフェッチ命令が存在しないCPUがあります。(PentiumPro、PentiumII)
てゆーか、基礎がなってない上に自分で調べずに他人に聞く馬鹿は氏ね。
746 :
デフォルトの名無しさん :04/10/17 20:24:28
748 :
デフォルトの名無しさん :04/10/18 14:55:15
Hello, what is the good introductory text for gcc ? Thank you.
>>748 There is no such text but are some good texts.
You'd rather choose a favirite one among them.
以前はPropoliceって言ってたやつでしょ? SSPに名前変わってたのか。
各国、登録商標でうるさいからでしょ。
754 :
デフォルトの名無しさん :04/10/22 01:18:11
755 :
デフォルトの名無しさん :04/10/23 07:19:25
CPUがいくつあるかを判断するにはどのようにしたらよいでしょうか?
筐体のふたを開ける
GCCで筐体のふたを開けるためのライブラリを教えてください
printf("フタを開(ry
760 :
デフォルトの名無しさん :04/10/23 12:06:19
自分のホームディレクトリに自分用のヘッダファイルがおいてあるディレクトリをつくりました。 ここを常にサーチするように設定するにはどうしたらよいのでしょうか?
C_INCLUDE_PATH
CPATH CPLUS_INCLUDE_PATH OBJC_INCLUDE_PATH
>>763 全然関係ないリンクをはるなよ。
彼が問題にしてるのはcompilation performanceだ。
std::complexがいい加減じゃない?
General Setup ---> ・・・ (0) Function alignment (NEW) (0) Label alignment (NEW) (0) Loop alignment (NEW) (0) Jump alignment (NEW) Linuxのmenuconfigにこういう項目が出来ていたんですが、 これってキャッシュに乗りやすくするためですよね。 これによってそんなにパフォーマンスって変わりますか?
CPUによるんじゃね? Pen4だとコード整列は効果はないとかどっかで見たな データ整列のほうは効果あるみたいだが
ていうかtree ssa branchってそんなにすぅぐぉいの? できたら数字つきのベンチのってるページぷりーづ。
>>767 これはalignmentそのものが目的じゃなくて、
飛んだ先ですぐに又cache missを起こさないようにするには、
alignmentをしておいた方がいい。cache境界と合致してるから。
ってことでしょ。
>>769 Functionはそうだろうけど、他はそうでもないような・・・
771 :
デフォルトの名無しさん :04/10/29 02:41:45
threadchigai
>>770 他もそうだよ・・・っていうか普通はループ先頭のラベルをアラインするのがよく行われてる。
(画像処理系のカリカリのアセンブリコードでの align 擬似命令の使われ方とか見てると。効果の程は??だけど)
でもPen4だとμOPがキャッシュされてるので、小さなループでの元のIA32命令のアラインは関係ない、
ってのが「Pen4だと・・・」の話。
関数単位とかは多少は意味あるでしょうね。
一時キャッシュのラインに前の関数の後ろの方とか載せるのムダだし。
キャッシュミスを避けるためというより、 キャッシュヒット時の命令プリフェッチ帯域を上げるため。
774 :
デフォルトの名無しさん :04/11/01 06:40:52
775 :
デフォルトの名無しさん :04/11/03 13:19:59
#include <stdio.h> #include <string.h> int main() { char *text = "this is a test."; char *token; token = strtok( text , " ." ); while( token != NULL ){ printf("%s\n",token); token = strtok( NULL , " ." ); } return 0; } というプログラムがあって、これをbccでコンパイルすると期待通りに動くのですが gccだとセグメントエラーが出ます。 変数textを配列にすると、エラーが出ずに動くんですが、これはgcc側のstrtokに関するバグでしょうか? gccのバージョンは3.3.3でCygwin上のものです。
776 :
デフォルトの名無しさん :04/11/03 13:31:02
釣りか
777 :
Rubykitch :04/11/03 13:32:06
ばかばっか
778 :
デフォルトの名無しさん :04/11/03 13:33:21
778
ISO/IEC 9899:1999 6.4.5 String literals 6 It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.
781 :
Rubykitch :04/11/03 13:51:58
ホント、救いようがないなw -Wall -Werror付けとけ。
すいませんでしたm(_ _)m strtok関数は第一引数を変更しながら進んでるんですね。 変更せずに関数内部でなんとかしてるのかと思ってました・・
もしそれらの要素が適切な値を持っていると、 これらの配列が別個かどうかは無指定です。 自分で読んで意味が分からなかったから機械翻訳させてみたけど 結局同じ訳になってさっぱり意味がわからない。
JIS X 3010:2003 6.4.5 文字列リテラル それらの要素が適切な値をもっている場合、これらの配列同士が別個であるか どうかは未規定とする。プログラムがこれらの配列を変更しようとした場合、 その動作は未定義とする。
gcc 3.3とgcc 3.5の違いって何? へたれなおいらには良くわからなかったっす...
3.5は無くなったよ。 3.4の次は4.0だよ。
787 :
デフォルトの名無しさん :04/11/03 14:29:02
( ゚д゚)ポカーン
Win版のVC7.1に続いてWin版のicc-8.1がboost100%になってるらしいな
>788 よう。CodeWarrior-9.3も100%らしいな。
gcc-4.0.0は2.95並のコンパイル速度とVC並の最適化らしいですが本当ですか
星に願うとしよう。
794 :
デフォルトの名無しさん :04/11/03 17:59:55
C++の方はicpc
795 :
デフォルトの名無しさん :04/11/04 17:02:43
dvec.hってgccで使えるのでしょうか?
20041031のパッチがなかなかでないね。なんでだろう。
797 :
デフォルトの名無しさん :04/11/07 01:38:10
>790 ということは、gcc3.4と比べると、コンパイルの早さが改善するものの、コンパイルされたバイナリの質はそれほど変わらないってことですか? Pentium4とか、x86_64系とか、もっと最適化が賢くなってるといいなぁー、と(漠然と)思っているもので。
798 :
デフォルトの名無しさん :04/11/07 04:45:24
そろそろデフォルトで2進数使えるようになんねぇかな
最低限IQ128以上あれば2,8,10,16進間の変換を脳内で瞬時にできるから不必要。
IQ100あれば2進16進間は一瞬だと思う
>>799 だとしたら、16進表記も不要だと思うのだが・・・
>>800 つまりアフォ以外には2進は必要無しということですね
>>801 16進はソースコードの文字数を減らすための仕組みだよ。
2進が必要な環境って脳が退化してるオヤジが多いのですよ
いいじゃんかよぅ退化してたって!
806 :
デフォルトの名無しさん :04/11/07 08:45:52
UNIXのコマンドで2,8,10,16を変換する方法とかないの? 漏れはWINDOWSの電卓使ってるけど。
>>806 デフォルトで入っていそうなのはbcとか。
変数obaseの値が出力の基数になる。ibaseが入力。
ibase=10
obase=16
とすれば10進から16進の変換が可能。
>>806 ,807
藻前ら基数変換以前にスレタイも理解できないアフォでつか。
喪前は流れも読めないアフォでつか。
810 :
デフォルトの名無しさん :04/11/07 12:36:22
でも、2進数表記ができた方が便利なときもあるよねー。 弊害もないと思うので、0b0101010101 みたいな表記を許してくれればいいのにな、と僕も思います。
812 :
デフォルトの名無しさん :04/11/07 13:34:14
ldの話をしたらスレタイも理解できないアフォと言われそう。
8進数はあるのに(正直使ったことない)2進表記がないのは 最近までサイズ明示した型がなかったことと並ぶCの謎の一つであった。
昔のハカーは2進<->8進<->16進の変換が脳内で自明にできたのさ. まぁBoostでも使うとよい.
なら8進だっていらないじゃん
>>755 ageだし環境書いてないし… 釣りなのか…?
しかし良スレだ。
ageは関係ないだろ
古いものだと x68k 版の gcc とか、最近だと Tiny C Compiler が 0b な2進数表現に対応してるね。 さいきんの gcc は独自拡張はしないという印象があるなあ。
2進 8進 16進の相互変換は計算するまでもなく簡単だろ。 10進との変換は計算が必要だけどね。 2進数を3桁ずつ区切って変換すれば8進数に、4桁ずつ区切って 変換すれば16進数になる。一桁の8進数、16進数のビット配列の テーブルくらい頭に入らないやつは(ry
821 :
デフォルトの名無しさん :04/11/07 18:12:47
HT対応かどうかを調べる方法を教えてください
822 :
デフォルトの名無しさん :04/11/07 18:31:25
ユーザーに聞く
unsigned a = 0x987654321; unsigned b = 0b100110000111011001010100001100100001; これでbが分かり易いという奴の気が知れない。
>>823 4桁ごとに分けて書けるようにしたいよね。
unsigned b = 0b_1001_1000_0111_0110_0101_0100_0011_0010_0001;
16進のほうがわかり易いな 冗長なだけだ
>>823 一応今使ってるgccは2進表記パッチ当ててるけど
さすがにそういう使い方はあまりしないよ。
マスクするときに使うけど。
>>823 プロセッサのシミュレータをつくるときなんかだと、bの方が分かりやすそう。
作ってみた $ cat test.cpp.gz.base64 H4sICN76jUEAA3Rlc3QuY3BwAKVUX4ubQBx891MM9UXhHtSYxJBQaEuhhXvMQ9/CqmsimE3w DxyUfvfOzxy3undcyjVhXGacHX87xPi1KZqh1NjVl65vtTp/9oauNkcYddbdVRUaXV9uPb/U VW008ogf7KPD4TDTYuxjR4vpS1yNvsVciyUvdTX6lo4meStXo2890+JxvszV6Ns4muQpV6Mv n2vjfIWr0Vc6muRpV6Ovmmpjc4gsl9YQWy6NIbFc2sLCcmkKqeXSEpaWS0NYWS7tYG25NIPM cmkFG8ulESjLpQ3klksTKCyXFlBaLg1AWy6nR/XCv/7cJz++/wpUewzBy8uNb1/2cXCNHnCN Q0RPvn+NiHi60d4XM4SRTBOSZweREItpEpEQi9kor/wSAledPiJ1bhIpsSRWxPqtRxIpsSRW xHo6wv08eag70ivXdMTsjpnIiA2hiJwoiJLQRPUvRyAyYkMoIicKoiQ0Ufn+4+P0mP8/kxzs Xg13U7za9Dir2iAI4f32gMF09dHoEsVJtRgKBPJLQzC+vA+3dzgMt1Nnd7q0PYZutCZz63xx NjYX/rEOzbgvfW/fe8tbmc/Bt+Tso8kfXW4TFZehx26Hk36ShU3y+olfId2UNDMyMm3KRkJa 3Q+tQbT1/nh/ATengnecBgAA $ < test.cpp.gz.base64 base64-decode | gunzip - > test.cpp 使い方 unsigned char uc (BIT1 (b1111, b1111)); unsigned short us (BIT2 (b1111, b1111, b1111, b1111)); 俺は絶対使わんがw
それよりprintfで2進表示がしたい
>>829 C++だけど改造して
#include <iostream>
#include <bitset>
template <class T> std::ostream & output_as_bits (std::ostream &p_os, const T &p, bool ascending_order = true) {
std::bitset <sizeof (T) * 8> p_bit; const char *pp (reinterpret_cast <const char *> (&p)); char byte_digit (1);
for (size_t i (0); i < p_bit.size (); ++ i) {
p_bit.set (i, static_cast <bool> (*pp & byte_digit));
if ((i + 1) % 8) byte_digit <<= 1;
else {byte_digit = 1; ++ pp;}
}
if (ascending_order) {
p_os << "L"; size_t i (0);
while (i != p_bit.size ()) {p_os << p_bit.test (i); ++ i;} p_os << "H";
} else {
p_os << "H"; size_t i (p_bit.size ());
do {-- i; p_os << p_bit.test (i);} while (i != 0); p_os << "L";
}
return p_os;
}
int main () {
int i0 (10); float f0 (10);
output_as_bits (std::cout, i0) << std::endl;
output_as_bits (std::cout, f0) << std::endl;
return 0;
}
>>829 printf("%b\n",a);
じゃだめだっけ?Cあんまりつかわないかんな
余計なものが入ってたので除いた $ cat test.cpp.gz.base64 H4sICPIdjkEAA3Rlc3QuY3BwAKWUXWvCMBSG7/srDutNC7toatWKMth2NfDS+9EmqRZqWvoB wth/39s4Nalih1Mew6PnvCcNQTdXvOiEpFVeNm0tk/2L0zW52pJK9rKpEi6pacXScYXMciUp DfCiwHJGzHQWUGg5o4nhDP2R5YympqN/Zjmj+cVZPz+2nNHCdPQnljNKDe/nc8sZCdPRLy1n lJ39/XXDPr0qeKaK+RQcXLcKwOUA3j427Py7rqaTmiHhKQSEYGKGgRBMzNDwql6n0PBrc0g0 HAIiMAUzML81FERgCmZgbm4iGs3TU4ebuiozNxmPbRLEYAESkAIOBJAg+8tDgBgsQAJSwIEA EmSuu16bDxr/e0/6ycYOYjTGyVVL+yRX5PnkfDlEnWryrZKC+C6pqePk9TeOPH1Rn4/31feX ZmWzK+uWukaXhnapvQwaixJ/BF2h+6J7ffeWW5m/wcfk+NHkR5fjjnjZtbRa0U4e+gUnic8n vHtpTCks0SaVKPqQWrZdrShYOt/ODxvctoxMBQAA $ < test.cpp.gz.base64 base64-decode | gunzip - > test.cpp
>>821 スレ違いだが……。詳しくは Intel のサイトに行って
IA-32インテルアーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル
ってタイトルの PDF ファイル探して読んでくれ。
ていうか標準じゃないものはイラネ
>>836 マニピュレータ作ったこと無いんだけど
面倒じゃなかったら830を改造してちょ
>>837 コンパイラにパッチ当てるよりはいいんじゃない?
char* int2bin(int arg) { const int digit = 32; static char ret[digit+1]; for(int i=0; i<digit; i++){ if((1<<i)&arg){ ret[digit-i-1]='1'; }else{ ret[digit-i-1]='0'; } } ret[digit]='\0'; return ret; } int bin2int(char* arg) { int ret = 0; int digit = strlen(arg); for(int i=0; i<digit; i++){ if(arg[i]=='0'){continue;} ret|=(1<<(digit-i-1)); } return ret; }
gcc拡張のhexadecimal floating-point constantsってどうよ? `1.55e1'=`0x1.fp3'っていうんだけど。
>>841 浮動小数点数の内部表現を意識したいとき(計算の精度を気にするときとか)に使えそう。
だがぱっと見は読みづらい。
844 :
デフォルトの名無しさん :04/11/08 07:17:13
GCC 3.4.3 release age
既出さげ
あれ?出てたか?
847 :
デフォルトの名無しさん :04/11/08 08:18:25
C で bit の rotate って出来ますか? あと rotate with carry とか shift with carry とか したいときってありません?
849 :
デフォルトの名無しさん :04/11/08 16:16:21
unsigned long _lrotl(unsigned long value, int shift) 符号なし long 型整数の各ビットを左にローテートします。 unsigned long _lrotr(unsigned long value, int shift) 符号なし long 型整数の各ビットを右にローテートします。 unsigned int __rotl(unsigned int value, int shift) 符号なし整数の各ビットを左にローテートします。 unsigned int __rotr(unsigned int value, int shift) 符号なし整数の各ビットを右にローテートします。
>>849 _GCCの_バージョンはいくつですか。
852 :
デフォルトの名無しさん :04/11/09 17:25:56
gccをバージョンアップしたいのですが、ダウンロードした後どうすればよいのでしょうか?
>>852 バージョンアップすればよいと思います。
854 :
デフォルトの名無しさん :04/11/09 18:15:32
>>853 ご回答、ありがとうございます。
バージョンアップとは具体的にはどのようにやればよいのでしょうか。
OSはsuse linux9.1です。
コンパイルしてインストールすればいいです。 コンパイル方法は環境に強く依存するので自分で調べてください。 ここから先の質問は環境に強く依存するのでここにはしないでください。
857 :
デフォルトの名無しさん :04/11/09 19:52:32
( ) , をマクロで文字列化したいのですが、 エラーが出ます。回避する方法はあるのでしょうか?(GCC3.4.3 cygwin) #include<iostream> #define COMMA , #define LPAREN ( #define RPAREN ) #define STRINGIZE(x) STRINGIZE_I(x) #define STRINGIZE_I(x) #x int main() { std::cout << STRINGIZE(COMMA) << std::endl;//error std::cout << STRINGIZE(LPAREN) << std::endl;//error std::cout << STRINGIZE(RPAREN) << std::endl;//error }
>>857 Boost の preprocessor ライブラリを使うとよろし。どういう仕組みで実現してるかは
ソース見れば一目瞭然だが。
859 :
857 :04/11/09 20:09:07
>>858 実はもう試していたのですが、
やはりエラーがでるので質問している次第です。
(boost/preprocessor/config/config.hみてもGCCの記述がなかった...)
//boost1.32draft(11/2)
#include<iostream>
#include<boost/preprocessor/library.hpp>
int main()
{
std::cout << BOOST_PP_STRINGIZE(BOOST_PP_COMMA()) << std::endl;
std::cout << BOOST_PP_STRINGIZE(BOOST_PP_LPAREN()) << std::endl;
std::cout << BOOST_PP_STRINGIZE(BOOST_PP_RPAREN()) << std::endl;
}
860 :
デフォルトの名無し :04/11/09 20:16:50
CygwinでGCCを使うとエラーメッセージが文字化けを起こします。 GCCがSJISでメッセージを履いているためと思いますが 回避する方法をご存知ですか?
LANG=C
gcc ガン( ゚д゚)ガレ
( ゚д゚) gccガンガレ、超ガンガレ
864 :
デフォルトの名無しさん :04/11/13 03:43:54
gccで、-lで複数の ライブラリをリンクする際、 内部のシンボルのリンクされる順番は ld 依存なのでしょうか? その場合、どういう順番でリンクされるかといった「詳細仕様?」は どこを見れば良いのでしょうか?
867 :
デフォルトの名無しさん :04/11/15 17:21:36
gccって他の商用コンパイラと比べて最適化のほどはどうなのでしょうか?
icc>vc>>>>>>>>>>>>>>>>gcc
icc>>>>>>>>>vc>>>>>>>>>>gcc>>>>>>>>>>>>>∞>>>>>>>>>>>>>>bcc
870 :
デフォルトの名無しさん :04/11/16 00:11:40
iccが最強なのはPentium4のみ?
Intel系のCPUなら大抵最強。
872 :
デフォルトの名無しさん :04/11/16 01:30:09
distccでクライアントのLANGをサーバーで起動するgccに 反映させたいのですが、どうすればいいのでしょうか? 現状はサーバーでdistccdの起動時に固定のLANGを設定しています。
コマンドに、 env オプションに LANG=XXX distccd ... を指定すれば? つまりサーバで、 env LANG=XXX distccd ... する。
>>874 XXXを$LANGとかにすれば、
>>872 > distccでクライアントのLANGをサーバーで起動するgccに
> 反映させたい
となるじゃない。
$LANG設定してない場合は、XXXの代りに、
`locale | awk -F= '$1 ~ /LANG/ { print $2 }'`
を。
DISTCC_SSHをwrapperにしたり。
達人にお聞きします。 XScale用のGCC 3.3.1で、char *を構造体のポインタにキャストすると、 そのポインタが2バイト境界または4バイト境界に整列していると 仮定されたコードが生成されてしまいます。 一時領域にコピーしてから扱う、という方法しかないのでしょうか?
そうですね。 offsetof()とかで頑張って分解してからアクセスしても、 int *なんかも境界に合わせられちゃうんじゃないですか?
>>875 もしかして、クライアントで実行するコマンドを
distcc env LANG=$LANG gcc ...
にするってこと?
>>876 attribute packed で逃げることもできるだろうけど、
データのほうをいじれるなら、パディングして
データのアライメントを合わせたほうがいいんじゃないかと思う・
>>877 うーん、分解してからでも一緒っぽいです。
>>879 背景説明が不十分でしたね。
状況は、通信データをメモリに展開したもので、
struct {
int type;
char data[1];
} common;
のように共通のヘッダがあり、データは可変長です。
なので、struct commonの先頭はalignされていませんし
メンバの位置の変更も不可です。
x86では普通にキャストすると思いますが、そういうコードを
ARMにポーティングしてくるときにはどうするのか、というのが
質問の趣旨です。
>>880 その構造体ならば構造体自体をアラインして確保しておけば良いですが、
そうもいかない場合には char* で1バイトずつアクセスするコードを書く
必要があります(int 領域へ memcpy とかでも良い)。
Alpha AXP なんかと違って実行時例外も発生しないので、大きなコードの
ポーティングの際には苦労しそうですね・・・
ARM用のディストリから引っ張ってくるのが楽か。
-mstructure_size_boundaryで8を指定しても駄目かね。
>>880 普通、バイトオーダの問題もあるから、x86 でもキャストで済ますコー
ドなんて書きませんてば。int でも1バイトずつ読んで組み立てるのが普通。
>>881 データが可変長なので、dataが奇数バイトのケースがあり
元のデータについてはアラインされていません。
1バイトずつ、というのはソースを書き換えればOKですね。
実際にはntohs(p->type)のようにアクセスしているので、
バイトアクセスするmy_ntohsを定義するという感じですかね。
(エンディアンの判定が必要になりますが)
アラインエラーは実行時例外を発生させてOSかライブラリが
何とかしてくれると思ってたんですが。
memcpyも困ったもので、4バイトや8バイトだとbuilt-in memcpyに
置き換わってしまうケースがあるみたいです。
>>882 それは構造体のサイズを8バイト境界に揃えるオプションでは?
>>883 すいません。説明が足りませんでした。
ntohxでアクセスしてますが、通信系のXScaleはdefaultが
big endianなので、変換系マクロで何もしないため、問題が
起きているようです。
>>885 gcc でいいのなら、
>>879 の言うように packed アトリビュートで済ますのが良いのでは?
移植性考えるならバイトアクセスして値を取ってくるようにするべきかも知れないけど。
まあ言語仕様に違反したコーディングをしてるんだから、苦労もしかたあるまい。
実行中のプログラムの stack trace を獲得する方法はありますでしょうか? (Java の printStackTrace の様なコトができるとありがたいです) debugger 上で動かして stack trace を確認するのではなくて、 プログラム内に stack trace を獲得するコードを書きたいです。 実行環境としては Linux でやっておりますが、FreeBSD や Solaris 等の 他の Unix系プラットフォームでもかまいません。
何かアドレスが表示できる。infoみれ。 __builtin_return_address (level) __builtin_frame_address (level) levelは定数ね。
>>889 どうもありがとうございます
キーワード教えていただきましたので 何とか調べられそうです。
892 :
デフォルトの名無しさん :04/11/18 23:05:00
age
893 :
デフォルトの名無しさん :04/11/18 23:53:08
エラーメッセージをカラー表示する方法はありますか? どれがwarningでどれがerrorなのかわかりません。 特にマイナーなエラーのとき
>>893 "error:" "warning:" とかで区別してカラー表示するフィルタみたいなのを作る。
>>893 gccをemacsみたいな統合環境から使ってみたらどうでしょ?
あとwarningの出ないソースを目指すとか
そのものずばりの解凍ではなくてごめんなさい
896 :
893 :04/11/19 01:26:01
>>894 せめてエラーに error: ってついてればいいんだけどなぁ
法則はあるみたいなのでフィルタ作るよ
>>895 emacsは嫌いなので使ってません
すみません
やったことないけどメッセージカタログいじって色指定のコントロールコードを 入れるんじゃ駄目なのかな?
エラーなんて最初の一行だけで十分
>>898 エラーの前に警告が沢山あったらどれがエラーか分かりにくいのは同じ
>>893 -w で警告を全部出さないって言うのはだめなの? 私はmake変数でこの
オプションを簡単に切り替えられるようにしてる。 とりあえずコンパイルが
通るまで make NOWARN=1 とかしてエラー無しに通してから警告を
見るという感じかな。
つうかみなさん警告って気にしないのかな? おいらは-Wallでも全く出ないようにコーディングしてるんだけど あっ-ftemplate-depth-NNは付けてる
>>902 じゃerrorとwarningを色分けしたいひとは
ふつーじゃないと?
ふつーerrorなんて出ない
>>903 ふつーにもいろいろあるから一応ふつーといえなくもないがまともではないな
>>901 ありがとう
カラーリングの参考になったよ
自分としては、gccを差し替える方式よりも
makeの後ろとかにもパイプーできるように
したいんだよね
すでに出力済みのものにもかけれるし
907 :
デフォルトの名無しさん :04/11/20 12:14:01
win32で動くプログラムは作れますか?
作れます
910 :
デフォルトの名無しさん :04/11/20 20:35:40
Python スレに誘導しなきゃ
Cで書こうぜ
unix系でテキスト処理って言ったらやっぱりperlなのかな
今はpythonって人も多いと思われ
いや、Rubyも追いつけ追いこせです。
こんなスレにも沸いて出るのか・・・
>>913 emacs lispで書いて、-batchで流します。
918 :
デフォルトの名無しさん :04/11/21 02:22:05
ruby以外は糞言語だと何度言ったら分かるんだ?
ccache入れたけど、結局本当にほんの少しの.c、.cppの変更以外 キャッシュなんて効きゃしないんだよね。 やっぱりプリコンパイルヘッダなり、よく練られた中間オブジェクト形式なりに 期待したいんだけど、現在のGCCのその辺の事情ってどうなってんのよ。
>>920 gcc 3.4.3でも入れてinfo見れ。
最初の目次から、keyword index → precompで検索
923 :
デフォルトの名無しさん :04/11/21 14:46:16
Makefileの書き方を教えてください
925 :
デフォルトの名無しさん :04/11/21 14:48:27
926 :
デフォルトの名無しさん :04/11/22 09:47:03
GCCのプリコンパイルドヘッダの検索順って、いまいち使い勝手悪いね。 ビルドをソースと別ディレクトリでやろうと思うと難しい。 優先的に探すディレクトリを指定する-pIオプションとかつけてくれないかな。
じゃあどこでやれと
930 :
デフォルトの名無しさん :04/11/23 01:16:50
ふう、Fedora-FC2->FC3にしたらgccが3.4.1に、 そして、今まで作ったプログラムのほとんどが、 error: ISO C++ forbids cast to non-reference type used as lvalue これmakeのオプションで我慢させる事出来ないの?
>>930 それってどんなケースで出てます?
unsigned char a;
(signed char)a = -1;
とか?
933 :
デフォルトの名無しさん :04/11/23 14:30:48
(10/3)*3 って 9 なんだね。 スゲー安心した。 10になったらどうしよう ってどきどきしてた。
VC++にある下記のオプションは、GCCでは何になるのでしょうか? ・小さい型への変換チェック(/RTCc)、 ・基本ランタイムチェック(/RTC1, /RTCsu)
935 :
ChaosicSoul ◆/yaJbLAHGw :04/11/23 14:42:55
商だけがでる割り算。これは今後も変わらないだろう。
GCCにCommonLispのパッケージが含まれるのはいつですか?
GHCはGPLじゃないからだめでそ
ChaosicSoul must die.
940 :
デフォルトの名無しさん :04/11/23 20:55:01
distccのトップページに "The (unreachable) theoretical maximum speedup is 3.0x" って書いてあるんだけど、これってホストマシンの数によらない理論値なんでしょうか?
941 :
ChaosicSoul ◆/yaJbLAHGw :04/11/23 21:52:56
Re:>939 Die before I die.
>>941 で、その「Re:」というのは何の意味があるのか答えろ
943 :
デフォルトの名無しさん :04/11/23 22:35:27
Chaosicってなんだよ。Chaoticだろ。
>>942 Re:Re:Re: のおじさんか
fjには馬鹿が多かったよな
945 :
ChaosicSoul ◆/yaJbLAHGw :04/11/23 22:54:07
Re:>943 そうか、どうりで…。
>fjには馬鹿が多かったよな 2chのほうがマシだとでも言いたいのか?
こわがりすぎー
>>942 マジレスすると「正規表現で表すと〜」ってこと。
>>946 2chにはアホが多い
fjよりはある意味マシかな
951 :
デフォルトの名無しさん :04/11/30 21:16:16
おい、書き込みがないぞ。
しかしfjの廃墟っぷりはすごいな
fjって何?
Free Java
fjは議論する能力を試される。 2ちゃんは読む人の知性が試される。
956 :
デフォルトの名無しさん :04/12/01 05:51:48
へー、omit-frame-pointerって x86では遅くなることもあるのか。 知らんかった。と、昔のレスをみて感想を述べてみる。 でも MIPSとかではきくんだよな。誤解するなよ>>おれ
ここはチラシの裏か。
959 :
デフォルトの名無しさん :04/12/02 01:34:09
gcjとかがgccの標準パッケージになるまでの経緯ってどんな感じだったんですか?
gcc-4.0について語り明かそう。
961 :
デフォルトの名無しさん :04/12/02 14:24:01
gcc 4.0 もうすぐっぽいですね。新しもの好きなので、もう使い始めています。
4の売りは何?
とっととpentium4にちゃんと対応しろよ これx86的にはクソコンパイラだからね
964 :
デフォルトの名無しさん :04/12/02 19:07:45
p4はintelにも見捨てられたクソcpuだからこれからやる意味がなぁ…
アムド64最強
>>957 -momit-leaf-frame-pointerはどうなんだろうね
なんで、上は警告が出て下は出ないのですか? test.c:4: 警告: スカラー初期化子がブレースで囲まれています test.c:4: 警告: (`a.a' の初期化は不完全です) 1struct hoge { 2 int a; 3} a = { 4 {0} 5}; 6 7int b = {0};
969 :
デフォルトの名無しさん :04/12/04 14:22:42
OpenMPは使えますか?
970 :
本田 :04/12/04 16:57:39
>>963 ほんとに、そうお考えなら、ご自分で、コードをコントリビュートすれば?
971 :
デフォルトの名無しさん :04/12/04 17:04:10
970 名前:あぼーん[あぼーん] :あぼーん あぼーん
972 :
本口 :04/12/05 06:04:09
>>963 ほんとに、そうお考えなら、ご自分で、コードをコントリビュートすれば?
973 :
本匚 :04/12/05 10:26:26
>>963 ほんとに、そうお考えなら、ご自分で、コードをコントリビュートすれば?
974 :
木田 :04/12/05 12:07:23
>>963 ほんとに、そうお考えなら、ご自分で、コードをコントリビュートすれば?
975 :
木口 :04/12/05 13:46:54
>>963 ほんとに、ほんとに、ほんとに、ごくろーさん
下らない発言でスレを潰すな!
ほんとにほんとにライオンだー 埋め。
978 :
デフォルトの名無しさん :04/12/05 14:29:49
PGIとgccでは最適化にどのくらい差が出ますか?
979 :
デフォルトの名無しさん :04/12/05 14:30:16
G C C この頭文字を使って何か面白い話を
984 :
BlackLightOfStar ◆ifsBJ/KedU :04/12/07 11:15:43
GNU Compiler Correction. GNUコンパイラの修正。
Gates Causes Confusion
>>983 最近この板こういう下らないレス多すぎ。
上昇傾向にあるってことだな
横ばいかも
Gimme Correct Code.
>>989 Go
Check your
Code first
991 :
BlackLightOfStar ◆ifsBJ/KedU :04/12/08 16:58:02
それで次スレはどうするの?
992 :
デフォルトの名無しさん :04/12/08 17:27:34
>>994 >使い切りたい
気持は分かるけど
ここのスレの後継としてはgccの文字が入ってる必要があると思う
「MinGWを使おう」は使い切った時点で「cygwin + mingwn + gcc 相談室」に合流ってのがいいのでは?
スレタイはシンプルでありながら
かつ乱立を防ぐよう必要なキーワードが入ってる方がいいと思う
使い切りを加速
いろんなスレがあるもんだ
しかしこのスレはどうなるのだろう
まあいいや
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。