문제

에서 여러 현대적 프로그래밍 언어(를 포함하여 C++,Java,C#),the 언어 정수 오버플로우 에서 발생할 런타임을 제기하지 않고 어떠한 종류의 오류 상태입니다.

예를 들어,이것을 고려하십시오(고안)C#방법,하지 않는 계정의 가능성에 대한 오버플로우/언더.(에 대한 간결하고,방법 또한 처리하지 않는 경우 지정한 목록은 null 참조.)

//Returns the sum of the values in the specified list.
private static int sumList(List<int> list)
{
    int sum = 0;
    foreach (int listItem in list)
    {
        sum += listItem;
    }
    return sum;
}

는 경우 이 메소드가 호출을 다음과 같:

List<int> list = new List<int>();
list.Add(2000000000);
list.Add(2000000000);
int sum = sumList(list);

오버플로우에 발생할 sumList() 방법(기 int 형식은 C#32-bit signed integer,그리고 합의 목록에 있는 값의 값을 초과하는 최대 32-bit signed integer).Sum 변수의 값 -294967296(헤어드라이어도 마련되어의 4000000000);이 가능성이 높은(가)의 개발자 sumList 방법을 것입니다.

물론,다양한 기술을 사용할 수 있는 개발자에 의해 가능성을 피하기 위해 정수 오버플로우 등의 형식을 사용하여 다음과 같 Java BigInteger, 나 checked 키워드 /checked 컴파일러 스위치 C#.

그러나 문제는 내가 관심이 왜 이러한 언어하도록 설계되었는 기본적으로 허용한 정수로서 오버플로우에서 일어나는 첫 번째 장소,대신에,예를 들어,예외를 발생시키는 때에는 작업이 수행 런타임 시에는 것이 결과에서 오버플로우가 발생합니다.그것은 같은 동작을 것을 방지하는 데 도움이 버그가 있는 경우에는 개발자를 무시하는 계정의 가능성을 할 때 오버 플로우 쓰기 코드를 수행하는 연산할 수 있는 오버플로우가 발생합니다.(이러한 언어 있을 수 있었 뭔가 포함 같이"확인되지 않은"키워드를 수정한 블록 정수 오버플로우가 허용없이 발생하는 경우를 제외하고는 제기,이러한 경우에는 동작은 명시적으로 용도에 의해 개발자;C#제 이러.)

가 대답은 단순히 끓인 성능-언어 디자이너가 원하지 않았다 그들의 각각의 언어에 기본값으로는"slow"산술 정수 작업의 경우 런타임이 필요하 별도의 작업을 수행하는지 여부를 확인하려면 오버플로우가 발생한 모든 적용 가능한산업이 성을 고려 무거운 값을 피하"침묵하는"실패한 경우 실수로 오버플로우 발생합니다?

은 거기에 대한 다른 이유는 이어 디자인 결정뿐만 아니라,다른 것보다 성능이 고려 사항

도움이 되었습니까?

해결책

C#,그것은 질문입니다.특히,out-of-box 벤치마킹하고 있습니다.

경 C#새로운,Microsoft 고 많은 C++개발자들로 전환합니다.그들이 알고 있는 많은 C++사람들의 생각 C++으로는 빠르고,특히 보다 빠른 언어로된 시간에 자동적인 메모리 관리 및니다.

모두는 잠재 얼리 어답터와 잡지자 가능성이 있는 사본을 얻을 수있는 새로운 C#,설치,구축한 응용이 없는 한 것이라 쓰기에서,현실 세계에서 실행하는 루프 및 측정하는 데 걸린 시간.그들은 결정을 위해 자신의 회사 또는 게시한 문서에 따라 결과입니다.

사실 그들의 시험을 보였 C#보다 느린 기본적으로 컴파일된 C++는 종류의 것은 사람을 해제하는 C#다.는 사실이 당신의 C#응용 프로그램를 위한 가치를 창출하지 오버플로우/언더는 자동으로는 종류의 것들 수 있습니다.그래서,그것은 기본적으로 해제됩니다.

나는 분명 생각하는 시간의 99%리/을 확인할 수 있습니다.그것은 불행한 타협이다.

다른 팁

내가 생각하는 성능이 아주 좋은 이유입니다.고려하는 경우 모든 지시에 전형적인 프로그램으로 증가하는 정수한 경우 대신에의 간단한 op1 개를 추가로,그것을 모든 시간을 확인하는 경우 추가 1 오버플로우 유형,다음에서 비용이 추가 사이클 것 꽤 심각합니다.

당신이 일을 가정에서는 정수 오버플로 항상 원하지 않는 행동입니다.

때로는 정수 오버플로우가 원하는 동작입니다.중 하나를 들어 본 적은 표현의 절대적인 제목의 값으로 고정 점 번호입니다.주 unsigned int,0 0 나는 360 도,최대 32bit unsigned integer(0xffffffff)은 가장 큰 값 아래 360 도입니다.

int main()
{
    uint32_t shipsHeadingInDegrees= 0;

    // Rotate by a bunch of degrees
    shipsHeadingInDegrees += 0x80000000; // 180 degrees
    shipsHeadingInDegrees += 0x80000000; // another 180 degrees, overflows 
    shipsHeadingInDegrees += 0x80000000; // another 180 degrees

    // Ships heading now will be 180 degrees
    cout << "Ships Heading Is" << (double(shipsHeadingInDegrees) / double(0xffffffff)) * 360.0 << std::endl;

}

아마 다른 상황이 어디서 오버플로우가 허용,이와 유사한 예입니다.

C/C++지 않 위임랩니다.심지어는 명백한 부문은 0 으로 정의되지 않은 행동에서는 C++,지 않은 지정된 종류의 함정입니다.

C 언어 있지 않는 모든 개념을 포획하지 않는 한 당신이 계산 신호가 있습니다.

C++디자인 원리는 그렇지 않을 소개하는 오버헤드에 존재하지 않 C 지 않는 한 당신이 그것을 부탁드립니다.그래서 표시하지 않았고 싶어하는 위임하는 정수에서 동작하는 방법을 요구하는 모든 명시적 검사입니다.

초기의 어떤 컴파일러 및 라 구현에 대한 제한 하드웨어를 지원하지 않는 예외에서 모두 예외가 될 수 있 장애인과 함께 컴파일러 옵션이 있습니다.명령에 대한 예외의 언어에 내장 된 기능은 문제가 될 것입니다.

심지어는 경우 C++로 만들었다 정수 확인,99%프로그래머의 초기에 접하고 있는지 모르겠습니다면에 대한 성과를 향상...

기 때문에 체크에 대한 오버플로우 시간이 걸립니다.각각의 원시적인 수학적 운영,일반적으로 번역으로 하나의 어셈블리는 명령을 포함해야 확인에 대한 오버플로우에 따른 어셈블리의 지침서 잠재적으로는 프로그램은 여러 번 느립니다.

가능성 99%성과입니다.에 86 것을 확인하는 오버플로우 플래그에서 모든 작업을 하는 것은 큰 성능했다.

다른 1%을 덮을 것이고 이러한 경우는 사람들이 멋진 비 조작 또는'정확하지 않'혼합에 서명하고 서명되지 않은 운영하고 오버플로우 의미입니다.

호환성은 큰 하나입니다.C 것으로 가정하였 당신이 지불하는 충분한 관심의 크기 데이터 형식으면 오버/저류가 발생한,그는 당신이 무엇을 원했다.다음 C++,C#,Java 와 매우 작은 변화가 어떻게"내에"데이터 형식했다.

내가 오류가 발생하지 않습니다 기본적으로 런타임으로 귀결의 유산을하고자하는 생성 프로그래밍 언어의 산성 같은 동작입니다.특히,신조는 아무것도는 당신은 코드 그것을 할(또는 코드)로 할 것,(거나 하지 않습니다).지 않았다면 코드에 오류 처리기,기계"가"의 미덕으로 오류 처리기,당신이 정말 하고 싶은 말도,충돌이 발생하기 쉬운 것은 말하고 있는지 확인하여 주십시오.

(산 참고: http://en.wikipedia.org/wiki/ACID)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top