C/C++ 표준은 구문 및 문법과 같은 언어 요소의 사양을 정의하지만 연산자 또는 문을 구현하는 방법을 엄격하게 나타내지는 않습니다. 모든 소프트웨어 제조업체는 C/C++ 표준에 맞는 모든 구현을 자유롭게 사용할 수 있습니다. 그러나 구현은 런타임에 프로그램을 실행하는 성능과 밀접한 관련이 있습니다. C/C++[1]의 스위치 문에 대해 알지 못하는 이전 기사에서는 어셈블리 출력을 사용하여 C/C++ 스위치 문 동작 및 효율성을 분석하는 예제를 제공합니다. ELF 헤더 또는 섹션 헤더 테이블에 포함되지 않는 모든 다시 사용 가능한 파일의 정보는 해당 섹션 내에 있습니다. 섹션에는 재배치 가능한 파일을 다른 ELF 파일과 결합하여 공유 개체 파일 또는 실행 파일을 생성하는 데 필요한 대부분의 정보가 포함되어 있습니다. 단면에는 결합할 재질도 포함되어 있습니다. 예를 들어, 섹션은 보유할 수 있습니다: 결합된 C/어셈블리 목록을 파일 foo.lst로 출력합니다. 주: RNA-Seq 어셈블리에 사용되는 QNG 어셈블러는 대상 피쳐 영역의 WIGGLE 파일만 내보내도록 설계되었습니다(즉, 피크 를 측정하는 데 실제로 사용되는 커버리지). 인트론 및 번역되지 않은 영역은 포함되지 않습니다. 이 때문에 SeqMan NGen 어셈블리 중에 출력되는 WIGGLE 파일이 SeqMan Pro를 사용하여 시각적으로 발견된 사이트 수와 일치하지 않을 수 있습니다. 의심의 여지가, 이것은 어셈블리 언어 프로그래밍에서 논리를 단순화하는 방법을 이해하는 좋은 예가 될 수 있습니다. 솔직히 말해서,이 어셈블리 코드 개선 함수 ArraySearch()에서 직접 최적화의 작은 부분일 수 있습니다.
실제로 main()의 호출자와 같은 다른 코드도 효율성을 위해 기여해야 합니다. 출력에서 & 연산자가 k=2, 즉 k= i-j를 만드는 것을 볼 수 있습니다. 즉, 연산자는 단락을 사용하지 않고 두 식의 전체 고도를 수행하며 왼쪽 i-5도 0이며 오른쪽 k=i-j는 여전히 실행됩니다. 다음 코드는 세부 정보를 노출합니다: 예를 들어, some_function() 에서 원래 return 42; 66 및 67 을 생성: 값을 eax로 이동하고 반환합니다. 그러나 *= 5; 코드를 생성하지 않습니다. 최적화되었습니다. 그럼에도 불구하고 C 코드의 원래 주석이 목록에 포함됩니다. 차이점은 뭔가요? 잠시 붙어 있을 수 있습니다. 출력은 다음과 같습니다: 이 문서에서는 Visual Studio에서 생성된 어셈블리 출력을 분석하여 Visual C++의 일부 C/C++ 연산자 및 코드 조각에 대해 설명합니다. 먼저 비트 와이즈와 논리 및 연산자 간의 개념적 차이를 이해하는 방법을 보여 드리겠습니다. 두 번째는 왼쪽 비트 시프트 <<와 오른쪽 시프트 연산자를 위한 특정 샘플로 디버그 및 릴리스 빌드에서 다르게 구현되는 방식을 확인할 수 있습니다.
셋째, 최적화의 주제로 서식에서 순차적 검색 테스트를 보여 드리므로 디버그 버전이 디버그 버전보다 얼마나 효율적인지 보여주는 벤치마크를 설정합니다. 이제 비트 와이즈 연산자 간에 유사한 비교를 할 수 있습니다 | 논리적입니다 .|. 이 예제 참조: C 연산자, 루프 및 함수와 인터페이스된 어셈블리 언어 구현의 기타 기능에 대해 이야기했습니다. 이러한 예제를 이해하려면 실제로 x86 지침 및 MASM 사양에 대한 많은 배경 지식이 필요합니다. 어셈블러 코드 목록을 자세히 조사하여 런타임시 몇 가지 흥미로운 C /C ++ 코드 동작을 노출했습니다. Visual Studio에서 C/C++ 프로그램을 분석하기 위해 컴파일러에서 생성된 정적 어셈블리 목록또는 VS 디버그 디스어셈블러를 사용하여 동적 실행을 사용할 수 있습니다.