초보 님이 쓰신 글 :
: 누가 배열로 얼마까지 버퍼를 잡아둘수 있나? 고 여쭤보셔서
:
: 사용환경은 XE8 입니다.
:
: #include <vcl.h>
: #pragma hdrstop
:
: #include "Main.h"
: //---------------------------------------------------------------------------
: #pragma package(smart_init)
: #pragma resource "*.dfm"
: TForm3 *Form3;
:
: AnsiString Tmp[30000000];
: //---------------------------------------------------------------------------
: __fastcall TForm3::TForm3(TComponent* Owner)
: : TForm(Owner)
: {
: }
: //---------------------------------------------------------------------------
:
: 이렇게 하니 컴파일은 되는데
:
: tmp크기를 40000000 으로 잡으니 Link 에러가 나오고
: 1억부터는 그냥 [ilink32 Error] Fatal: Out of memory 로 나오네요
:
: 이게 좀 재밌는게..
: #define MAX 2100000000
: AnsiString Tmp[MAX];
:
: 이렇게 하면 아무 문제 없이 컴파일이 되네요..
: 1억으로도 안되던게 21억을집어넣으니깐 되는데 22억은 안되네요 .
:
: 왜 이런건지 설명해주실분 계실런지요?
:
: 물론 이렇게 배열 잡아서 코딩하는것도 나쁘지만 이런 배열을 써야 한다면 동적 메모리로 잡아야 하겠죠?;
:
:
답변:
컴파일러가 허용하는 정적배열의 최대치를 알아내려면 BYTE tmp[xxxx] 형태로 해야죠.
C++빌더에서 AnsiString은 AnsiStringT<0> 로 인스턴스 되어지는 템플릿 클래스이고
문자셋 Encoding을 위한 클래스 내부 변수를 포함하기 때문 입니다.
AnsiStringT<0> 으로 템블릿 인자로 0이 주어지되게 되면 OS 디폴트 코드페이지를 사용.
그리고...
#define 신텍스로 Numeric Constant 값을 정의할 때... 다음과 같은 식으로 명시적으로 정의하지 않으면
큰 수에 대해서 Numeric Overflow가 발생해서 값이 짤리게 됩니다.
#define MAX 100000000UL // UL 로 명시적으로 지정해 주지 않으면 Numeric Overflow가 발생하면서 값이 짤림.
|