のくす牧場
コンテンツ
牧場内検索
カウンタ
総計:127,062,837人
昨日:no data人
今日:
最近の注目
人気の最安値情報

    私的良スレ書庫

    不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitter
    ログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。

    元スレCygwin + MinGW + GCC 相談室 Part 4

    gcc スレッド一覧へ / gcc とは? / 携帯版 / dat(gz)で取得 / トップメニュー
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : - 476 + - cannot + - curses + - pthread + - wcout + - wcwidth + - yum + - リダイレクト + 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。
    レスフィルター : (試験中)
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitter
    501 : デフォルトの名無 - 2009/08/28(金) 22:52:03 (+23,-10,-17)
    どう失敗するのか書けよ。
    ライブラリがないのか? 実行時エラーか? エラーメッセージは?
    502 : デフォルトの名無 - 2009/08/28(金) 22:53:54 (-1,-29,-37)
    gccだとVC/C++用のライブラリは使えなかったりするから、
    shlwapiのライブラリをgccでコンパイルする必要があるのかもね。
    503 : デフォルトの名無 - 2009/08/28(金) 23:07:54 (+28,+0,-5)
    普通にインストールしてればインポートライブラリは入ってるよ。
    504 : デフォルトの名無 - 2009/08/29(土) 20:15:03 (+9,-30,-166)
    もしかして、Cygwinのgccで確保出来るメモリ量って結構少ないですか?

    膨大なソースで多分1日仕事になるであろうソースがあるんですが、
    _cygtls::handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
    ってエラーが出てて、どうもmallocかけてる所が怪しいんです。

    ちなみに、SolarisとFreeBSD(両方64bit版)では動いてます。
    Windowsは、XP x64だけど、多分Cygwinは32bitのはず。

    でも、32bitの領域食いつぶしてるとも思えないしなぁ・・・
    505 : デフォルトの名無 - 2009/08/29(土) 22:09:18 (+49,-30,-311)
    Ubuntu 9.04 で g++ 4.3.3 を使っているのですが、メモリ管理で質問があります。
    std::list に例えば int 型のデータを例えば1000万個くらい突っ込み、topでメモリ使用量を確認すると、
    150MBくらい使用しています。

    その後、データが不要になったあとで clear() メソッドで中身を消去し、利用した関数を終了させて
    list を完全に削除した後でも、top で確認するとメモリが開放されずに残ってしまいます。
    このメモリが開放されるのは、アプリケーションが終了されるときのみです。
    この理由を知りたいのですが、ご存知の方は教えていただけないでしょうか?

    試行錯誤してるうちに、std::list 以外でも、例えば
    new int[10000000] した後にデータを突っ込んだメモリは delete[] で消えますが、
    for(int i=0 ; i<10000000 ; i++){
    ... = new double;
    }
    してデータを突っ込んだメモリはすべて delete しても
    やはりメモリが残ってしまうことに気づきました。これも関係ありそうな気がします。
    506 : デフォルトの名無 - 2009/08/29(土) 23:18:24 (+9,-29,-47)
    逆アセンブルのリスト取ってsbrk()の呼び出してる箇所を見てみたら?

    malloc()はsbrk()を大抵呼び出すがfree()は単に未使用ブロックとして
    マークし直すだけの事が多いのでフリーリストのフラグメントが起きると
    うまく再利用されない事がある
    507 : デフォルトの名無 - 2009/08/29(土) 23:22:11 (+11,-29,-115)
    >>505
    あなたにメモリ管理についての知識が無いだけ。
    例えばmallocの実装がどうなっているか、一度調べてみると良い。

    >>504
    実装にバグが無ければ
    メモリが足りない時は、mallocはNULLを返す。
    malloc呼び出しの内部で落ちるのは、
    アプリケーションがmallocの管理領域を壊している可能性が極めて高い。
    例えば、1byteはみだして書き込んでいる場合、
    64bitだとアラインメントの都合ではみだしていることが表面化しない場合がある。
    508 : デフォルトの名無 - 2009/08/29(土) 23:33:39 (+5,-29,-162)
    >>505
    単純にそれだけするテストをやってみたってこと?

    一般に new (malloc) で確保したメモリを delete (free) した場合、
    それらの領域は次に new したときに再利用される。
    一旦確保したメモリはアプリケーション側で掴んでいるので、
    そのアプリケーションが終了するまでは OS 側にしてみれば使用中に視える。

    BSD 系のどれだったかでは一旦 OS に返すような実装のもあったような気がする。
    509 : デフォルトの名無 - 2009/08/30(日) 01:05:22 (+64,+29,-42)
    >>505
    大きなメモリブロックはOSから直接もらってOSへ直接返し、
    小さなメモリブロックは独自に管理するのでOSへ返さず掴んだまま、
    という実装は十分ありうるので、一応説明は付く
    510 : デフォルトの名無 - 2009/08/30(日) 01:27:39 (+3,-30,-199)
    Cygwinって一応内部ではWin32呼んでるんだよね
    こういうの組んでみたけど結構こまめにOSに返してるよ

    #include <iostream>
    #include <windows.h>
    const int l = 10000000;

    int main()
    {
    double** a;
    MEMORYSTATUS ms;

    a = new double*[l];

    for (int i = 0 ; i < l; i++)
    a[i] = new double;

    GlobalMemoryStatus(&ms);
    std::cout << ms.dwAvailPhys << std::endl;

    for (int i = 0 ; i < l; i++)
    delete a[i];

    GlobalMemoryStatus(&ms);
    std::cout << ms.dwAvailPhys << std::endl;

    delete[] a;

    GlobalMemoryStatus(&ms);
    std::cout << ms.dwAvailPhys << std::endl;
    }
    511 : デフォルトの名無 - 2009/08/30(日) 01:59:50 (+4,-29,-85)
    「OSからの取得」をどうやっているのか、にも依存するよ。

    例えばHeapAllocで獲得しているのだとしたら、
    それは事実上mallocの実装そのものだから
    その内部で(システムコールを呼んで)カーネルに返しているかどうかは
    HeapAllocの実装次第。

    >>506の通りにsbrk()経由とするなら、その中で何が呼ばれてるかだね。
    512 : 名無しさん@そう - 2009/08/30(日) 11:45:11 (+57,+29,-40)
    OS によってメモリ管理に関する方針はかなり違うけど、
    Linux の場合は「なるべくめいっぱい活用する」方針だったと思う。
    普通に使ってたら空いてるメモリはほとんどなくなるはず。
    513 : 自己レス - 2009/08/30(日) 21:40:30 (+11,-30,-47)
    >>501-503ありがとう
    どうやってもldが「undefined reference to ○○」言ってくるんですよ

    >>500こうなったらもうインポートライブラリに頼らないで直接呼んじゃる!!!
    という方針で書いてみた(といってもほとんどhttp://www.atmark.gr.jp/~s2000/r/rtl/shlwapi.html )のが↓
    514 : デフォルトの名無 - 2009/08/30(日) 21:41:37 (+3,-30,-23)
    #include <windows.h>
    #include <stdio.h>

    typedef int (*TFUNC)(LPCTSTR,LPTSTR,UINT);

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

    char str[100];
    int ret;

    HINSTANCE hInstDLL;
    TFUNC DllFunction;
    515 : デフォルトの名無 - 2009/08/30(日) 21:42:37 (+3,-30,-154)
    hInstDLL = LoadLibrary( "SHLWAPI.DLL" );
    if( hInstDLL == NULL ){
    printf( "hInstDLL == NULL" );
    return -1;
    }else{}


    DllFunction = (TFUNC)GetProcAddress( hInstDLL,"PathSearchAndQualifyA" );
    printf( "DllFunction : %d\n", (int)DllFunction );

    ret = DllFunction(".",str,100);
    printf( "ret=%d,str=%s\n", ret , str);

    if(!FreeLibrary(hInstDLL)){
    abort();
    }else{}

    return 0;
    }
    516 : デフォルトの名無 - 2009/08/30(日) 21:54:41 (+62,+29,-6)
    517 : デフォルトの名無 - 2009/08/30(日) 22:25:58 (+4,-30,-38)
    >>513
    gcc は実はインポートライブラリ無しでも dll とリンクできる。
    -lshlwapi の変わりに /cygdrive/c/WINDOWS/system32/shlwapi.dll としてみれ。
    518 : デフォルトの名無 - 2009/08/30(日) 22:27:10 (+0,-30,-41)
    gcc version 3.4.5 (mingw-vista special r3) だと>>500の方法で何の問題もないね。
    519 : デフォルトの名無 - 2009/09/01(火) 16:29:51 (+38,-30,-89)
    >>378, 379

    TDM版MinGW使ってみた。なかなか良くてCode::Blocksとの相性もバッチリなんだが,
    STLがやたら遅い(gccの問題だと思う)ので,STLPort5.2.1をビルドしようとしたら,
    うまく行かない。

    一応ドキュメントも読んだんだが,MSYS上からmake gcc.makってやっても「何もすることが
    ない」って言われてビルドできない。

    TDM版MinGWにはmake.exeはなくてmingw32-make.exeしかないけど,これは使っちゃいけないと
    書いてあるので,MSYSにあるmake.exeでやってみたんだが...

    やり方教えてもらえると嬉しい。

    520 : デフォルトの名無 - 2009/09/01(火) 19:21:10 (+5,-29,-1)
    >>519
    make -f gcc.mak じゃね?
    521 : 519 - 2009/09/01(火) 20:32:50 (+4,-30,-255)
    >>520

    > make -f gcc.mak じゃね?

    そうそう、まずそれだった。普段IDEばかり使ってるんでmakeコマンドの使い方忘れてた。
    で、まずは落ち着いてやってみようと思って、MinGWを通常の5.1.4に戻して、
    >>331を参考にSTLport5.1.7をビルドしてみた。

    gcc.makというファイルは二箇所にあるけど、\build\libの下のヤツを使って、

    make -f gcc.mak depend
    make -f gcc.mak install

    でビルド成功。ちなみに>>331の、

    > # if (__W32API_MAJOR_VERSION > 3) || ((__W32API_MAJOR_VERSION = 3) && (__W32API_MINOR_VERSION >= 12))

    の = 3 のところは、== 3 が正解。で、ビルドは出来たんだけど、C++版Hello World!プログラム(iostream使うやつ)
    で試してみたら、コンパイル時に「#includeのネストが深すぎる」ってエラーがでた。
    今仕事場にいないので詳細はわからない。続きはまたあしたかな...
    522 : 519 - 2009/09/02(水) 18:28:05 (+6,-30,-253)
    MinGW5.1.4+STLPort5.1.7でテストをしてて,STLPortのビルドは出来たけど(Thanks to >>331),
    使うとうまく行かない。 以下のHello world!! C++版をコンパイルしてみた。

    #include <iostream>

    using namespace std;

    int main()
    {
      cout << "Hello world!" << endl;
      return 0;
    }

    環境変数は入念にチェックして,MinGW標準のC++用ヘッダがインクルードされずに,stlportのヘッダが
    読み込まれるようにしたんだが,コンパイルすると_cstddef.hの28行目の

    # include _STLP_NATIVE_CPP_C_HEADER(cstddef)

    のところで,

    C:\MinGW\include\stlport\stl\_cstddef.h|28|../3.4.5/cstddef: No such file or directory

    と言うエラーが出て,後はエラーの嵐。grepでいろいろ調べた結果,MinGWの場合
    _STLP_NATIVE_CPP_C_HEADERの定義がうまく出来てないらしいことまではわかったんだが,
    どうすればいいんだろ。教えてエライ人。
    523 : 519 - 2009/09/03(木) 18:00:08 (+3,-30,+0)
    何とか自己解決。

    ■ビルドはMSYS付属のmakeじゃなくて,WindowsのコマンドプロンプトからMinGWの
     mingw32-makeでやる(ドキュメントをよく読んでたら書いてあった)。但し,MSYS使わ
     ない場合はconfigure.bat -c gcc しろって書いてあるけど,これはウソ。
     configureしてからメイクすると速攻エラーが出る。

     mingw32-make -f gcc.mak depend
     mingw32-make -f gcc.mak install

     だけでOK。

    ■unitテストはロケール関係で少しエラーが出た。ehテストはso_stlgだけ,

    EH TEST FAILURE !
    [deque] :testing range insertion at random position (weak)
    ERROR : 37 outstanding allocations.

    となったが,so_gとsoはパス。ちなみにこのso_stlg, so_g, soというフォルダに3つ
    同名のテストプログラムが出来るけど,違いは何なの?(unitテストsoとso_stlgの
    2つのフォルダ内にexeができる)。

    ■STLPortのヘッダやライブラリを置いた場所や元のMinGWのフォルダ構成にあわせて,
     stlport/stl/config/host.h を丁寧に書き換えてやる必要がある。

    まぁ,いろんな環境に対応しなければならないので作る側の苦労はこんなもんじゃないと
    思うが,ドキュメントはもう少し整備してまとめて欲しいなぁ...
    524 : デフォルトの名無 - 2009/09/08(火) 09:41:40 (+55,-29,-4)
    TDM-MinGW4.4.1出てるな
    525 : デフォルトの名無 - 2009/09/08(火) 12:01:32 (+21,-30,-98)
    >>524

    ・・・あの、4.4.0がインストールしてある場合、
    アップデートするには

    Create
    : Create a new TDM/MinGW installation
    Manage
    : Manage an existing TDM/MinGW installation
    Remove
    : Remove a TDM/MinGW installation

    のうちどれを選べば最も望ましいでしょうか?
    526 : デフォルトの名無 - 2009/09/08(火) 12:21:43 (+0,-29,-28)
    >>525
    知らんけどRemoveしてからインスコすればいいんじゃね?
    527 : デフォルトの名無 - 2009/09/08(火) 12:23:18 (+0,-29,-60)
    >>525
    俺はそういうメニューが出るとは知らなかったので
    プログラムの追加と削除から消してCreateした
    でもRemoveしてCreateしてもいいかもな
    528 : デフォルトの名無 - 2009/09/08(火) 12:59:56 (+52,+30,+0)
    529 : デフォルトの名無 - 2009/09/08(火) 13:01:55 (+105,+1,-22)
    >>524
    これ使うと,サイトの上の方にピンクの囲みで書いてあるとおり,実行のものすごく遅い
    プログラムが出来上がってしまう。

    それでcoreとg++はサイトの下の方にある4.3.3を使ったら解決したよ。
    530 : デフォルトの名無 - 2009/09/08(火) 14:29:16 (-1,-29,-31)
    Cygwin1.7でmpich2がmakeできんな。
    clockとかシステムコールがないとか・・・
    素直にWIndowsバイナリ入れるかな・・・
    531 : デフォルトの名無 - 2009/09/08(火) 14:57:20 (+47,-30,-143)
    WARNING:
    The 4.4.1-tdm-1 release is known to have a bug which causes drastically increased CPU usage in programs compiled with it. You are urged to use a previous release until this bug is fixed.

    excite&俺訳↓
    警告:
    4.4.1-tdm-1リリースにはそれでコンパイルされたプログラムがCPUパワーをものすごく使うようになってしまうバグがあるのが知られています。このバグが修正されるまであなたが前のリリースを使用することを推奨します。

    マジかよ!おじさん、気付かず更新しちまったぜ
    532 : 525 - 2009/09/08(火) 15:03:06 (+89,+26,-70)
    みなさんありがとうございます。
    どうやら
    CreateとManageの違いは、
    Manageの場合はインストール先のパスなどが引き継がれて便利ということ
    だけっぽいです(完全に私の勘ですが)。


    ・・・ですが、インストールしてみたところに>>529さん、>>531さんのレスをみて
    即刻以前のインストーラを使って元に戻しました。

    533 : デフォルトの名無 - 2009/09/08(火) 15:08:15 (+9,-29,-27)
    >>531のレスを見て疑問なのですが、
    これはgcc4.4.1のバグでしょうか?
    それとも 4.4.1-tdm-1 release独自のバグなのでしょうか?

    ご教示いただけませんでしょうか?
    よろしくお願い申し上げます。
    534 : デフォルトの名無 - 2009/09/08(火) 15:42:48 (+30,-29,-3)
    > gcc4.4.1

    Fortran, C, and C++ for Windows
    http://www.equation.com/servlet/equation.cmd?call=fortran
     ↑
    こっちのは別に問題なさそうだけど。
    535 : デフォルトの名無 - 2009/09/08(火) 15:44:01 (+58,+26,-1)
    >>534
    となるとTDMのバグの可能性が高そうですね。
    ありがとうございます。
    536 : デフォルトの名無 - 2009/09/08(火) 21:53:01 (+64,+29,-9)
    どうせいずれ直るでしょ
    俺は速度はそんなに気にしていない(コンパイルが通って動けばいい)派
    なので気にしていない
    537 : デフォルトの名無 - 2009/09/08(火) 21:56:49 (+57,+29,-13)
    TDMが止めた方がいいっていってるんだから
    俺は止めとこう。

    ・・・ってまあホント好き好きにすりゃ良い問題だよな。
    538 : 529 - 2009/09/08(火) 22:27:35 (+64,-30,-99)
    >>536

    > 俺は速度はそんなに気にしていない(コンパイルが通って動けばいい)派
    > なので気にしていない

    それがさぁ、条件によっては実用にならない位遅くなるんだよ。
    100行位のUNIDCODEのファイルを読み込ませて処理するソフトでテストしたら(STL使用)、
    VC++やBCBでコンパイルしたものは数秒で終わるのに、TDM-MinGW4.4.1だと
    10分位かかった。

    で、>>529に書いたように、coreとg++だけ4.3.3をダウンロードして上書き解凍してコンパイルし
    なおしたら、ちゃんと数秒で終わるようになった。
    539 : デフォルトの名無 - 2009/09/08(火) 22:35:55 (+0,-29,-21)
    >>538
    そんなにひどいのか
    じゃあ4.3.3に戻すか
    簡単に戻せるしね
    SourceForgeからDLできるのであっという間だし
    540 : デフォルトの名無 - 2009/09/08(火) 22:53:26 (-6,-29,-7)
    mingwはTDMが標準なのかな?
    541 : 532 - 2009/09/08(火) 22:56:32 (+34,-29,-19)
    >>538

    g++ (TDM-1 mingw32) 4.4.0に戻したのですが、
    これもバグを抱えていますか?
    4.3.3レベルまで戻す必要はありますでしょうか?
    542 : 529 - 2009/09/08(火) 23:00:39 (+65,+28,-20)
    >>541

    ごめん、4.4.0は持ってないし試してないのでわからない。
    けど、サイトにそうは書いてないから大丈夫なんじゃないのかな?
    543 : 532 - 2009/09/08(火) 23:44:02 (+7,-29,-9)
    >>542
    ありがとうございます。
    過去のサイト(Web魚拓みたいなもの)をあさって見たのですが
    4.4.0リリース時点までは戻れなくて。。。
    544 : デフォルトの名無 - 2009/09/09(水) 22:25:47 (-1,-29,-29)
    TDMってbashが入ってないけどconfigureはどうればいいの?
    545 : デフォルトの名無 - 2009/09/09(水) 23:37:14 (+21,-29,-34)
    TDMに限らずMinGWにはbashは入っていない
    msysを落とせ
    546 : デフォルトの名無 - 2009/09/10(木) 00:30:20 (+38,+13,+1)
    >>545
    トンクス
    547 : デフォルトの名無 - 2009/09/10(木) 22:45:45 (-1,-29,-9)
    いま64bit windows環境がなくて試せてないんだけど、mingw-w64ってどう?
    548 : デフォルトの名無 - 2009/09/10(木) 23:35:40 (+42,-29,-48)
    >>507
    メモリ不足でNULLが返るかというと微妙。
    mallocは成功して、実際にメモリを使う時(読み書き)すると初めてメモリを割り当てて不足したらそこで止まるようなシステムもある。
    Linuxなんかはそう。
    549 : デフォルトの名無 - 2009/09/10(木) 23:47:17 (+57,+29,-5)
    そんなのあるのか…manpageでバグ扱いされてるな
    550 : デフォルトの名無 - 2009/09/11(金) 00:52:47 (+102,+29,-57)
    >>548
    ここはCygwinのスレであって、Linuxのスレではないし
    落ちるのがmalloc内部と限定される場合には当てはまらない。

    だいたい、「落ちる」と言っても
    セグフォールトのような症状で落ちるのではなく
    「有無を言わさずプロセスがkillされる」だけなのだから。
    ←前へ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 次へ→ / 要望・削除依頼は掲示板へ / 管理情報はtwitterで / gcc スレッド一覧へ
    スレッド評価: スレッド評価について
    みんなの評価 :
    タグ : - 476 + - cannot + - curses + - pthread + - wcout + - wcwidth + - yum + - リダイレクト + 追加: タグについて ※前スレ・次スレは、スレ番号だけ登録。駄スレにはタグつけず、スレ評価を。荒らしタグにはタグで対抗せず、タグ減点を。

    類似してるかもしれないスレッド


    トップメニューへ / →のくす牧場書庫について