예외없이 C ++에 대한 실제 사례가 있습니까? [닫은]


40

에서 C ++을 통해 C를 사용하고, C ++ 이상 C 할 때? 성명서가 있습니다. 코드 크기 / C ++ 예외 :

Jerry는 (다른 점들 중에서) 대답합니다 .

(...) C ++로 정말 작은 실행 파일을 만드는 것이 더 어려운 경향이 있습니다. 정말 작은 시스템의 경우 어쨌든 많은 코드를 작성하는 경우는 거의 없으며 추가 (...)

내가 왜 그런지 물었을 때 Jerry는 다음과 같이 대답했습니다.

가장 중요한 것은 C ++에 예외 처리가 포함되어 있다는 것입니다.이 예외 처리는 (적어도 일반적으로) 실행 파일 크기에 최소값을 추가합니다. 대부분의 컴파일러는 예외 처리를 비활성화 할 수 있지만 결과가 더 이상 C ++이 아닙니다. (...)

기술적 인 실제 세계 수준에 대해서는 의심의 여지가 없습니다.


따라서 프로젝트가 C ++을 언어로 선택한 다음 예외를 사용하지 않도록 선택한 실제 사례 를 듣고 싶습니다 (순전히 호기심에서) . (사용자 코드에서 단순히 "사용하지 않음"예외가 아니라 예외를 던지거나 잡을 수 없도록 컴파일러에서 예외를 비활성화하십시오.) 왜 프로젝트가 그렇게하기로 선택했는지 (여전히 C가 아닌 C ++를 사용하지만 그렇지 않은가) 예외))-(기술적 인) 이유는 무엇입니까?


부록 : 해답을 자세히 설명하고자하는 사람들에게는 예외없는 의미가 어떻게 처리되는지 자세히 설명하는 것이 좋을 것입니다.

  • STL 콜렉션 ( vector, ...)이 올바르게 작동하지 않습니다 (할당 실패를보고 할 수 없음)
  • new 던질 수 없다
  • 생성자는 실패 할 수 없습니다

1
JSF C ++. 제트와 예외는 섞이지 않습니다.
Coder

1
예외 문제 (일반적으로 C ++)에 관한 일부 정보는 250bpm.com/blog:4
Ambroz Bizjak의

1
@AmbrozBizjak-DeadMG는 귀하가 링크 한 게시물에 대한 코멘트에서 DeadMG를 인용하겠습니다. quote : "예외를 이해하지 못하는 것으로 보입니다." 동의한다. 저자는 예외 처리를 엉망으로 만들었으며 그 게시물에서 그가 제시 한 예를 살펴 보았습니다.
Martin Ba

답변:


35

C ++에는 거의 모든 콘솔 게임이 있으며 오늘날에도 예외가 비활성화되어 있습니다. fac에서는 콘솔을 대상으로하는 C ++ 컴파일러의 기본 설정입니다. 때때로 일부 C ++ 기능은 다중 상속과 같은 컴파일러에서 올바르게 작동하지 않을 수도 있습니다 (예를 들어 잘 알려진 콘솔 기본 컴파일러에 대해 생각하고 있습니다).


또 다른 예는 C ++에서 예외가 활성화되지 않은 Arduino 하드웨어 SDK usnig gcc 및 STL이 제공되지 않은 것과 같은 것들 입니다.


좋은지 나쁜지에 대한 기술적 이유가 있습니다. 제 조언이 아니라 내가 들었던 이유는 다음과 같습니다.

  1. 대부분의 콘솔은 실제로 메모리 및 처리 시간이 제한된 임베디드 시스템입니다. 미래의 콘솔에서는 그렇지 않을 수도 있지만 현재 콘솔은 PC에 비해 여전히 제한적입니다. 일부 휴대용 콘솔은 스마트 폰 (예 : NDS)보다 프로그래밍하기가 어렵습니다. 예외 기능은 메모리를 사용하지 않더라도 메모리와 약간의 속도 비용을 추가합니다. PC에서도 마찬가지입니다.
  2. 콘솔의 비디오 게임이 충돌 할 수 없습니다. 충돌이나 막 다른 길을 막는 방법으로 테스트해야합니다. 그렇기 때문에 콘솔 제조업체는 게시 전에 게임을 철저히 확인하도록 요청합니다. 그것은 또한 예외 관리가 콘솔 게임의 경우 실제로 유용하지 않은 비용을 추가한다는 것을 의미합니다. 예를 들어 복구하는 방법이 있거나 문제를 이메일로 보내는 코드를 추가 할 수 있기 때문에 스마트 폰에서 더 좋습니다. 대부분의 콘솔과 같은 폐쇄 형 플랫폼에서는이를 허용하지 않습니다. 따라서 예외 시스템은 실제로 필요하지 않습니다. "정확하게 작동시켜야합니다". ;)
  3. 오류 및 충돌을 허용하지 않는 예외 관리는 오류 관리 전략을 구현해야 함을 의미합니다. 그러한 시스템은 누군가를 유용하게 만들기 위해 많은 시간을 할애 할 정도로 복잡 할 수 있습니다. 게임 개발자는 충돌에 유용하다고 생각되는 기능을 다루는 데 사치가 없습니다 ...
  4. 컴파일러는 허용하지 않습니다 (아직). 그렇습니다.

