동일한 코드를 사용하는 경우 컴파일러를 C 컴파일러에서 C ++ 컴파일러로 변경하면 할당되는 메모리 양이 변경됩니다. 왜 이것이 더 많은지 잘 모르겠습니다. 지금까지 내가 얻은 최고의 응답은 "아마도 I / O 스트림"입니다. 이는 매우 설명 적이 지 않으며 C ++의 "사용하지 않는 것에 대해 비용을 지불하지 않습니다"에 대해 궁금해합니다.
Clang 및 GCC 컴파일러 버전 7.0.1-8 및 8.3.0-6을 각각 사용하고 있습니다. 내 시스템은 최신 데비안 10 (버스터)에서 실행되고 있습니다. 벤치 마크는 Valgrind Massif를 통해 이루어집니다.
#include <stdio.h>
int main() {
printf("Hello, world!\n");
return 0;
}
사용 된 코드는 변경되지 않지만 C 또는 C ++로 컴파일하든 Valgrind 벤치 마크의 결과가 변경됩니다. 그러나 값은 컴파일러에서 일관성을 유지합니다. 프로그램의 런타임 할당 (피크)은 다음과 같습니다.
- GCC (C) : 1,032 바이트 (1KB)
- G ++ (C ++) : 73,744 바이트, (~ 74KB)
- 클랑 (C) : 1,032 바이트 (1KB)
- Clang ++ (C ++) : 73,744 바이트 (~ 74KB)
컴파일을 위해 다음 명령을 사용합니다.
clang -O3 -o c-clang ./main.c
gcc -O3 -o c-gcc ./main.c
clang++ -O3 -o cpp-clang ./main.cpp
g++ -O3 -o cpp-gcc ./main.cpp
Valgrind의 경우 valgrind --tool=massif --massif-out-file=m_compiler_lang ./compiler-lang
각 컴파일러와 언어를 실행 한 다음 ms_print
피크를 표시했습니다.
내가 여기서 잘못하고 있습니까?
try
더 큰 메모리 풋 프린트 (예 : 점프 테이블 또는 무언가)를 희생 하여 블록 을 입력 할 때 성능에 영향을 미치지 않는 예외 모델을 가져야합니다 . 예외없이 컴파일을 시도하고 그 영향을 확인하십시오. 편집 : 실제로, 다양한 c ++ 기능을 비활성화하여 메모리 풋 프린트에 어떤 영향을 미치는지 확인하십시오.
clang++ -xc
대신에 컴파일 할 때 clang
동일한 할당이 있었는데, 이는 연결된 라이브러리로 인한 것이 좋습니다
C
모드에서 정확히 동일한 바이트 수와 정확히 동일한 바이트 수 모드를 생성하는 것으로 의심 C++
됩니다. 전사 오류가 발생 했습니까?