[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 2chのread.cgiへ]
Update time : 06/21 15:50 / Filesize : 177 KB / Number-of Response : 685
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.59【環境依存OK】



1 名前:デフォルトの名無しさん [2008/09/06(土) 22:45:12 ]
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.58【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1218023777/

【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

◆ソースのインデントについて
半角やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのが最も良いですが、
直接貼るのであれば、全角空白か に置換しておくことをお勧めします。

2 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 22:47:35 ]


3 名前:デフォルトの名無しさん [2008/09/06(土) 22:57:39 ]
お勧めのC/C++開発環境ってありますか

VC++ Express 2008は、C言語サポートがしょぼくて・・・。
リファクタリングとか、関数のテンプレートとか作れたり出来るとうれしいんですが


4 名前:デフォルトの名無しさん [2008/09/06(土) 22:59:04 ]
???

5 名前:デフォルトの名無しさん [2008/09/06(土) 23:01:39 ]
メモリリークのチェックのために

#define new ::new(_T(__FILE__), __LINE__)
ってやってるんだが、

placement newを使いたいときはどうしたらいい?

6 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:03:35 ]
コメントをつけるとき↓どれがいいですか?

// ウィンドウクラスを登録
// ウィンドウクラスを登録する
// ウィンドウクラスを登録する。

// ウィンドウ・クラスを登録
// ウィンドウ・クラスを登録する
// ウィンドウ・クラスを登録する。

// ウィンドウのクラスを登録
// ウィンドウのクラスを登録する
// ウィンドウのクラスを登録する。

7 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:06:36 ]
// ウィンドウクラスの登録

8 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:07:44 ]
Regist window class.

9 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:08:13 ]
>>6

/* ウィンドウクラスを登録
BOOL RegisterWindowClass()
{
   〜〜〜
}
*/

10 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:09:40 ]
>Regist window class.
生半可な知識もここまで来ると笑えるな。



11 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:10:39 ]
みじかいのがいい

12 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:13:26 ]
>>6
関数名で処理が自明なものにコメントは不要だよ。What じゃなくて、
Why を書くようにしたほうがいいね。

13 名前:5 mailto:sage [2008/09/06(土) 23:18:18 ]
事故解決?した。

ml.tietew.jp/cppll/cppll/thread_articles/9887#ar9888
これでやってみる

14 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:18:45 ]
// 窓級登録

15 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:24:03 ]
コメントとかいらねーだろ

16 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:26:23 ]
関数のコメントってみんなどんなのつけてるんだろう・・・

17 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:27:26 ]
フリーのリソースエディタでお勧めのものはありますか。

18 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:29:26 ]
/// <summary>
/// ほげほげな関数
/// </summary>


19 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:34:35 ]
>>18
C++だとあんまり役に立たないだろ。

20 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:35:37 ]
Doxygenとかに食わせたりしないの?



21 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:41:31 ]
>>8
Regist という英単語はない

22 名前:5 mailto:sage [2008/09/06(土) 23:44:19 ]
>>13だと

new A()->f();
ってやったときにまずいことになることが発覚

だれかいい方法おせえて

23 名前:デフォルトの名無しさん mailto:sage [2008/09/06(土) 23:46:29 ]
>>5,22
そんなマクロは捨てて auto_ptr なり scoped_ptr, shared_ptr なりのスマートポインタを使う。

24 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:02:15 ]
どうでも良い様な話なんですが、
RECT* SetRect(RECT* pDst, int x, int y, int width, int height) {
pDst->left = x;

}

みたいなアサイン補助関数があるじゃないですか。
こういう関数は戻り値でデスティネーションを返して、
if(xend > SetRect(〜)->right) みたいな使い方ができるように
なってますが、この戻り値って*で返すのと&で返すのと
どちらにするべきなんでしょうね?
どちらかに統一した方が見た目がすっきりしそうなのですが。

25 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 00:04:33 ]
*で受け取るなら*で返す
&で受け取るなら&で返す
のがわかりやすいのではないか

26 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 04:52:27 ]

SHA-1 のコリジョンの起こるサンプルデータを探しています.
ググってみると MD5 の方はすぐに見つかったのですが,SHA-1 の方は衝突記事はたくさん引っ掛るのですが,
肝心のデータが見つかりません.どこにあるか知っていたら教えていただけないでしょうか?


27 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 10:54:48 ]
何故このスレで?