게임에서도 예외가 유용 할 수 있다고 생각하지만 콘솔 게임에서는 실제로 유용하지 않다는 것이 사실입니다.


최신 정보:

여기 또 다른 놀라운 예를 추가 해요 : LLVM / 연타 해달라고 사용 예외 따라와 이유도 RTTI :

코드 및 실행 파일 크기를 줄이기 위해 LLVM은 RTTI (예 : dynamic_cast <>) 또는 예외를 사용하지 않습니다. 이 두 가지 언어 기능은 "사용하는 것만 지불"이라는 일반적인 C ++ 원칙을 위반하여 코드 기반에서 예외를 사용하지 않거나 RTTI를 클래스에 사용하지 않은 경우에도 실행 부풀림을 유발합니다. 이 때문에 코드에서 전역 적으로 해제합니다.

LLVM은 isa <>, cast <> 및 dyn_cast <>와 같은 템플릿을 사용하는 RTTI의 수동 롤 형태를 광범위하게 사용합니다. 이 RTTI 형식은 옵트 인이며 모든 클래스에 추가 할 수 있습니다. 또한 dynamic_cast <>보다 훨씬 효율적입니다.

CLang은 컴파일 속도와 명시 적 오류는 물론 추적하기 쉬운 코드를 가진 희귀 컴파일러로도 유명합니다.


9
(3) : (2)와 함께 진행하든, 오류 관리 전략이 필요합니다. 문제가 발생하고 콘솔 소프트웨어가 부드럽고 정상적으로 실패해야합니다. 예외를 피하는 것이 전체적으로 더 쉬워진다는 것은 분명하지 않습니다.
David Thornley

6
오류가 올바르게 처리되고 "예외"이벤트가없는 엄격하게 제어 된 런타임 환경의 모든 훌륭한 예.
Patrick Hughes

1
@DavidThornley 콘솔 시스템이 어떤 종류의 오류를 관리한다고 가정하기 때문에 그렇지 않습니다. 아마도 PS3 또는 XBox에 있지만 콘솔 빌더의 테스트를 통과 할 수는 없습니다. 어쨌든, 대부분의 고급 콘솔의 펌웨어는 생각만큼 유연하지 않습니다. 콘솔 게임은 콘솔의 거의 모든 하드웨어에 액세스 할 수 있어야하므로 콘솔의 "OS"인 것처럼 콘솔에서 실행되는 게임에 대해 생각할 수 있습니다 ... 강력한 콘솔이 많을수록 덜 사실입니다. 어떤 경우에는 이상하게 보인다는 것에 동의합니다.
Klaim

2
이것은 좋은 대답입니다. 예외가 발생하여 사용자에게 오류가 발생하더라도 D- 패드로 무엇을해야한다고 덧붙이고 싶습니다. 최종 사용자를위한 유일한 실제 솔루션은 재시작입니다.
anon

2
팀의 누군가가 NO EXCEPTION이 "예외 사용 안함"을 의미하는 것이 아니라 "규칙에 예외 없음"을 의미한다고 말했기 때문에 어리석은 예를 제거했습니다. 참조 permalink.gmane.org/gmane.comp.lib.boost.devel/231377
Klaim

9

Jerry는 말했다 : ... 결과는 더 이상 C ++이 아니지만 내 은유 분명히 C ++ 이라는 것 입니다. 프로그램은 다른 형식, 규칙 및 서면 스타일을 사용하기 때문에 약간 다른 방언 입니다.

