IT TIP

"-fno-exceptions"를 사용하면 "new T"는 어떻게됩니까?

itqueen 2020. 12. 30. 19:59
반응형

"-fno-exceptions"를 사용하면 "new T"는 어떻게됩니까?


예외 처리를 비활성화 하는 옵션을 사용 하여 프로그램을 컴파일 하면 new T여전히 throw 됩니까?bad_alloc-fno-exceptions

또는 컴파일러 (GCC와 연타 지원 옵션 있음) 암시 적으로 사용 변환됩니다 new T에를 new (nothrow) T?


-fno-exceptions에 대한 모든 특전에 대한 확실한 답을 줄 수는 없습니다. 32 비트 리눅스 머신, gcc 4.5.1에 ​​대한 관찰 만 있습니다.-bad_alloc은 -fno-exceptions

[21:38:35 1 ~/tmp] $ cat bad_alloc.cpp

int main()
{
    char* c = new char[4000000000U];
}
[21:38:58 1 ~/tmp] $ g++ bad_alloc.cpp
[21:39:06 1 ~/tmp] $ ./a.out
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted
[21:39:07 1 ~/tmp] $ g++ -fno-exceptions bad_alloc.cpp
[21:39:16 1 ~/tmp] $ ./a.out
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted

내가 이해하는 방식 operator new은 libstdc ++에 의해 정의됩니다. 이제를 사용하여 자신의 코드를 컴파일 -fno-exceptions하면 예외를 포착 할 수 없지만 예외를 발생시키는 일반 버전의 libstdc ++에 대한 링크는 계속됩니다.

그래서 그래, new T심지어 함께 예외가 발생합니다 -fno-exception.

그러나 libstdc ++도 함께 컴파일하면 -fno-exception상황이 달라집니다. 이제 new T예외를 던질 수는 없지만 libstdc ++ 설명서를 읽으면 abort()대신 호출 합니다.

new T실패시 NULL을 반환 하려는 경우 유일한 방법은 명시 적으로 지정하는 것입니다 nothrow...


확실한 답은 아니지만 GCC 매뉴얼 ( "없이하기"섹션 참조)에는 다음과 같은 내용이 있습니다.

에 대한 라이브러리 지원을 자세히 설명하기 전에 먼저이 -fno-exceptions플래그를 사용할 때 잃어버린 사항에 대한 참고 사항이 있습니다. -fno-exceptions코드에 try 또는 catch 구문이 있는지 여부 와 함께 컴파일 된 코드를 통과하려는 예외가 중단됩니다 . 던지는 코드가있을 수있는 경우 -fno-exceptions.

내가 읽은 방식 new으로 완전히 안전 하기 위해 nothrow 버전을 명시 적으로 요청해야 할 수도 있습니다 .


많은 예외 처리 시스템에서 루틴 "foo"가 "bar"를 호출하여 차례로 "moo"를 호출하고 "moo"가 예외를 발생시키는 경우 예외가 "foo"로 명확하게 되돌릴 수있는 유일한 방법은 " bar "에는 예외를 처리하는 코드가 있습니다. "bar"가 예외가 잡히지 않게 전파되도록 할지라도, 일반적으로 실행이 범위를 벗어나도록 허용되기 전에 해당 지역 변수가 제대로 삭제되었는지 확인해야합니다. "bar"에 추가 코드를 추가해야합니다. 대부분의 시스템에서 예외가 발생하지 않더라도 일부 코드는 실행되어야합니다.

BTW, Cortex M3와 같은 일부 ARM 프로세서 또는 ARM 모드에서 실행되는 Arm7과 같이 호출자가 ARM 모드에서 실행될 경우 "보통"을 사용하여 실행 시간 비용없이 예외를 허용 할 수 있습니다. 서브 루틴 리턴은 LR + 4 (일반 리턴 주소를 넘어서 4 바이트)로 이동하고 예외적 인 종료가 LR (4 바이트 분기 명령어가 됨)로 이동합니다. 하지만 이러한 동작은 ARM의 일반적인 관행에 반하는 것이며 이러한 설계는 Cortex M0에 제대로 이식되지 않을 것입니다.

참조 URL : https://stackoverflow.com/questions/6049563/with-fno-exceptions-what-happens-with-new-t

반응형