문제

고 있 프로젝트를 위한 임베디드 시스템이 과거에 우리가 뜯어의 순서는 선언의 변수는 stack 크기를 줄이기 위해 그 결과 실행이 가능합니다.예를 들어,우리가 가진 경우:

void func()
{
    char c;
    int i;
    short s;
    ...
}

우리는 순서를 변경이 될:

void func()
{
    int i;
    short s;
    char c;
    ...
}

기 때문에 정렬의 문제를 첫 번째 중 하나의 결과에서 12 개의 바이트 스택 사용되는 공간이고 두 번째 중 하나의 결과에 8 바이트가 있습니다.

이 표준 동작한 C 컴파일러 또는 단점의 컴파일러를 사용하고 있었는데?

그것은 컴파일해야할 수 있는 스택수 변수를 더 작은 실행 파일 크기하는 경우.그것은 제안되었다는 것을 나에게 어떤 측면에서 C 표준 방지만,나는 할 수 없었던 신뢰할 수있는 소스를 찾을 수 있느니다.

보너스로 질문을,이에도 적용하는 C++컴파일러는?

편집

그렇다면,C/C++컴파일러를 다시 배치할 수 있습 stack 변수를 제공할 수 있습니다 예를 컴파일러는 확실히이 무엇입니까?보고 싶 컴파일러는 설명서 또는 유사한 뒤 이다.

다시 편집

셔서 감사합니다 모두에 대한 당신의 도움이됩니다.에 대한 문서,최고의 일이었을 찾을 수있을 것입니지 최적의 스택 슬롯에 할당 GCC(pdf)에 의하여,Naveen Sharma 및 Sanjiv 마르 굽는 제 GCC 정상회의 절차에서 2003.

프로젝트는 질문에 여기를 사용하여 광고를 컴파일러는 ARM 개발.그것은 설명서에서 언급한 컴파일러는 주문 선언처럼 나는 다음과 같 성능을 향상시킬 수 있습뿐만 아니라 스택 크기 때문에,방법의 팔 엄지손가락 건축물을 계산한 주소에서 로컬 스 프레임입니다.는 컴파일러지 않았을 자동으로 재정비하는 지역 주민을 활용합니다.종이 연결되어 여기에는 2003 년에 GCC 도지 않은 다시 정렬 스택을 향상시키기 위해 프레임은 지역에 대한 기준의 팔 엄지로 프로세서지만,그것은 의미할 수 있습니다.

나는 아무것도 찾을 수 없습니다 확실히 말한다 이것이 구현되는 GCC 지만,저는 이것을 생각하지 계산으로 증거는 당신은 모두 맞습니다.다시 한번 감사드립니다.

도움이 되었습니까?

해결책

거기에 아무것도 표준을 금지하는 그를 위해 C 또는 C++컴파일러,yes,컴파일러가 할 수 있습니다.

그것은 다른 대한 집합체(예:구조체)에 상대적 순서를 유지해야 하지만,여전히 컴파일러가 삽입할 수 있습니다 pad 바이트를 달성한 바람직한 정렬.

IIRC 최신 MSVC 컴파일러를 사용하는 자유에서 자신의 싸움에 대하여 버퍼 오버플로 지역 주민의.

주석으로,C++,파괴의 순서해야 합 역순으로 선언한 경우에도 컴파일러 제약 조건의 영향을 받지 않는 메모리 레이아웃이 있습니다.

(나는 할 수 없을 인용 장과 절,하지만,이에 메모리가 있습니다.)

다른 팁

할 수 있을 뿐만 아니라 컴파일러 순서를 스택의 레이아웃 지역 변수를 할당할 수 있는 그들을 레지스터에 할당을 살 때로는 레지스터에서 때로는 스택에 할당할 수 있는 두 개의 지역을 동일한 슬롯 메모리에(있다면 자신의 라이브 범위 중복되지 않)및 수 있도 완전히 제거하는 변수입니다.

스택해야 하지도 존재한(사실,C99 표준이 없는 단 하나의 발생 word"stack").그래서 그렇다면,컴파일러는 무료 무엇이든 할 그것은 원하는 만큼 보존하는 의미의 변수로 자동 저장 기간이 있습니다.