비활성화하는 주요 이유는 다음과 같습니다.

이진 호환성

언어와 번역 경계를 넘어서는 것은 보편적으로 잘 정의되지 않았거나 정의되지 않았습니다. 프로그램이 정의 된 동작의 도메인 내에서 작동하도록하려면 모듈 종료점에서 예외를 격리해야합니다.

실행 가능한 크기

다음은 내가 작성한 예외없는 프로그램의 이진 크기이며 예외가 있거나없는 상태에서 빌드되었습니다.

예외없이 :

  • 실행 파일 + 종속성 : 330
  • 제거 된 최종 실행 파일 (릴리스 빌드) : 37

예외 :

  • 실행 파일 + 종속성 : 380
  • 최종 제거 된 실행 파일 (릴리스 빌드) : 44

알림 : 이것은 던지기 / 캐치가없는 라이브러리와 프로그램의 모음입니다. 컴파일러 플래그 C ++ 표준 라이브러리에서 예외를 활성화합니다. 따라서이 예에서 실제 세계의 비용은 19 % 이상입니다.

컴파일러 : apple gcc4.2 + llvm. MB 단위의 크기입니다.

속도

"제로 비용 예외"라는 용어에도 불구하고 아무 것도 던지지 않더라도 여전히 약간의 오버 헤드가 추가됩니다. 위의 경우 성능이 중요한 프로그램 (신호 처리, 생성, 프리젠 테이션, 변환, 대규모 데이터 세트 / 신호 포함)입니다. 이 디자인에서 예외는 필수 기능이 아니지만 성능은 매우 중요합니다.

프로그램 정확성

이상한 이유처럼 보입니다. 던지기가 옵션이 아닌 경우 프로그램이 올바르게 실행되도록 클라이언트가 인터페이스를 올바르게 사용하도록 클라이언트가 비교적 엄격하고 정확하며 테스트를 거친 프로그램을 작성해야합니다. 오류 코드를 확인하지 않으면 UB가 필요합니다). 결과? 구현 품질이 크게 향상되고 문제가 빠르게 해결됩니다.

간단

예외 처리 구현은 종종 최신 상태로 유지되지 않습니다. 또한 구현에는 많은 수의 종료 시퀀스가있을 수 있으므로 많은 복잡성이 추가됩니다. 매우 복잡한 프로그램이 클라이언트에 의해 처리되고 처리되는 소규모의 잘 정의되고 유형이 지정된 종료 전략 세트를 사용하는 경우 매우 복잡한 프로그램을 읽고 유지하는 것이 더 간단합니다. 다른 경우, 구현은 시간이 지남에 따라 더 많은 던지기를 구현하거나 종속성으로 인해 발생할 수 있습니다. 고객은 이러한 모든 출구를 쉽고 적절하게 방어 할 수 없습니다. 많은 라이브러리를 작성하고 업데이트하는데, 진화와 개선이 빈번합니다. 예외 종료 시퀀스 (대규모 코드베이스에서)와 모두 일치하도록 유지하는 것은 시간을 잘 활용하지 못하고 많은 소음과 부스러기를 추가 할 수 있습니다. 프로그램 정확성이 향상되고 더 많은 테스트로 인해

역사 / 기존 코드

어떤 경우에는 역사적 이유로 소개되지 않았습니다. 기존 코드베이스는이를 사용하지 않았으며, 프로그램을 변경하면 수년이 걸릴 수 있으며 규칙과 구현이 겹치므로 유지 관리가 실제로 추악하게 만듭니다.

단점

물론, 단점은 다른 라이브러리와의 비 호환성 (이진 포함) 및이 모델에 맞게 많은 양의 프로그램을 구현해야한다는 사실입니다.


훌륭한 정보 +1! (단순 절에 동의하지는 않지만)
Martin Ba

실패 생성자가없고 할당을 처리하는 방법 (실패)이 있으면 흥미로울 것입니다.
Martin Ba

@Martin 1) 의견이 맞지 않습니다. 대부분의 개발자는 여러 가지 이유로 예외 비활성화에 동의하지 않습니다. 간단하게하기 위해 프로그램 정확성과 함께 진행됩니다. 문제 / 유효하지 않은 상태는 단순히 멀리 여행 할 수 없습니다. 즉, 실패를 확인하고 정상적으로 종료됩니다. jheriko의 게시물이이를 반영합니다.
저스틴