28 名前:26 mailto:sage [2008/09/07(日) 12:08:32 ]

 ごめん,ぶっちゃけ どのスレで聞いたら良いか分からなかったんだ.
 あと RFC についてた MD5 と SHA-1 アルゴリズムのサンプルが C で書かれていたから,
このスレが比較的適当かと思ったんだ….

 あの後調べてたんだけど SHA-1 で見つかったコリジョンは計算回数を減らした奴で,完全版のほうは
コリジョンハッシュを生成する比較的現実的な計算量のアルゴリズムが見つかっただけなのかな?
 それともアルゴリズムが改良されてもう見つかっている?ここらへんがよくわからんとです….


29 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:11:21 ]
CRCで十分

30 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:15:37 ]
CPUのbit数以下であれば、計算コストは同じですか?
(32bitCPUで、intの和算、charの和算等)
もしそうであれば、前スレで64bitOSでも
doubleは64bit、floatは32bitってあるけど、
これも同じことがいえますか?


また、別件で、64bitOSでもintは32bitだったり64bitだったりとありますが、
intが32bitだとfloatと、64bitだとdoubleと共有したい場合、
何か方法ありませんか?



31 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:22:28 ]
計算時間は実測する

32 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:26:50 ]
>>30
int 以下の大きさの整数の演算は int に変換してから行う、と規格で決められている。
だから計算コストは同じ。読み取りと書き込みのコストは違うかもしれないけどね。

double, float についてはこういう規則は決められてないんで、同じことは言えない。
特定の環境に限って実験結果があれば別だけど。

別件については「共有」の意味がわからんので、なんとも。

33 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:27:18 ]
>>30
後者は共用体で。

34 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:36:36 ]
>>32
サンクス

共有は共有体(union)のことです
intのビットサイズがOSによって変わるなら
intが32bitの場合はfloatと、
intが64bitの場合はdoubleと共有体を組むべきだと思ったんですが
そのセオリーな方法はないのかと思いまして

35 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:40:50 ]
>>34
<stdint.h>あるいは<boost/cstdint.hpp>のint32_t/int64_t

36 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:43:14 ]
>>34
×共有体
○共用体

37 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:49:33 ]
>>34
typedef 一段かませばいいんじゃない?
どうやって int のビット数を判別するかは、環境依存のマクロがあればそれでもいいし、
C++ でテンプレートメタプログラミングしてもいい。

38 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:50:33 ]
>>35
32bitOSでも64bitに固定しろってことなんですかね?
せめてコンパイル環境によって
判定してくれるようなマクロを期待していたんですが

>>36
そうでした、お恥ずかしい

39 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 12:58:27 ]
判定したいならこれでどう

#include <limits.h>
#if INT_MAX == 2147483647

40 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 13:09:20 ]
template<std::size_t n> struct FP{ };
template<> struct FP<sizeof(float)>{ typedef float type; };
template<> struct FP<sizeof(double)>{ typedef double type; };
typedef FP<sizeof(int)>::type FPint;



41 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 13:21:49 ]
>>39
にゃるほど

>>37,40
テンプレートはクラスにしか使ったことなかったんですが
本来そういう使用方法だったんですね
メタプログラミングについて勉強してきます


ありがとうございました

42 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 13:50:40 ]
>>41
いや、メタプログラミングは本来の使い方じゃないからね。
ライブラリ実装内で使うならともかく、他人に使わせるようなところで使うのは控えたほうがいいよ。

43 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 14:55:03 ]
それでもマクロのifとか使うよりはTMPの方が余程健全に思えるわ

44 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:04:32 ]
C++の事で質問です
::func()という表記はグローバルスコープで宣言されたfuncを明示的に呼び出す場合に使用するものだったと思いますが
::new Hogeという風にnew演算子に対して::を付けている場合はどういう動きになるのでしょうか?

45 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:20:36 ]
グローバルなnew演算子を呼び出す。

46 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 15:20:48 ]
>28
■暗号技術【ROUNDsurea】■
ttp://pc11.2ch.net/test/read.cgi/tech/1180280982/

47 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 19:19:25 ]
>17
フリーのリソースエディタ
ResEdit
www.forest.impress.co.jp/lib/stdy/program/progsupt/resedit.html

48 名前:デフォルトの名無しさん mailto:sage [2008/09/07(日) 22:03:00 ]
皆さんの現場では、ウォーターフォール形式で開発しているところが多いのですか?
これ以外のプロトタイプ形式とか経験ないのですが、なんか能率悪いと思う

