[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[WitchTech 00775] Re: 現在最強 !? のフリーコンパイラ
- Subject: [WitchTech 00775] Re: 現在最強 !? のフリーコンパイラ
- From: <sakura@tennodai.com>
- Date: Fri, 06 Apr 2001 01:49:16 +0900 (JST)
きゆきです。
boots> Digital Mars C++ (以前の Symantec C++、その昔は Zortech C++) がフリーで
boots> 提供されています。
boots> ちなみに、非常にシンプルな new しない C++ソース(インスタンスは auto や
boots> やグローバルやfileスコープで確保)のコンパイルと実行はできました。
boots> スタックにインスタンスがとられるとつらいので、グローバルにインスタンス
boots> を作るほうがウィッチ向きな気がしますが、グローバルなインスタンスではコ
boots> ンストラクタが呼び出されない(そういうスタートアップルーチンを書けば別
boots> ですが)ので、初期化のメソッドを分離して main() 以降で呼んであげる必要が
boots> あります。
ちょっとコンパイラを試してみましたが、いっそ以下のように、ヒープを固定領域にとって
operator new を再定義するのも一つの手かと思います。
以前話題になっていた malloc の実装を operator new や operator delete に移植する
のもよいかも。
sc.exe は、ちょっと古めの C++ のようですね。
ワンダースワン本体が壊れてしまってまだ買い直していないため、本体でのテストは
できませんでしたが、DOSプロンプトではきちんと動いているようです。
// sc -v -msw -j0 -Bj -0 -o -a1 foo.cpp mynew.cpp
////////////////////////////////////////////////////
// mynew.cpp
#include <stdio.h>
#define ALIGNTYPE int
#define NEWBUFSIZ 1024 /* heap size に相当 */
static char newbuf[NEWBUFSIZ];
static char* newptr = newbuf;
static size_t align(size_t sz) {
if (sz == 0) sz++;
sz += sizeof(ALIGNTYPE) - 1;
sz /= sizeof(ALIGNTYPE);
sz *= sizeof(ALIGNTYPE);
return sz;
}
void* operator new(size_t sz) {
sz = align(sz);
if (sz + newptr > newbuf + NEWBUFSIZ) {
return 0;
}
char* cur = newptr;
newptr += sz;
return cur;
}
void operator delete(void* p) {
// 何もしない
}
////////////////////////////////////////////////////
// sc -v -msw -j0 -Bj -0 -o -a1 foo.cpp mynew.cpp
////////////////////////////////////////////////////
// foo.cpp
#include <stdio.h>
class Test {
public:
Test() {
printf("constructing at %p.\n", this);
}
virtual ~Test() {
printf(" destroying at %p.\n", this);
}
};
int main(int argc, char** argv) {
int count = 0;
for (;;) {
count++;
printf("%04d:", count);
Test* p = new Test;
if (!p) {
break;
}
delete p;
}
printf("\n");
return 0;
}
////////////////////////////////////////////////////
--
sakura@tennodai.com
ML Archives