1
@Martin 2b) 할당은 조금 더 복잡합니다. 첫째, 힙 할당 수는 줄어들고 크기는 증가합니다. 비교적 적은 힙 할당이 시작됩니다. 둘째, 할당은 사용자 지정 할당자를 통과합니다. 할당 자에 대해 할당이 처음에 제공되지 않으면 (예 : mallocreturns 0), 할당자는 while (1)컨텍스트 스위치가있는에 들어가고 할당 을 다시 시도합니다. 이 코드베이스에서는 할당자를 통한 새로운 것이 0을 반환 할 수 있었지만 새로운 구현은 정상적으로 작동했습니다. (계속)
저스틴

2
예, 사용자 지정 할당 자 인터페이스에는 호환되는 stl 래퍼가 있습니다. 기술적으로 프로그램은 릴리스에서 중단되지 않습니다. 컨텍스트 스위치 (예 : 다른 스레드가 작동하여 희망적으로 일부 메모리를 비울 수 있음)를 도입하고 실패하면 다시 시도하고 기록합니다. 단위 테스트는 문제없이 며칠 동안 실행될 수 있습니다. 유일한 실제 위협은 방대한 양의 할당이며,이 중 많은 부분이 요청 전에 포착됩니다. 이 시점에서 시스템의 고장률도 레이더에 있습니다. 이러한 시나리오에서 핵심 구현 전에 실패 할 가능성이 있습니다.
저스틴

7

Google은 주로 역사적인 이유로 C ++ 스타일 가이드 에서 예외를 승인하지 않습니다 .

예외적으로 예외를 사용하면 특히 새 프로젝트에서 비용이 더 중요합니다. 그러나 기존 코드의 경우 예외를 도입하면 모든 종속 코드에 영향을 미칩니다. 예외가 새로운 프로젝트를 넘어 전파 될 수 있다면, 새로운 프로젝트를 기존의 예외없는 코드에 통합하는 것도 문제가됩니다. Google의 기존 C ++ 코드는 대부분 예외를 처리 할 준비가되어 있지 않으므로 예외를 생성하는 새 코드를 채택하는 것은 비교적 어렵습니다.

Google의 기존 코드가 예외를 허용하지 않기 때문에 예외 사용 비용은 새 프로젝트의 비용보다 다소 높습니다. 변환 프로세스가 느리고 오류가 발생하기 쉽습니다. 우리는 오류 코드 및 주장과 같은 예외에 대한 가능한 대안이 큰 부담을 초래한다고 생각하지 않습니다.

예외 사용에 대한 우리의 조언은 철학적 또는 도덕적 근거가 아니라 실용적인 것입니다. Google에서 오픈 소스 프로젝트를 사용하고 싶고 해당 프로젝트에서 예외를 사용하는 경우 어렵 기 때문에 Google 오픈 소스 프로젝트에서도 예외에 대해 조언해야합니다. 처음부터 다시해야한다면 상황이 다를 수 있습니다.

Windows 코드에 대해서는이 규칙에 예외가 있습니다.

(편집자의 강조)


5

Qt는 거의 예외를 사용하지 않습니다. Qt의 에러는 에러 코드와 신호로 표시됩니다. 공식적으로 언급 된 이유는 다음과 같습니다.

Qt가 시작될 때 Qt에서 지원해야하는 모든 컴파일러에 대해 예외를 사용할 수 없었습니다. 오늘날 우리는 API의 일관성을 유지하려고 노력하므로 예외를 사용하지 않은 기록이있는 모듈은 일반적으로 예외를 추가하여 새 코드를 얻지 못합니다.

QT는 왜 그렇게 적은 예외를 사용합니까?

오늘날 Qt에 대한 일반적인 비판은 예외 안전 이 완전하지 않다는 것입니다.


1
감사. 좋은 정보인데, 대부분의 QT 코드베이스에 컴파일러에서 예외가 활성화되어 있는지 궁금합니다.
Martin Ba

4

Symbian C ++ (일부 Nokia 휴대폰에서 사용)은 Symbian이 처음 개발 될 때 C ++ 컴파일러가 예외를 안정적으로 구현하지 않았기 때문에 예외를 직접 사용하지는 않습니다.