49 名前:デフォルトの名無しさん [2008/09/07(日) 22:22:00 ]
マ板に池

50 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 17:41:04 ]
アドバイス頂きたいのですが、プログラム終了時まで値を保存する、なんかのデータ型のオブジェクトの配列を確保したいと思ったのですが、プログラム実行時まで配列の要素数が分からない性質のプログラムだとします。

その場合、C++だと char* ch[] とか int* dt[] だけでは
storage size of `ch' isn't known (MinGW)のようにエラーになってしまうので、事前に配列を宣言しておくことができません。
なので、今回のように必要な数がプログラム実行時まで不明な同型のオブジェクトを動的に確保して、それらを一まとめにしておくには、配列ではなく次の要素へのポインタを格納したオブジェクトのリストを使うしかないでしょうか?



51 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 17:48:12 ]
>>50
mallocで必要なサイズの領域を確保すればいいんでない

52 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 17:50:46 ]
std::vector

53 名前:デフォルトの名無しさん [2008/09/08(月) 18:00:42 ]
malloc (new) 以外に何か必要なの?

54 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 18:05:10 ]
>>53
いいえ、std::vectorを使いましょう。

55 名前:50 mailto:sage [2008/09/08(月) 18:06:43 ]
ありがごうございます。

>>51
プログラム開始から終了の間に、順々に必要な要素数が増えていく感じなので、最初に一気にmalloc とか new int [10] とかではダメだったのです。

>>52
そーか、要素がpriority_queueのポインタでして、ポインタってvectorに格納できないと勝手に思いこんでたんですが、調べてたらポインタでも大丈夫なんですね。
vecotrでなんとかなりそうです。ありがとうございましたm(_ _)m

56 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 19:01:16 ]
まったくの初心者ですが


#include <stdio.h>

int main(){

int a,b,c;

printf("足し算をします。計算する数字を2つ入力し下さい。\nなお数字の区切りには,を入力してください。\n");
scanf("&d , &d",&a,&b);
c=a+b;
printf("%d+%dは%dです。\n",a,b,c);

return 0;
}

何がいけないんですか?

57 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 19:13:59 ]
>>56
&d → %d

58 名前:56 mailto:sage [2008/09/08(月) 19:17:55 ]
>>57
ありがとうございます。

59 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 20:07:57 ]
次からは、「どんな結果になった(どんなエラーが出た)のか」
「それは自分の望みとどう違うのか」くらいは書いてくれよ。
>>56のケースは、たまたまコトの次第がすぐ特定できる内容だからスムーズに行ったけども。

60 名前:デフォルトの名無しさん mailto:sage [2008/09/08(月) 20:21:54 ]
>>59
すみません、今後気を付けます。



61 名前:デフォルトの名無しさん [2008/09/09(火) 19:31:39 ]
hStdOutputの出力を、char型配列にするにはどうしたらいいですか?

62 名前:デフォルトの名無しさん [2008/09/09(火) 19:45:58 ]
すなわちメモリのハンドルが取得したいんです

63 名前:デフォルトの名無しさん mailto:sage [2008/09/09(火) 19:53:38 ]
そういうことは出来ません。

64 名前:デフォルトの名無しさん [2008/09/09(火) 19:53:38 ]
GlobalAllocでできることがわかりました。
ところでVirtualAllocなど種類がありますがどんな違いがありますか?

65 名前:デフォルトの名無しさん mailto:sage [2008/09/09(火) 20:01:07 ]
マニュアルやAPIをちゃんと読みましょう。

66 名前:デフォルトの名無しさん [2008/09/09(火) 20:09:20 ]
みつけたよ

konuma.txt-nifty.com/blog/2006/03/heapallocvirtua_5d49.html
・ HeapAlloc
異なるメモリブロックを多数作成するときに利用します。パフォーマンスを最大にしたい場合、
同じブロック長のみで構成したヒープハンドルを複数作成する必要があります。

・ VirtualAlloc
多量のデータを格納する空間を用意する必要があるが、一部は利用しないかもしれない場合に
重宝します(ハッシュテーブル等)。部分的に領域の確保を遅らせることが出来ます。
多量のメモリを確保する場合は基本的にこの関数に頼るべきです。

・ LocalAlloc/GlobalAlloc
どちらもWin16時代の名残です。Win32APIが要求しない限り、新規にこれを採用する理由はありません。

・ malloc (new)
データ長にあわせて、プロセスに既にあるヒープを使ったり、新たにヒープを作成したりします。
またマルチスレッドに対する耐性があるバージョンも存在し、賢いですが、その分最も遅いです。一般的には最後にHeapAllocを呼び出す結果になります。




67 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 08:46:26 ]
個人のブログをソースにするのはどうかと、MSDN読めよ。

68 名前:デフォルトの名無しさん [2008/09/10(水) 12:38:43 ]
出力が変になります。 「あ」の前にゴミがつきます。どこがだめかわかりますか

char *sh=new char[1024];
lstrcat(sh, "あいうえおかき");
printf("%s\n", sh);
delete sh;

69 名前:デフォルトの名無しさん [2008/09/10(水) 12:47:08 ]
自己解決しました 

char *p=new char[1024];
strcpy(p,"あいうえ");
printf("%s\n", p);
delete p;

70 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 12:48:06 ]
>>68
lstrcatは文字列を末尾に結合する関数。
newで確保した領域の中身は不定。
だからlstrcatはsh内の最初の'\0'を探してその位置に"あいうえおかき"を挿入する。
予めsh[0]に'\0'を入れておけば意図どおりの動作はする。



71 名前:デフォルトの名無しさん [2008/09/10(水) 12:50:53 ]
>>70
サンクス

72 名前:デフォルトの名無しさん [2008/09/10(水) 13:50:46 ]
メモリ確保の方法別に速度を測ったのですが、違いがでません。どうしたら差のでる比較になりますか?
#include <windows.h>
#include <iostream>
using namespace std;
#define memsize 32400000
#define T GetTickCount()
int main(){ int s[4][3]; memset(s, 0, 48); for(int n=0;n<10;n++){
int cl=GetTickCount(); HANDLE hHeap = HeapCreate(NULL, 0, 0);
char *p0 = (char*) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, memsize);
cl=T-cl;s[0][0]+=cl; cl=T; memset(p0, 97, memsize);
cl=T-cl; s[0][1]+=cl; cl=T; HeapFree(hHeap, NULL, p0); HeapDestroy(hHeap);
cl=T-cl; s[0][2]+=cl;

cl=T; HANDLE hShare = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,0, memsize, "MEMTEST");
char *p1 = (char*)MapViewOfFile(hShare, FILE_MAP_ALL_ACCESS, 0, 0, memsize);
cl=T-cl; s[1][0]+=cl; cl=T; memset(p1, 97, memsize);
cl=T-cl; s[1][1]+=cl; cl=T; UnmapViewOfFile(p1); CloseHandle(hShare);
cl=T-cl; s[1][2]+=cl;

cl=T; char *p2 = (char*)VirtualAlloc(NULL, memsize, MEM_COMMIT, PAGE_READWRITE);
cl=T-cl; s[2][0]+=cl; cl=T; memset(p2, 97, memsize);
cl=T-cl; s[2][1]+=cl; cl=T; VirtualFree(p2, memsize, MEM_DECOMMIT);
cl=T-cl; s[2][2]+=cl;

cl=T; char *p3=new char[memsize]; cl=T-cl; s[3][0]+=cl;
cl=T; memset(p3, 97, memsize); cl=T-cl; s[3][1]+=cl;
cl=T; delete p3; cl=T-cl; s[3][2]+=cl; }

printf("HeapAllocの速度の合計 確保%d コピー%d 解放%d\n",s[0][0],s[0][1],s[0][2]);
printf("FileMappingの速度の合計 確保%d コピー%d 解放%d\n",s[1][0],s[1][1],s[1][2]);
printf("VirtualAllocの速度の合計 確保%d コピー%d 解放%d \n",s[2][0],s[2][1],s[2][2]);
printf("newの速度の合計 確保%d コピー%d 解放%d \n",s[3][0],s[3][1],s[3][2]);}

73 名前:72 [2008/09/10(水) 14:01:24 ]
メモリ300Mの確保では、newが最速という結果が出ました。なぜかコピーが速いです。

74 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 14:07:37 ]
それぐらいこだわりを入れるなら、ポインタを使ったほうがいいよ。

75 名前:デフォルトの名無しさん [2008/09/10(水) 14:25:45 ]
いやいや、ポインタは一回はまると難しすぎるから初心者には無理無理w

76 名前:72 [2008/09/10(水) 14:27:12 ]
すみません質問です。これは途中でerrで停止するのですが原因わかりますか?

#include <windows.h>
#include <iostream>
using namespace std;
#define memsize 200000000

int main(){
for(int n=1;n<100;n++){
printf("%d回目の確保\n",n);

char *q = (char*)VirtualAlloc(NULL, memsize, MEM_COMMIT, PAGE_READWRITE);
q[memsize-1]=0; VirtualFree(q, memsize, MEM_DECOMMIT);

HANDLE hd = HeapCreate(NULL, 0, 0);
char *p = (char*) HeapAlloc(hd, HEAP_ZERO_MEMORY, memsize);
if(p==NULL){cout<<"err\n";return -1;} p[memsize-1]=0;
HeapFree(hd, NULL, p); HeapDestroy(hd);}}

77 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 14:28:12 ]
っGetLastError

78 名前:デフォルトの名無しさん [2008/09/10(水) 14:32:24 ]
当たり前だ
10回行かないだろ
言語のまえにバソポンについて勉強汁

79 名前:72 [2008/09/10(水) 14:33:12 ]
自己解決しました。
VirtualFree(q, memsize, MEM_DECOMMIT);を
VirtualFree(q, 0, MEM_RELEASE);にしたら成功しました。

でも、コミット解除と、領域解放の違いがわかりません。

80 名前:72 [2008/09/10(水) 14:40:54 ]
領域確保をHDD増設すると、コミットはFormatみたいなものですか?
コミット解除は、NTFSをOSが管理できないFormatと見なすようなものですか?



81 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 14:46:47 ]
>>79
説明すると長くなるからMSDNのメモリ管理に関する項目読んで。

82 名前:72 [2008/09/10(水) 15:05:56 ]
>>81
みてみたのですがわかりませんでした。

別々のメモリを確保して、ハンドルも取得したい場合は、hdとheはどのように求めればいいですか?
char *p = (char*)VirtualAllocEx(hd, NULL, memsize, MEM_COMMIT, PAGE_READWRITE);
char *q = (char*)VirtualAllocEx(he, NULL, memsize, MEM_COMMIT, PAGE_READWRITE);

83 名前:デフォルトの名無しさん [2008/09/10(水) 15:09:41 ]
メモリ確保関数のうち、巨大な確保が一番成功しやすいのは、VirtualAllocExでしょうか?
あと、CreateFileMapping(INVALID_HANDLE_VALUE,・・・)はVirtualAllocExと同じですか?
メインメモリ。仮想記憶のどこかに確保されて性能に違いはありませんか?


84 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 15:11:53 ]
ぜんぶMSDNにかいてあるから探せ

85 名前:デフォルトの名無しさん [2008/09/10(水) 15:38:40 ]
どうやらメモリ確保の最大容量は、newが少ないほかは全部同じでした。大容量時は使いやすいやつでいいってことですかね
#include <windows.h>
#include <iostream>
using namespace std;
int main(){
printf("HeapAllocのメモリ確保耐久テスト\n");
unsigned int size=200000000; while(1){
HANDLE hd = HeapCreate(NULL, 0, 0);
char *p = (char*) HeapAlloc(hd, HEAP_ZERO_MEMORY, size);
if(p==NULL){printf("エラーサイズ = %d\n",size);break;}
size*=1.05; HeapFree(hd, NULL, p); HeapDestroy(hd);}

printf("\nVirtualAllocのメモリ確保耐久テスト\n");
size=200000000; while(1){
char *q = (char*)VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
if(q==NULL) {printf("エラーサイズ = %d\n",size);break;}
size*=1.05; VirtualFree(q, 0, MEM_RELEASE);}

printf("\nCreateFileMappingのメモリ確保耐久テスト\n");
size=200000000; while(1){
HANDLE hShare = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,0,size, "MEMTEST");
char *r = (char*)MapViewOfFile(hShare, FILE_MAP_ALL_ACCESS, 0, 0, size);
if(r==NULL) {printf("エラーサイズ = %d\n",size);break;}
size*=1.05; UnmapViewOfFile(r); CloseHandle(hShare);}

printf("\nnewのメモリ確保耐久テスト\n");
size=200000000; while(1){
char *s=new char[size];
if(s==NULL) {printf("エラーサイズ = %d\n",size); break;}
else printf("成功サイズ = %d\n",size);
size*=1.05; delete s;}}

86 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 15:42:26 ]
インデントを整えてくれ
醜い

87 名前:デフォルトの名無しさん [2008/09/10(水) 16:49:38 ]
メモリが512Mしか乗っていなくて、確保できた最大サイズ1.6Gの読み書きテストをすると
動作がおそくなります。 物理メモリの確保サイズはせいぜい300Mという所とおもいます。
300M以上の場合、メモリや仮想メモリを使わずに、ファイルにマッピングしたいと思います。
アロケータというのを聞きますが、newやSTLを自前で管理するにはどうしたらいいですか?

88 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 16:59:53 ]
newはoperator new
アロケータは3番目のテンプレート引数に指定できる

89 名前:デフォルトの名無しさん [2008/09/10(水) 17:19:32 ]
自前のアロケータを使用してSTLを実用で使うまでにはどのような手順をとればいいかりません。
どうしたらいいですか

90 名前:デフォルトの名無しさん [2008/09/10(水) 17:21:59 ]
templateを勉強し始めたのですがなぜエラーなのかわかりません。ご教授ください。
以下、該当ソースです。
typedef struct taghoge {
  int val1;
  union {
    struct {
      int val2_1_1;
      int val2_1_2;
    } val2_1;
    struct {
      long val2_2_1;
    } val2_2;
  } val2;
} hoge;

template <typename T> const char* func(T& temp) { return typeid(temp).name(); }

void main() {
hoge h;
printf("h = %s\n", func(h));
printf("h.val1 = %s\n", func(h.val1));
printf("h.val2 = %s\n", func(h.val2));
printf("h.val2.val2_1 = %s\n", func(h.val2.val2_1)); // 1: OK
printf("h.val2.val2_2 = %s\n", func(h.val2.val2_2)); // 2: NG
}
1の箇所はコンパイルも実行もできます。2の箇所はコンパイルできません。
エラーは「error C2664: 'func' : 1 番目の引数を '' から '&' に変換できません。」とでます。
なぜこのようなコンパイルエラーになるのでしょうか。
環境は VC++2005 ExpressEdition + SP1 です。



91 名前:90 [2008/09/10(水) 17:25:57 ]
unionのなかのstructに名前をつけたらコンパイルはとおりますが、
つけないで通す方法と、なぜ通らないかが理解したい箇所です。

92 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 17:27:50 ]
>>89
どういうキーワードでググッた?

93 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 17:42:57 ]
>>87
そんなことしたって速くならないよ。
それで速くなるならアプリはみんなそうするし、メモリを何Gも積む奴もいない。

94 名前:デフォルトの名無しさん [2008/09/10(水) 17:59:03 ]
>>92
アロケータ、STLなどです。 
>>93
他のOSなどのメモリを食い尽くさないためです。
実メモリが無くなれば他のソフトにまで影響が出ます。

95 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 18:30:22 ]
>>90
2008 SP1では通ったぞ
規格的に適合してるかは知らん

96 名前:デフォルトの名無しさん [2008/09/10(水) 18:46:28 ]
一瞬で10Gの空ファイルを作るにはどうすればいいんですか?

97 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 18:47:06 ]
環境による

98 名前:デフォルトの名無しさん [2008/09/10(水) 18:49:02 ]
魔法使いに頼む

99 名前:デフォルトの名無しさん mailto:sage [2008/09/10(水) 18:58:45 ]
空ファイルってサイズあるの?

100 名前:デフォルトの名無しさん [2008/09/10(水) 19:10:23 ]
これで1Gのファイル生成と、char型配列の関連づけできてますか?

int main() {
char temppath[300], tempfile[300];
GetTempPath(300, temppath);
GetTempFileName(temppath,"mem",0,tempfile);
HANDLE fp=CreateFile(tempfile, GENERIC_READ|GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0 );
int size=1000000000;
LockFile(fp,0,0,size,0);
HANDLE mp=CreateFileMapping( fp, 0, PAGE_READWRITE|SEC_COMMIT, 0, size, "memtest");
char *q=(char*) MapViewOfFile( mp, FILE_MAP_ALL_ACCESS, 0, 0, 0);
q[size-1]='a';
UnmapViewOfFile(mp);
UnlockFile(fp,0,0,size,0);
CloseHandle(fp);}








[ 続きを読む ] / [ 携帯版 ]

次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<177KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef