[c++] double data[최대 할당]; 의 의미..

gyxor의 이미지

어셈블리어의 경우에 메모리 최대 사용가능은 com 파일은 64 kbyte 이고
그 이상을 쓰려면 stack을 더 선언해야 한다고 알고있습니다.
메모리(램)은 한정되어 있고 c도 마찬가지로 모든 변수의 공간할당은 메모리(램)
에 이루어 지는것으로 알고있습니다. 하드에는 단지(소스,컴파일러,라이브러리등..)
이런것들만 있게 되는데요..
램안의 구조를 모두 알고싶은것은 아니구요
그안에서 c++이 사용할 수 있는 공간이 얼마나 되는지..궁금했습니다.
그래서 노가다를 했습니다.

#include<iostream>
using namespace std;

int main()
{
        double data[14763950071]={0};
 return 0;
}

이와같은 소스는 정상적으로 컴파일됩니다.

14763950071->14763950072 로만 바꾸어도
--------------------Configuration: Cpp1 - Win32 Debug--------------------
Compiling...
Cpp1.cpp
C:\Temp_data\C++Study\Cpp\Cpp1.cpp(5) : fatal error C1001: INTERNAL COMPILER ERROR
  (compiler file 'E:\8168\vc98\p2\src\P2\x86\MDmisc.c', line 1244)
    Please choose the Technical Support command on the Visual C++
    Help menu, or open the Technical Support help file for more information
Error executing cl.exe.

이런 에러가 납니다.
매우 큰 숫자로 바꾸게 되면
--------------------Configuration: Cpp1 - Win32 Debug--------------------
Compiling...
Cpp1.cpp
C:\Temp_data\C++Study\Cpp\Cpp1.cpp(6) : error C2118: negative subscript or subscript is too large
Error executing cl.exe.

Cpp1.obj - 1 error(s), 0 warning(s)

이런 에러가 나오게 됩니다.
#include<iostream>
using namespace std;

int main()
{
 long i=14763950071*8;
 cout << i/(1024*1024);
 
 return 0;
}

2047

실제 계산된 값은 2047메가 입니다. 제가 사용하는 컴의 256메가램의 용량을
훨씬 뛰어 넘는데요..
제가 말씀드린것들이 어딘가가 많이 잘못된거 같은데요..
이부분에 대한 개념도 확실치 않구요..
램의 일부분은 시스템에서도 사용을 해야하고..
그렇다면 c++에서 사용할 수 있는 공간은 얼마이며..또 시스템(램용량이 다른)
이나 컴파일러마다 달라지는지..
정말 궁금합니다.
답변해주시면 감사하겠습니다.

버려진의 이미지

아.. 저도 잘은 모릅니다만 :(
그 실험은 즉시 중단하시는게 좋을거 같습니다. :wink:
제가 저번에 그런걸 하다가 하드를 몇번 날렸는데요.
그것.. 컴파일은 잘 되더라도(사실 컴파일러마다 그 수치도 다르게 나옵니다) 실제로 실행을 해보면 작동을 예상 외입니다. 뭐 그냥 세그먼트 폴트 정도로 끝나면 다행이고 저처럼 하드가 날아갈수도 있구요.
그 후로 더 알아보지는 못했습니다만 실제로 그렇게 할당되는건 아닌듯 싶습니다.

kslee80의 이미지

그렇게 internal 한 문제는 저도 잘은 모릅니다만..
제가 아는 한도 내에서만 답변을 달겠습니다.

com 파일의 64k 제한은 예전 고릿적 Real DOS 에서 존재하던 한계이며,
요즘의 대부분의 OS 들에 해당하는 한계는 아니라고 알고 있습니다.
(요즘의 OS 들은 보호 모드를 사용하기 때문이 아닌가 싶긴 합니다.)

메모리 사용 한도에 대한 이야기는 아무래도 OS 적인 이야기가 아닐까 싶습니다.
최근의 OS 들은 대부분 virtual memory mapping 을 사용하기 때문에
사용 가능한 메모리의 한계는 CPU 의 addressing 한계에 영향을
받습니다.
보통은 32bit CPU 를 많이 사용하기에 32bit 형의 최대 크기까지 가능한
것으로 알고 있습니다.(2GB 인지 4GB 인지 가물가물 >.<)

그리고 실제 사용 가능한 메모리 량을 넘어서는 공간을 할당하는 경우
역시나 대부분의 OS 들에서 채택하고 있는 swapping 에 의해서
하드상의 일정 공간을 이용하게 됩니다.
물론, Application 의 입장에서는 변함없이 물리적 memory 와 같이
사용할수 있죠..

물론, 장착된 램 + swap space 의 크기 이상을 사용할수는 없겠지요 ^^

antibug의 이미지

일단은 OS에 의해 결정되는 문제라고 생각되는군요.
32비트 OS라면 메모리의 최대 크기는 32비트에 의해 제한되겠죠.
4기가인데요, NT 계열과 98 계열의 지원이 다르긴 하지만 WIN32의
경우에는 응용프로그램에 할당된 메모리가 최대 2기가로 알고 있습니다.
나머지는 시스템에 의해 사용되구요.

님처럼 소스에서 2G이상의 데이터를 할당하는 것에 대해서는 제가 확실히
말할 수 없는게, 일단 그렇게 정의하신다면 제가 보기에 해당 데이터는
BSS에 할당되거나 스택에 할당되거나 뭐, 그럴거 같네요. 어느경우건
OS에 의해, 그리고 컴파일러에 의해 좌우될 것 같다는게 제 생각입니다.
일단 BSS에 할당된다고 했을때 실행파일이 로딩되는 순간 BSS까지 완전히
설정한다면 모를까 그렇지 않다면 로딩은 완료되겠죠. 실제 에러를 경험하고
싶다면 해당 배열의 처음과 끝에 어떤 값을 넣어보세요.

스택에 할당되는 경우는 실제 프로그램을 실행시키기 전에는 에러를 확인할
수 없을 것 같은데요, 컴파일만 확인하고 실행까지 확인해보신건지 모르겠네요.
제가 확인해본 바로는 1G짜리 배열( char[1G] )을 컴파일하는데 WIN32
에서는 gcc는 링크오류가, vcpp에서는 실행오류가 발생하네요.

오류가 난 소스는

int main( void )
{
  char temp[ 1024 * 1024 * 1024 ] ;
  temp[0] = 0 ;
  temp[ 1024 * 1024 * 1024 - 1 ] = 0 ;
  return 0 ; 
}

OS의 메모리맵을 살펴보시면 응용 프로그램에서 사용가능한 메모리의 크기가
대충 나옵니다. 물론 그걸 전부 사용할 수 있는 것은 아니죠. 다른 라이브러리
들이 사용하는 메모리도 있으니까요. 하지만 대부분 실제 메모리의 양에 따라서
사용가능한 메모리의 양이 정해지겠죠.

어느분이 [그런짓] 하지 말라고 하셨는데, 제가 보기에는 이런 작업은 충분히
시도해볼만한 작업입니다. OS에 종속적인 어떤 값을을 실제로 확인해볼 수
있는 경험이라고 할 수 있죠. 주로 효율(퍼포먼스)에 대한 내용이 아닐까 생각
해보는데, 이런건 쓸만한 문서가 거의 없기때문에 개인의 경험에 의존할 수
밖에 없다고 봅니다.

그리고 개인의 경험은 경험을 쌓을 수 있을때 쌓아야죠. 추석 연휴 내내
회사에서 꿈지럭 거려서는 뭐..... ㅠ.ㅠ;;

--------------------------------------
재미없는 일은 하지 말자는 인간 쓰레기.
-.-;

gyxor의 이미지

그렇군요.. 컴파일만 했을때는 2기가의 할당이 가능하지만 ..
char temp[ 1024 * 1024 * 1024 ]
물론 이렇게 해주신것도 컴파일만 하는것은 가능했습니다. 또한
={0};
이부분에서 이미 모든 값에 0이 들어가니까요..(확인도 해봤지만)
문제는 컴파일까지는 되는데 직접 실행해보니 그 커트라인이 훨씬 낫아
집니다.
펜3 700 196메가램에서 했을때는

char data[1039788]={0};

이런 할당까지 가능했습니다. +1만해도 실행에서 에러가 납니다.

도한 펜4 2.4 256메가램에서 했을때는 오히려..

char data[1036096]={0};

할당할 수 있는량이 줄어드는군요..

다른 프로그램을 많이 띄어놓았는지는 관련이 없는거 같습니다.

위 할당량은 약 1메가 정도인데요..

왜 컴파일과정까지 에러가 나지않는 할당량과 실행까지 했을때 에러가
나지않는 할당량이 달라지는지.. 궁금합니다.

kslee80의 이미지

컴파일러는 메인 메모리의 최대량같은 정보를 사용하질 않습니다.
단지, 문법적으로 올바른 코드라면 에러 없이 컴파일 하죠.

하지만, Addressing 의 한계치가 존재하다 보니,
그 수치를 넘어서는 인덱스에 대해서는 assembly 코드 생성을 할수 없기에
에러를 발생시키죠.
(이 부분이 명확하진 않습니다. 이건 단지 저의 추측일 뿐입니다.)

하지만 컴파일 완료된 코드를 실행 시키는 것은
컴파일러보다는 OS 에 의한 제약을 많이 받게 되겠죠.
한개의 프로세스에 할당 가능한 최대 메모리의 제약이 존재할수도 있으며,
말씀하신 현상은 이에 따른 현상이 아닐까 싶습니다.

Necromancer의 이미지

486에 도스 썼던 시절에 djgpp (도스용 gcc)에서 컴파일해서 썼을적에 char형
전역변수로 256kb 잡을때는 세그폴트 안떨어지던데, 256kb + 1 잡으니까
세그폴트가 떨어지더군요. 제 추측으로는 djgpp로 컴파일된 프로그램들의
도스확장자로 쓰이는 cwsdpmi.exe가 스택 크기를 256k로 고정시킨 것
같더군요.

터보씨는 배열 크기 64k가 한계인거 맞구요. 게네들은 오로지 16bit 8086 코드만
만들어내니까요. 또한 8086의 구조와 직접적으로 연결되는 far, near 등의
몇가지 확장 지시어들(C표준에는 없습니다.)도 있고요.

Written By the Black Knight of Destruction

vacancy의 이미지

일단 2G 제한은,
OS가 Kernel 영역에 2G, User 영역에 2G 할당하기 때문인 것이고요.
( 32bit 로 access할수 있는 최대 영역은 4G입니다. )
OS마다 차이가 있겠죠 ?

그리고 메모리에서 확보할 수 없는 영역은,
하드 디스크 등에 swapping을 통해 가상 메모리로 확보하게 됩니다.
그런데 하드 디스크에 swapping 영역으로 할당된 것조차 모자랄 수도 있겠죠.
그래서 생기는 문제가 아닌가 합니다. ( 추측입니다. )
사실 하드디스크에 수G씩 swap partition으로 두질 않잖아요 ? -_-a

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.