1
최신 버전의 Symbian에는 적용되지 않습니다. Symbian TRAP 및 잎은 실제 C ++ 예외로 구현 되지만 EPOC32 및 이전 버전의 Symbian은 다른 수단 (정확히 기억하면 setjmp / longjmp)에 의존했습니다.
otto

1
@OttoHarju : 그것이 "적어도 직접적이지 않다"는 의미입니다.
Keith Thompson

3

나는 예외를 사용하지 않는다. 여기에는 여러 가지 이유가 있지만 두 가지 주된 이유는 강력한 코드를 생성하기 위해 필요하지 않았으며 런타임시 성능을 저하시키기 때문입니다.

나는 예외를 사용하고 비활성화하는 프로덕션 코드를 연구했습니다. 예외를 허용하는 코드는 균일하게 나빴습니다. 어떤 곳에서는 오류 처리가 아닌 진정한 흐름 제어에 예외가 사용되어 매우 무겁고 성능이 떨어지며 디버깅하기가 어렵습니다. 일반적으로 예외로 채워진 코드의 디버깅 문제는 예외가없는 코드에서보다 더 어려웠습니다. 부분적으로는 예외 메커니즘의 스택 및 본질적인 어려움으로 인한 것이지만, 그보다 더 큰 것은 게으른 코드 때문이었습니다. 예외 처리가 가능한 결과.

예외 자체에는 심각한 문제가 없습니다 / 성능에 신경 쓰지 않고 무언가를 올바르게 할 시간이 없다면 오류 처리를위한 언어 기능이며 적절한 오류 처리 메커니즘을 대체 할 수 있습니다. 그러나 자신의 논리와 같이 오류를 처리하는 방법은 거의 항상 / 더 나은 방법이 있습니다 (이를 자세히 설명하기는 거의 상식입니다). 오류가 아니라 라이브러리 (예 : 표준 라이브러리)에서 온 경우 예외 선택을 존중하거나 충돌이 발생해야하지만 항상 그 선택에 의문을 제기합니다. 예외가 실제로 최상의 솔루션 인 상황을 본 적이 없습니다.

어설 션은 더 디버깅 가능하고, 오류 코드는 덜 무겁습니다. 두 개 사이를 올바르게 사용하면 코드를보다 쉽게 ​​읽고, 디버그하고, 유지할 수 있습니다. 모든 라운드에서 승리합니다 ...


1
아니. 예외를 오용하는 것이 더 쉽지만 그 예외 이외의 것이 잘 작동합니다. 모든 기능이 예외적으로 안전하다면 (이것은 일반적으로 모든 리소스에 RTTI를 사용하는 것입니다) 어쨌든 추론하기가 쉽습니다. 오류 코드를 올바르게 작성하는 것은 매우 지루할 수 있으며 프로그램을 오류 처리 코드 더미에 묻을 수 있습니다. 이 경우 예외가 더 좋습니다. 내가 당신과 다르게 행동하는 것은 내가 일을 올바르게하는 것에 관심이 없다는 결정적인 증거는 아닙니다.
David Thornley

RTTI가 나쁜 이유는 다른 모든 이야기입니다-RTTI가 필요한 경우 내가 본 모든 컴파일러의 내장 RTTI는 사소한 일입니다. RTTI 및 예외와 같은 상황은 RAD 및 엔터프라이즈 응용 프로그램에 적합 할 수 있습니다. 고성능 (예 : 게임) 컴퓨팅 세계에서는 그 어떤 것도 없습니다. 나는 그들이 꺼질 수있는 어떤 목표로든 어느 하나를 사용하는 생산 게임 엔진을 본 적이 없다.
jheriko

2
죄송합니다. RAII가 제 뜻입니다. 당신이 그것을 사용하지 않는다면, 예외 만이 엉망이 될 것입니다. (그러나 역동적 인 캐스트는 내 작품에서 매우 잘 작동하며 성능과 관련이 있습니다.)
David Thornley

흥미로운 주제 : 예외가 더 간결한 오류 처리 코딩을 허용하지만 오류 코드는 로컬에서 오류를 처리 할 수 ​​있기 때문에 오류 코드가 더 강력하다고 생각합니다 (예외가 호출 스택을 잡기 전에 예외를 호출 할 수 있지만 호출자에서 즉시 반환 코드를 확인할 수 있음) 그리고 때로는 잡히지 않아 충돌이 발생합니다.
Giorgio

