스택 메모리가 사용되지 않을 때 할당되는 이유는 무엇입니까?

Dr.

다음 예를 고려하십시오.

struct vector {
    int  size() const;
    bool empty() const;
};

bool vector::empty() const
{
    return size() == 0;
}

다음에 대해 생성 된 어셈블리 코드 vector::empty(clang 별, 최적화 포함) :

push    rax
call    vector::size() const
test    eax, eax
sete    al
pop     rcx
ret

스택 공간을 할당하는 이유는 무엇입니까? 전혀 사용되지 않습니다. pushpop생략 할 수있다. 최적화 된 MSVC 및 gcc 빌드도이 기능에 스택 공간을 사용 하므로 ( godbolt 참조 ) 이유가 있어야합니다.

게자

스택 공간을 할당하므로 스택은 16 바이트로 정렬됩니다. 반환 주소는 8 바이트를 차지하므로 스택을 16 바이트 정렬 상태로 유지하려면 추가 8 바이트 공간이 필요합니다.

일부 컴파일러의 경우 명령 줄 인수를 사용하여 스택 프레임의 정렬을 구성 할 수 있습니다.

  • MSVC : 문서에 따르면 스택은 항상 16 바이트로 정렬됩니다. 명령 줄 인수 는이를 변경할 수 없습니다 . godbolt 예제는 rsp함수 시작 부분 에서 40 바이트를 빼는 것을 보여줍니다. 즉 , 다른 것이 이것에도 영향을 미친다는 것을 의미합니다.
  • clang :이 -mstack-alignment옵션은 스택 정렬을 지정합니다. 문서화되지는 않았지만 기본값은 16 인 것 같습니다. 8로 설정 하면 생성 된 어셈블리 코드에서 스택 할당 ( pushpop)이 사라집니다.
  • gcc :이 -mpreferred-stack-boundary옵션은 스택 정렬을 지정합니다. 주어진 값이 N이면 2 ^ N 바이트 정렬을 의미합니다. 기본값은 4이며 16 바이트를 의미합니다. 3 (예 : 8 바이트)으로 설정하면 스택 할당 ( subaddfor rsp)이 생성 된 어셈블리 코드에서 사라집니다.

godbolt에서 확인하십시오 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

할당을 사용할 때 스택 변수에 대해 소멸자가 호출되지 않는 이유는 무엇입니까?

분류에서Dev

@Binding을 사용할 때 텍스트가 업데이트되지 않는 이유는 무엇입니까?

분류에서Dev

공유 메모리에서 사용할 때 이름이 지정되지 않은 세마포가 변경되지 않는 이유는 무엇입니까?

분류에서Dev

메모리가 할당되지 않는 이유는 무엇입니까?

분류에서Dev

react를 사용하여 선택 메뉴에서 옵션을 선택할 때 secondMenu 변수가 업데이트되지 않는 이유는 무엇입니까?

분류에서Dev

여유 메모리가 디스크 캐시로 사용되지 않는 이유는 무엇입니까?

분류에서Dev

허용되지 않는 여러 prop 값을 사용할 때 React propTypes의 Jest 테스트가 중단되는 이유는 무엇입니까?

분류에서Dev

삭제를 취소 할 때 체크 박스가 선택 해제되지 않는 이유는 무엇입니까?

분류에서Dev

이 쿠키가 할당되었을 때 값을 변경하지 않는 이유는 무엇입니까?

분류에서Dev

스크립트에서 MenuItem을 사용할 때 메뉴 항목의 우선 순위를 변경할 때 변경되지 않는 이유는 무엇입니까?

분류에서Dev

setTimeout 메서드를 사용할 때 변수가 유지되지 않는 이유는 무엇입니까?

분류에서Dev

순서가 지정되지 않은 목록에 상대 위치 값을 사용할 때 가로로 스크롤 할 수있는 이유는 무엇입니까?

분류에서Dev

Nuget을 사용하여 추가 할 때 Xamarin.Android 프로젝트에서 TinyIoC가 선택되지 않는 이유는 무엇입니까?

분류에서Dev

사용자 정의보기 속성을 통해 스타일을 전달할 때 텍스트가 굵게 표시되지 않는 이유는 무엇입니까?

분류에서Dev

fstab을 사용할 때 / dev / sdxy가 권장되지 않는 이유는 무엇입니까?

분류에서Dev

ArrayList가 재 할당 할 때 Java 변수가 무효화되지 않는 이유는 무엇입니까?

분류에서Dev

포인터 (C ++)를 사용할 때 초기화되지 않은 힙 메모리 오류가 발생하는 이유는 무엇입니까?

분류에서Dev

'async'모듈을 사용하지 않을 때만 결과가 반환되는 이유는 무엇입니까?

분류에서Dev

ngModel. $ setValidity를 사용할 때 오류가 모델로 변환되지 않는 이유는 무엇입니까?

분류에서Dev

CSS를 사용할 때 페이지가로드되지 않는 이유는 무엇입니까?

