В C++, я плачу за то, что я не ем? [дубликат]



этот вопрос уже есть ответ здесь:




  • Включение iostream приводит к различным двоичным

    2 ответы



давайте рассмотрим следующие примеры hello world в C и c++:



main.c



#include <stdio.h>

int main()
{
printf("Hello worldn");
return 0;
}


main.cpp



#include <iostream>

int main()
{
std::cout<<"Hello world"<<std::endl;
return 0;
}


когда я компилирую их в godbolt для сборки, размер кода C составляет всего 9 строк (gcc -O3):



.LC0:
.string "Hello world"
main:
sub rsp, 8
mov edi, OFFSET FLAT:.LC0
call puts
xor eax, eax
add rsp, 8
ret


но размер кода C++ составляет 22 строки (g++ -O3):



.LC0:
.string "Hello world"
main:
sub rsp, 8
mov edx, 11
mov esi, OFFSET FLAT:.LC0
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
xor eax, eax
add rsp, 8
ret
_GLOBAL__sub_I_main:
sub rsp, 8
mov edi, OFFSET FLAT:_ZStL8__ioinit
call std::ios_base::Init::Init() [complete object constructor]
mov edx, OFFSET FLAT:__dso_handle
mov esi, OFFSET FLAT:_ZStL8__ioinit
mov edi, OFFSET FLAT:_ZNSt8ios_base4InitD1Ev
add rsp, 8
jmp __cxa_atexit


...который намного больше.



известно, что в C++ вы платите за то, что едите. Итак, в этом случае, за что я плачу?

336   0  
c

Comments

    Ничего не найдено.