3

Bjarne 등 의 Joint Strike Fighter C ++ 코딩 표준 에서. 또한 전투기의 실시간 요구 사항으로 인해 예외가 금지됩니다.

JSF ++는 어려운 실시간 안전에 중요한 응용 프로그램 (비행 제어 소프트웨어)을위한 것입니다. 계산이 너무 오래 걸리면 누군가 죽을 수 있습니다. 이러한 이유로 우리는 응답 시간을 보장해야하며 현재 수준의 공구 지원으로 예외를 위해 그렇게 할 수는 없습니다. 이러한 맥락에서, 무료 매장 할당조차 금지됩니다! 실제로, 오류 처리에 대한 JSF ++ 권장 사항은 올바른 작업을 수행 할 수있는 도구 (예 : 예외 사용)가있을 것으로 예상되는 예외 사용을 시뮬레이션합니다.

Bjarne의 C ++ FAQ 에서 인용했습니다 .

C ++은 아마도 모든 언어의 가장 광범위한 소프트웨어를 실행할 것입니다 ...


JSF ++는 또한 "new"(배치 new 이외) 및 "delete"사용을 금지합니다. "예외없는 새로운 실패를 어떻게 처리합니까?"에 대한 답은 다음과
같습니다

@armb : 그렇습니다. "그러한 맥락에서 무료 매장 할당도 금지됩니다!" 위.
Macke

2

C ++ 라이브러리 디자인에서 중요합니다. 종종 C 인터페이스를 사용하면 타사 라이브러리에서 클라이언트에게 예외를 던지는 것이 불쾌합니다. 라이브러리가 던져지면 던지기 보장이 없다는 것을 감안할 때 라이브러리를 사용했을 클라이언트 세트를 잘라 내고 있다고 지적하십시오.

개인적으로 나는 끔찍한 일이 발생할 때마다 팀이 "예외를 던지다"라고 말했을 때 예외가 남용되는 것을 보았다. 물론 여기에 오류가 있습니다. 누군가가 무엇을 해야할지 알아 내기 전에 코드에서 예외가 발생했습니다. 이 프로젝트는 때때로 깊게 던져 질 때 약간의 충돌을 일으켰습니다.


1

아마도 이와 관련하여 Embedded C ++에 대해 언급 할 가치가 있습니다. 임베디드 C ++는 임베디드 시스템을 위해 설계된 C ++의 변형입니다. 기본적으로 템플릿, 네임 스페이스 및 예외 처리가 제거 된 C ++의 적절한 하위 집합입니다.

EC ++이 새로워 졌을 때 약간의 스플래시가 있었지만 대부분 조용한 것으로 보였습니다. 사람들이 관심을 잃었는지, 또는 그들의 첫 시도가 너무 완벽해서 10 년 정도 엉망이 될만한 이유를 본 사람이 없는지 잘 모르겠습니다.<closed captioning for the humor impaired>Yeah, right!</closed captioning>


Q & A ( caravan.net/ec2plus/question.html)를 보면 거의 죽었다고 말할 수 있습니다.
Martin Ba

1

좋은 예는 커널 모드 프로그래밍입니다.

더 깨끗한 코드를 위해 C ++을 사용할 수 있지만 예외는 없습니다. 그것들을위한 런타임 라이브러리가 없으며 예외 처리가 커널에서 매우 제한된 스택 메모리를 사용합니다 (Windows NT 커널에서 C ++ 예외를 실험했으며 예외 던지기 및 풀기 사용 ​​가능 스택의 절반을 먹습니다-스택 오버플로를 얻는 것이 매우 쉽습니다) 그리고 전체 시스템을 충돌시킵니다).

일반적으로 자신 newdelete연산자 를 정의합니다 . 또한 매우 편리한 a placement new및 c ++ 11 rvalue 참조를 발견했습니다. 예외에 의존하는 STL 또는 다른 C ++ 사용자 모드 라이브러리는 사용할 수 없습니다.


0

실행 가능한 메모리를 유지하려고 할 때. 일반적으로 임베디드 (또는 모바일) 시스템에서 수행됩니다. 데스크톱 응용 프로그램의 경우 서버에서는 필요하지 않지만 웹 서버 또는 SQL에 대해 가능한 한 많은 램을 원한다면 고려 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.