지역변수는 선언만 한 경우, 쓰레기값으로 초기화가 됩니다.
하지만, BigInteger형은 0으로 초기화 합니다.

0의 정의는 다음과 같습니다. (11. 9. 14 바뀌었습니다.)

len = 0;
blk = NULL;
sign = zero;

구버젼에서는 0을 표현하기 위해서도 동적 할당을 하였지만
for문등에서 할당으로 인해 속도 저하가 있었고
0의 정의를 바꾸게 되었습니다.

0의 정의를 바꾸면서 초기화 부분이 많이 바뀌었습니다.
기본 생상자와 보조 함수들이 많이 바뀌었으며
새롭게 추가된 함수들도 있습니다.

아래가 생성자 보조 함수들입니다.
	// 길이 c만큼 blk를 할당하는 함수입니다.
	void Allocate(length c);
	// 길이 c만큼 재할당하는 함수입니다.
	// 무조건 길이 c만큼으로 재할당하며
	// blk를 해제 후, Allocate 함수를 호출합니다.
	void Reallocate(length c);
	// blk배열의 모든 요소를 0으로 만듭니다.
	inline void Blkinit();
	// blk배열을 복사합니다. 
	inline void Blkcopy(const BigInteger &x);
	// 0으로 초기화하기 위해 사용합니다.
	inline void SetZero();
	// blk를 해제 후, 0으로 초기화 합니다.
	inline void Reset();


Blkinit, Blkcopy, SetZero, Reset 함수가 추가되었으며

0을 정의하는 함수 SetZero를 보면 다음과 같습니다.
void BigInteger::SetZero()
{
	len = 0;
	blk = NULL;
	sign = Zero;
}


0의 정의를 바꿔서 여러 함수에서
0을 따로 처리해야했지만,
동적 할당을 하지 않는 현재가 더 낫습니다.

핟당과 재할당 함수는 다음과 같습니다.

void BigInteger::Allocate(length c)
{
	len = c;
	blk = new blocktype[len];
}

void BigInteger::Reallocate(length c)
{
	if (len != c)
	{
		if (blk != NULL)
			delete [] blk;
		Allocate(c);
	}
}

 


재할당 함수에서 blk != NULL부분이 새롭게 추가되었으며
다른 것은 변하지 않았습니다.
초기화 부분은 복잡하지 않기 때문에
코드를 보신다면 바로바로 이해하실 수 있습니다.

Posted by 투명테잎