분류에서Dev

Replace 메서드를 사용할 때 문자열이 대체되지 않는 이유는 무엇입니까?

분류에서Dev

! = 연산자를 사용할 때 Google Analytics가 분할되지 않는 이유는 무엇입니까?

분류에서Dev

부트 스트랩을 사용할 때 카드가 응답하지 않는 이유는 무엇입니까?

분류에서Dev

메모리가 어레이에 할당되지 않은 이유는 무엇입니까?

분류에서Dev

스왑이 거의 사용되지 않을 때 OOM 킬러가 프로세스를 죽이는 이유는 무엇입니까?

분류에서Dev

std :: string :: operator []를 사용할 때 자동 변수가 참조가되지 않는 이유는 무엇입니까?

분류에서Dev

xpath가 'not'을 사용할 때 빈 클래스가있는 요소를 선택하지 않는 이유는 무엇입니까?

분류에서Dev

조각을 재사용 할 때 이벤트 리스너가 사라지는 이유는 무엇입니까?

분류에서Dev

while 루프를 사용할 때 외부 변수가 변경되지 않는 이유는 무엇입니까?

Related 관련 기사

  1. 1

    할당을 사용할 때 스택 변수에 대해 소멸자가 호출되지 않는 이유는 무엇입니까?

  2. 2

    @Binding을 사용할 때 텍스트가 업데이트되지 않는 이유는 무엇입니까?

  3. 3

    공유 메모리에서 사용할 때 이름이 지정되지 않은 세마포가 변경되지 않는 이유는 무엇입니까?

  4. 4

    메모리가 할당되지 않는 이유는 무엇입니까?

  5. 5

    react를 사용하여 선택 메뉴에서 옵션을 선택할 때 secondMenu 변수가 업데이트되지 않는 이유는 무엇입니까?

  6. 6

    여유 메모리가 디스크 캐시로 사용되지 않는 이유는 무엇입니까?

  7. 7

    허용되지 않는 여러 prop 값을 사용할 때 React propTypes의 Jest 테스트가 중단되는 이유는 무엇입니까?

  8. 8

    삭제를 취소 할 때 체크 박스가 선택 해제되지 않는 이유는 무엇입니까?

  9. 9

    이 쿠키가 할당되었을 때 값을 변경하지 않는 이유는 무엇입니까?

  10. 10

    스크립트에서 MenuItem을 사용할 때 메뉴 항목의 우선 순위를 변경할 때 변경되지 않는 이유는 무엇입니까?

  11. 11

    setTimeout 메서드를 사용할 때 변수가 유지되지 않는 이유는 무엇입니까?

  12. 12

    순서가 지정되지 않은 목록에 상대 위치 값을 사용할 때 가로로 스크롤 할 수있는 이유는 무엇입니까?

  13. 13

    Nuget을 사용하여 추가 할 때 Xamarin.Android 프로젝트에서 TinyIoC가 선택되지 않는 이유는 무엇입니까?

  14. 14

    사용자 정의보기 속성을 통해 스타일을 전달할 때 텍스트가 굵게 표시되지 않는 이유는 무엇입니까?

  15. 15

    fstab을 사용할 때 / dev / sdxy가 권장되지 않는 이유는 무엇입니까?

  16. 16

    ArrayList가 재 할당 할 때 Java 변수가 무효화되지 않는 이유는 무엇입니까?

  17. 17

    포인터 (C ++)를 사용할 때 초기화되지 않은 힙 메모리 오류가 발생하는 이유는 무엇입니까?

  18. 18

    'async'모듈을 사용하지 않을 때만 결과가 반환되는 이유는 무엇입니까?

  19. 19

    ngModel. $ setValidity를 사용할 때 오류가 모델로 변환되지 않는 이유는 무엇입니까?

  20. 20

    CSS를 사용할 때 페이지가로드되지 않는 이유는 무엇입니까?

  21. 21

    Replace 메서드를 사용할 때 문자열이 대체되지 않는 이유는 무엇입니까?

  22. 22

    ! = 연산자를 사용할 때 Google Analytics가 분할되지 않는 이유는 무엇입니까?

  23. 23

    부트 스트랩을 사용할 때 카드가 응답하지 않는 이유는 무엇입니까?

  24. 24

    메모리가 어레이에 할당되지 않은 이유는 무엇입니까?

  25. 25

    스왑이 거의 사용되지 않을 때 OOM 킬러가 프로세스를 죽이는 이유는 무엇입니까?

  26. 26

    std :: string :: operator []를 사용할 때 자동 변수가 참조가되지 않는 이유는 무엇입니까?

  27. 27

    xpath가 'not'을 사용할 때 빈 클래스가있는 요소를 선택하지 않는 이유는 무엇입니까?

  28. 28

    조각을 재사용 할 때 이벤트 리스너가 사라지는 이유는 무엇입니까?

  29. 29

    while 루프를 사용할 때 외부 변수가 변경되지 않는 이유는 무엇입니까?

뜨겁다태그

보관