私的良スレ書庫
不明な単語は2ch用語を / 要望・削除依頼は掲示板へ。不適切な画像報告もこちらへどうぞ。 / 管理情報はtwitterでログインするとレス評価できます。 登録ユーザには一部の画像が表示されますので、問題のある画像や記述を含むレスに「禁」ボタンを押してください。
元スレCygwin + MinGW + GCC 相談室 Part 4
gcc スレッド一覧へ / gcc とは? / 携帯版 / dat(gz)で取得 / トップメニューみんなの評価 : ☆
レスフィルター : (試験中)
gccだとVC/C++用のライブラリは使えなかったりするから、
shlwapiのライブラリをgccでコンパイルする必要があるのかもね。
shlwapiのライブラリをgccでコンパイルする必要があるのかもね。
もしかして、Cygwinのgccで確保出来るメモリ量って結構少ないですか?
膨大なソースで多分1日仕事になるであろうソースがあるんですが、
_cygtls::handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
ってエラーが出てて、どうもmallocかけてる所が怪しいんです。
ちなみに、SolarisとFreeBSD(両方64bit版)では動いてます。
Windowsは、XP x64だけど、多分Cygwinは32bitのはず。
でも、32bitの領域食いつぶしてるとも思えないしなぁ・・・
膨大なソースで多分1日仕事になるであろうソースがあるんですが、
_cygtls::handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
ってエラーが出てて、どうもmallocかけてる所が怪しいんです。
ちなみに、SolarisとFreeBSD(両方64bit版)では動いてます。
Windowsは、XP x64だけど、多分Cygwinは32bitのはず。
でも、32bitの領域食いつぶしてるとも思えないしなぁ・・・
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 しても
やはりメモリが残ってしまうことに気づきました。これも関係ありそうな気がします。
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 しても
やはりメモリが残ってしまうことに気づきました。これも関係ありそうな気がします。
逆アセンブルのリスト取ってsbrk()の呼び出してる箇所を見てみたら?
malloc()はsbrk()を大抵呼び出すがfree()は単に未使用ブロックとして
マークし直すだけの事が多いのでフリーリストのフラグメントが起きると
うまく再利用されない事がある
malloc()はsbrk()を大抵呼び出すがfree()は単に未使用ブロックとして
マークし直すだけの事が多いのでフリーリストのフラグメントが起きると
うまく再利用されない事がある
>>505
単純にそれだけするテストをやってみたってこと?
一般に new (malloc) で確保したメモリを delete (free) した場合、
それらの領域は次に new したときに再利用される。
一旦確保したメモリはアプリケーション側で掴んでいるので、
そのアプリケーションが終了するまでは OS 側にしてみれば使用中に視える。
BSD 系のどれだったかでは一旦 OS に返すような実装のもあったような気がする。
単純にそれだけするテストをやってみたってこと?
一般に new (malloc) で確保したメモリを delete (free) した場合、
それらの領域は次に new したときに再利用される。
一旦確保したメモリはアプリケーション側で掴んでいるので、
そのアプリケーションが終了するまでは OS 側にしてみれば使用中に視える。
BSD 系のどれだったかでは一旦 OS に返すような実装のもあったような気がする。
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;
}
こういうの組んでみたけど結構こまめに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;
}
「OSからの取得」をどうやっているのか、にも依存するよ。
例えばHeapAllocで獲得しているのだとしたら、
それは事実上mallocの実装そのものだから
その内部で(システムコールを呼んで)カーネルに返しているかどうかは
HeapAllocの実装次第。
>>506の通りにsbrk()経由とするなら、その中で何が呼ばれてるかだね。
例えばHeapAllocで獲得しているのだとしたら、
それは事実上mallocの実装そのものだから
その内部で(システムコールを呼んで)カーネルに返しているかどうかは
HeapAllocの実装次第。
>>506の通りにsbrk()経由とするなら、その中で何が呼ばれてるかだね。
OS によってメモリ管理に関する方針はかなり違うけど、
Linux の場合は「なるべくめいっぱい活用する」方針だったと思う。
普通に使ってたら空いてるメモリはほとんどなくなるはず。
Linux の場合は「なるべくめいっぱい活用する」方針だったと思う。
普通に使ってたら空いてるメモリはほとんどなくなるはず。
#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;
#include <stdio.h>
typedef int (*TFUNC)(LPCTSTR,LPTSTR,UINT);
int main(int argc, char *argv[]) {
char str[100];
int ret;
HINSTANCE hInstDLL;
TFUNC DllFunction;
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;
}
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;
}
>>513
gcc は実はインポートライブラリ無しでも dll とリンクできる。
-lshlwapi の変わりに /cygdrive/c/WINDOWS/system32/shlwapi.dll としてみれ。
gcc は実はインポートライブラリ無しでも dll とリンクできる。
-lshlwapi の変わりに /cygdrive/c/WINDOWS/system32/shlwapi.dll としてみれ。
gcc version 3.4.5 (mingw-vista special r3) だと>>500の方法で何の問題もないね。
>>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でやってみたんだが...
やり方教えてもらえると嬉しい。
TDM版MinGW使ってみた。なかなか良くてCode::Blocksとの相性もバッチリなんだが,
STLがやたら遅い(gccの問題だと思う)ので,STLPort5.2.1をビルドしようとしたら,
うまく行かない。
一応ドキュメントも読んだんだが,MSYS上からmake gcc.makってやっても「何もすることが
ない」って言われてビルドできない。
TDM版MinGWにはmake.exeはなくてmingw32-make.exeしかないけど,これは使っちゃいけないと
書いてあるので,MSYSにあるmake.exeでやってみたんだが...
やり方教えてもらえると嬉しい。
>>519
make -f gcc.mak じゃね?
make -f gcc.mak じゃね?
>>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のネストが深すぎる」ってエラーがでた。
今仕事場にいないので詳細はわからない。続きはまたあしたかな...
> 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のネストが深すぎる」ってエラーがでた。
今仕事場にいないので詳細はわからない。続きはまたあしたかな...
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の定義がうまく出来てないらしいことまではわかったんだが,
どうすればいいんだろ。教えてエライ人。
使うとうまく行かない。 以下の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の定義がうまく出来てないらしいことまではわかったんだが,
どうすればいいんだろ。教えてエライ人。
何とか自己解決。
■ビルドは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 を丁寧に書き換えてやる必要がある。
まぁ,いろんな環境に対応しなければならないので作る側の苦労はこんなもんじゃないと
思うが,ドキュメントはもう少し整備してまとめて欲しいなぁ...
■ビルドは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
・・・あの、4.4.0がインストールしてある場合、
アップデートするには
Create
: Create a new TDM/MinGW installation
Manage
: Manage an existing TDM/MinGW installation
Remove
: Remove a TDM/MinGW installation
のうちどれを選べば最も望ましいでしょうか?
・・・あの、4.4.0がインストールしてある場合、
アップデートするには
Create
: Create a new TDM/MinGW installation
Manage
: Manage an existing TDM/MinGW installation
Remove
: Remove a TDM/MinGW installation
のうちどれを選べば最も望ましいでしょうか?
>>525
知らんけどRemoveしてからインスコすればいいんじゃね?
知らんけどRemoveしてからインスコすればいいんじゃね?
>>524
これ使うと,サイトの上の方にピンクの囲みで書いてあるとおり,実行のものすごく遅い
プログラムが出来上がってしまう。
それでcoreとg++はサイトの下の方にある4.3.3を使ったら解決したよ。
これ使うと,サイトの上の方にピンクの囲みで書いてあるとおり,実行のものすごく遅い
プログラムが出来上がってしまう。
それでcoreとg++はサイトの下の方にある4.3.3を使ったら解決したよ。
Cygwin1.7でmpich2がmakeできんな。
clockとかシステムコールがないとか・・・
素直にWIndowsバイナリ入れるかな・・・
clockとかシステムコールがないとか・・・
素直にWIndowsバイナリ入れるかな・・・
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パワーをものすごく使うようになってしまうバグがあるのが知られています。このバグが修正されるまであなたが前のリリースを使用することを推奨します。
マジかよ!おじさん、気付かず更新しちまったぜ
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パワーをものすごく使うようになってしまうバグがあるのが知られています。このバグが修正されるまであなたが前のリリースを使用することを推奨します。
マジかよ!おじさん、気付かず更新しちまったぜ
>>531のレスを見て疑問なのですが、
これはgcc4.4.1のバグでしょうか?
それとも 4.4.1-tdm-1 release独自のバグなのでしょうか?
ご教示いただけませんでしょうか?
よろしくお願い申し上げます。
これはgcc4.4.1のバグでしょうか?
それとも 4.4.1-tdm-1 release独自のバグなのでしょうか?
ご教示いただけませんでしょうか?
よろしくお願い申し上げます。
> gcc4.4.1
Fortran, C, and C++ for Windows
http://www.equation.com/servlet/equation.cmd?call=fortran
↑
こっちのは別に問題なさそうだけど。
Fortran, C, and C++ for Windows
http://www.equation.com/servlet/equation.cmd?call=fortran
↑
こっちのは別に問題なさそうだけど。
どうせいずれ直るでしょ
俺は速度はそんなに気にしていない(コンパイルが通って動けばいい)派
なので気にしていない
俺は速度はそんなに気にしていない(コンパイルが通って動けばいい)派
なので気にしていない
TDMが止めた方がいいっていってるんだから
俺は止めとこう。
・・・ってまあホント好き好きにすりゃ良い問題だよな。
俺は止めとこう。
・・・ってまあホント好き好きにすりゃ良い問題だよな。
>>545
トンクス
トンクス
>>507
メモリ不足でNULLが返るかというと微妙。
mallocは成功して、実際にメモリを使う時(読み書き)すると初めてメモリを割り当てて不足したらそこで止まるようなシステムもある。
Linuxなんかはそう。
メモリ不足でNULLが返るかというと微妙。
mallocは成功して、実際にメモリを使う時(読み書き)すると初めてメモリを割り当てて不足したらそこで止まるようなシステムもある。
Linuxなんかはそう。
>>548
ここはCygwinのスレであって、Linuxのスレではないし
落ちるのがmalloc内部と限定される場合には当てはまらない。
だいたい、「落ちる」と言っても
セグフォールトのような症状で落ちるのではなく
「有無を言わさずプロセスがkillされる」だけなのだから。
ここは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 スレッド一覧へ
みんなの評価 : ☆類似してるかもしれないスレッド
- Cygwin + MinGW + GCC 相談室 Part 8 (938) - [97%] - 2022/10/28 8:00
- Cygwin + MinGW + GCC 相談室 Part 7 (996) - [97%] - 2014/9/21 2:15
- Cygwin + MinGW + GCC 相談室 Part 6 (981) - [97%] - 2012/12/30 23:15
- Cygwin + MinGW + GCC 相談室 Part 5 (981) - [97%] - 2011/4/6 2:32
- Cygwin + MinGW + GCC 相談室 Part 3 (1001) - [97%] - 2008/9/12 0:04 ★
- 【激遅】AppleGCC【絶望】 (111) - [1%] - 2010/1/15 10:31
トップメニューへ / →のくす牧場書庫について