로 예를 들어:가 많은 시간은 상황할 수 있는 표시하지 않는 지역 변수에 디버거되었기 때문에 저장됩니다.

컴파일러를 무료로 제거하는 변수에서 쌓고 그것을 등록하는 경우에만 분석의 주소 변수이지/사용됩니다.

컴파일러지 않을 수도 있습도 사용할 스택에서 모두를 위한 데이터이다.당신 플랫폼에 그래서 작은 당신에 대해 걱정 8vs12 의 바이트 스택은,그것을 가능성이있을 것이라는 컴파일러는 아주 특화된 접근한다.(일부 그림과 8051 컴파일러는 마음에 와서)

어떤 프로세서는 당신이 컴파일하는가?

컴파일러를 위해,텍사스 인스트루먼트 62xx 시리즈의 DSP s 이 할 수 있으며,가 "모든 프로그램 최적화입니다." (당신이 그것을 해제 할 수 있습니다)

이것은 당신의 코드가 다시 정렬하지 않습니다.그래서 순서 실행되고 끝나지 않는 아주 당신이 무엇을 기대할 수 있습니다.

C 및 C++지 실제로 약속의 메모리 모형(의 의미에서 말하는 JVM),그래서 일을 매우 다를 수 있다고 여전히 법적입니다.

지 않는 사람들을 위해 그들을 알고,이 62xx 가족 8 명령 클럭 주기 DSP s;에 750mhz 의,그들이 하는 피크에서 6e+9 다.일요.그들이 하는 병렬로 실행하지만,지시문은행에서 컴파일러는,아 CPU,다음과 같 Intel x86.

그림과 토끼 임베디드보드지 스택을 당신에게 요청하지 않는 특히습니다.

그것은 컴파일러 특성,하나 만들 수 있습니다 자신의 컴파일러는 하 역하는 경우는 그것을 원하고하는 방법입니다.

괜찮은 컴파일러를 넣어 지역 변수에 등록하는 경우 그것을 할 수 있습니다.변수만 배치해야 합니다 스택에 있다면 과도한 등록압(충분한 공간이 아닌)는 경우 또는 변수의 주소는 촬영을 의미,필요한 라이브 메모리에 있습니다.

내가 알기로는 아무것도 없는 변수에 위치해 있는 어떤 특정 위치 또는 맞춤 스택에서는 C/C++;컴파일러를 넣어 것입니다 어디서나 최고의 성능을 위해 그리고/또 어떤 편리한 컴파일러 작가이다.

AFAIK 아무것도의 정의에서는 C 또는 C++는 방법을 지정하는 컴파일러를 주문해야 지역 변수에 스택입니다.내가 말할 것에 의존하는 것은 무엇을 컴파일 할 수 있 이 경우에는 것은 좋은 생각하기 때문에,다음 버전을 컴파일러의 수 있습니다.만약 당신이 시간을 보내고 노력하기 위해 귀하의 지역 변수를 저장을 몇 바이트 스택,그 몇 가지 바이 더 나은 정말 중요한의 기능에 대한 시스템입니다.

는 필요 없는 유휴 상태에 대한 추측은 무엇 C 표준을 요구하거나 요구하지 않:최근 초안은 자유롭게 사용할 수 있는 온라인에서 ANSI/ISO 작업 그룹.

이 질문에 대한 답변을 찾지 못하지만 여기에 제 2 센트에 대해 관련 문제...

을 가지고 있지 않았의 문제를 스택의 공간 최적화하지만 나의 문제는 잘못된 맞춤의 두 변수에 스택입니다.함수 호출할 수 있습에서 다른 기능과 스택은 포인터 값을 가질 수 있습 유엔 정렬 값입니다.그래서 나는 아이디어를 아래.이것은 원래 코드,내가 그것을 썼...

#pragma pack(push, 16)

typedef struct _S_speedy_struct{

 double fval[4];
 int64  lval[4];
 int32  ival[8];

}S_speedy_struct;

#pragma pack(pop)

int function(...)
{
  int i, t, rv;
  S_speedy_struct *ptr;
  char buff[112]; // sizeof(struct) + alignment

  // ugly , I know , but it works...
  t = (int)buff;
  t +=  15; // alignment - 1
  t &= -16; // alignment
  ptr = (S_speedy_struct *)t;

  // speedy code goes on...
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top