a22_memman06
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* メモリ管理#6
-(by [[K]], 2022.04.19)
** (1)
-C言語はC++言語とは異なり、クラスに対して強制的にコンスト...
-いや、それならそもそもCなんか使わずにC++を使えばいいじゃ...
** (2)
-私がCでクラスっぽいことをやりたいときは、structで構造体...
-Cでクラス処理の真似をすると、最初に面倒に感じるのは、デ...
-そこで私は、デストラクタを直接呼び出さなくてもいい仕組み...
ABegin(c1); // ACleanオブジェクトを宣言して初期化するマ...
Test a, b, c;
Test_init(&a, c1); // こうすることで、AClean_out(c1)した...
Test_init(&b, c1);
Test_init(&c, c1);
Test_say(&a, "hello");
...
AClean_out(c1); // これでa,b,cはdeinit()される(c,b,aの順...
-mallocしたのにfreeし忘れるというバグも時々あります。だか...
ABegin(c1);
char *d = aMalloc(1234, c1);
...
AClean_out(c1); // ここでfree(d)もしてくれる.
-これならAClean_outだけを忘れないようにすればいいことにな...
** (3)
-このclean-outの仕組みがあることで、free忘れやデストラク...
-しかしまだ防げないものがあります。それは開放タイミングを...
-でも大丈夫です。そんなポカをやってしまっても、直ちにエラ...
-それだけではありません。この仕組みはinit忘れも検出します...
** (4)
-ACleanのおかげで、オブジェクトの寿命管理がすごく簡単にな...
-これは生成した文字列をmallocしたメモリに返してくれるspri...
char *xsprintf(AClean *c, const char *f, ...)
{
char s[1024 * 1024];
va_list ap;
va_start(ap, f);
int l = vsnprintf(s, sizeof s, f, ap);
char *t = aMalloc(l + 1, c);
strcpy(t, s);
va_end(ap);
return t;
}
-このxsprintf()があれば、こんなことができます。
char *s = "";
ABegin(c1);
for (i = 0; i < 100; i++)
s = xsprintf("%d %s", i, s);
puts(s);
AClean_out(c1);
-これを実行して得られるのはこんな結果です。
99 98 97 96 95 94 93 92 ... 9 8 7 6 5 4 3 2 1 0
-プログラムでは、文字列をメモリ上に遠慮なく作って、そのま...
-xsprintf()を使ったプログラムは、sの長さが何バイトくらい...
** (5)
-別の例を紹介します。Matrixという自作のクラスがあって、こ...
ABegin(c1);
Matrix *A = Mat22_init(c1, 1, 2, 3, 4);
Matrix *B = Mat22_init(c1, 5, 7, 8, 6);
Matrix *C1 = A.add(c1, B).mul(c1, A.sub(c1, B)); // (A+B...
Matrix *C2 = A.mul(c1, A).sub(c1, B.mul(c1, B)); // A*A-...
C1.print("C1=");
C2.print("C2=");
AClean_out(c1);
-ええと、C言語ではメンバ関数は使えません。というかそもそ...
--D言語のUFCSというのは、 a.func(b, c, d) を func(a, b, c...
-さらに上記のプログラム内でc1指定が多すぎてうっとうしいの...
-ここでも.add()や.mul()はMatrix *を返しています。オブジェ...
** (6)
-(4)や(5)の例では、オブジェクトの代入は単純なポインタ代入...
-これはC++の基本的な方針とは異なります。C++ではちょうど変...
-C++のやり方では、コピーのコストを下げるためにムーブなど...
-そして私のAClean方式は、オブジェクトの寿命は変数のスコー...
-ちなみにC++でも参照カウンタを使えば、Javaっぽいことがで...
** (7)
-先に示したxsprintf()ですが、以下のようにすることもできま...
char *xsprintf2(AClean *c, const char *f, ...)
{
char s[1024 * 1024];
va_list ap;
va_start(ap, f);
int l = vsnprintf(s, sizeof s, f, ap);
if (strcmp(s, "0") == 0) return "0"; // この行を追加.
char *t = aMalloc(l + 1, c);
strcpy(t, s);
va_end(ap);
return t;
}
-これはたとえば結果が"0"になることが非常に多い場合(かつ...
-こういう工夫はC++方式ではできません。C++方式で許されるの...
-AClean方式なら、ACleanに登録されるか否かで処理が自動で分...
** (8)
-セキュリティとの関係について。このACleanはセキュリティを...
** (9)
-ACleanの仕組みはとても単純です。200行にも満たないもので...
--ちなみにこのACleanと(続編に書いた)自作のメモリアロケ...
--なんかそれまでのC言語とはちょっとちがう使い心地です。
-続編 → [[a22_memman07]]
終了行:
* メモリ管理#6
-(by [[K]], 2022.04.19)
** (1)
-C言語はC++言語とは異なり、クラスに対して強制的にコンスト...
-いや、それならそもそもCなんか使わずにC++を使えばいいじゃ...
** (2)
-私がCでクラスっぽいことをやりたいときは、structで構造体...
-Cでクラス処理の真似をすると、最初に面倒に感じるのは、デ...
-そこで私は、デストラクタを直接呼び出さなくてもいい仕組み...
ABegin(c1); // ACleanオブジェクトを宣言して初期化するマ...
Test a, b, c;
Test_init(&a, c1); // こうすることで、AClean_out(c1)した...
Test_init(&b, c1);
Test_init(&c, c1);
Test_say(&a, "hello");
...
AClean_out(c1); // これでa,b,cはdeinit()される(c,b,aの順...
-mallocしたのにfreeし忘れるというバグも時々あります。だか...
ABegin(c1);
char *d = aMalloc(1234, c1);
...
AClean_out(c1); // ここでfree(d)もしてくれる.
-これならAClean_outだけを忘れないようにすればいいことにな...
** (3)
-このclean-outの仕組みがあることで、free忘れやデストラク...
-しかしまだ防げないものがあります。それは開放タイミングを...
-でも大丈夫です。そんなポカをやってしまっても、直ちにエラ...
-それだけではありません。この仕組みはinit忘れも検出します...
** (4)
-ACleanのおかげで、オブジェクトの寿命管理がすごく簡単にな...
-これは生成した文字列をmallocしたメモリに返してくれるspri...
char *xsprintf(AClean *c, const char *f, ...)
{
char s[1024 * 1024];
va_list ap;
va_start(ap, f);
int l = vsnprintf(s, sizeof s, f, ap);
char *t = aMalloc(l + 1, c);
strcpy(t, s);
va_end(ap);
return t;
}
-このxsprintf()があれば、こんなことができます。
char *s = "";
ABegin(c1);
for (i = 0; i < 100; i++)
s = xsprintf("%d %s", i, s);
puts(s);
AClean_out(c1);
-これを実行して得られるのはこんな結果です。
99 98 97 96 95 94 93 92 ... 9 8 7 6 5 4 3 2 1 0
-プログラムでは、文字列をメモリ上に遠慮なく作って、そのま...
-xsprintf()を使ったプログラムは、sの長さが何バイトくらい...
** (5)
-別の例を紹介します。Matrixという自作のクラスがあって、こ...
ABegin(c1);
Matrix *A = Mat22_init(c1, 1, 2, 3, 4);
Matrix *B = Mat22_init(c1, 5, 7, 8, 6);
Matrix *C1 = A.add(c1, B).mul(c1, A.sub(c1, B)); // (A+B...
Matrix *C2 = A.mul(c1, A).sub(c1, B.mul(c1, B)); // A*A-...
C1.print("C1=");
C2.print("C2=");
AClean_out(c1);
-ええと、C言語ではメンバ関数は使えません。というかそもそ...
--D言語のUFCSというのは、 a.func(b, c, d) を func(a, b, c...
-さらに上記のプログラム内でc1指定が多すぎてうっとうしいの...
-ここでも.add()や.mul()はMatrix *を返しています。オブジェ...
** (6)
-(4)や(5)の例では、オブジェクトの代入は単純なポインタ代入...
-これはC++の基本的な方針とは異なります。C++ではちょうど変...
-C++のやり方では、コピーのコストを下げるためにムーブなど...
-そして私のAClean方式は、オブジェクトの寿命は変数のスコー...
-ちなみにC++でも参照カウンタを使えば、Javaっぽいことがで...
** (7)
-先に示したxsprintf()ですが、以下のようにすることもできま...
char *xsprintf2(AClean *c, const char *f, ...)
{
char s[1024 * 1024];
va_list ap;
va_start(ap, f);
int l = vsnprintf(s, sizeof s, f, ap);
if (strcmp(s, "0") == 0) return "0"; // この行を追加.
char *t = aMalloc(l + 1, c);
strcpy(t, s);
va_end(ap);
return t;
}
-これはたとえば結果が"0"になることが非常に多い場合(かつ...
-こういう工夫はC++方式ではできません。C++方式で許されるの...
-AClean方式なら、ACleanに登録されるか否かで処理が自動で分...
** (8)
-セキュリティとの関係について。このACleanはセキュリティを...
** (9)
-ACleanの仕組みはとても単純です。200行にも満たないもので...
--ちなみにこのACleanと(続編に書いた)自作のメモリアロケ...
--なんかそれまでのC言語とはちょっとちがう使い心地です。
-続編 → [[a22_memman07]]
ページ名: