[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[WitchTech 00775] Re: 現在最強 !? のフリーコンパイラ



きゆきです。

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